鍍金池/ 教程/ 大數(shù)據(jù)/ 數(shù)據(jù)類型初探
使用 Redis 實現(xiàn) Twitter(上)
集群(下)
使用 Redis 實現(xiàn) Twitter(下)
使用 Redis 作為 LRU 緩存
高可用(上)
高可用客戶端指引
集群(中)
高可用(下)
持久化
Redis 介紹
集中插入
集群(上)
從入門到精通(上)
從入門到精通(下)
從入門到精通(中)
分片
數(shù)據(jù)類型初探
復制

數(shù)據(jù)類型初探

字符串 (Strings)

字符串是 Redis 最基本的數(shù)據(jù)類型。Redis 字符串是二進制安全的,也就是說,一個 Redis 字符串可以包含任意類型的數(shù)據(jù),例如一張 JPEG 圖像,或者一個序列化的 Ruby 對象。

一個字符串最大為 512M 字節(jié)。

你可以使用 Redis 的字符串類型做很多有意思的事情,例如,你可以:

  • 使用 INCR 命令族 (INCR,DECR,INCRBY),將字符串作為原子計數(shù)器。
  • 使用 APPEND 命令追加字符串。
  • 使用 GETRANGE 和 SETRANGE 命令,使字符串作為隨機訪問向量 (vectors)。
  • 編碼大量數(shù)據(jù)到很小的空間,或者使用 GETBIT 和 SETBIT 命令,創(chuàng)建一個基于 Redis 的布隆 (Bloom) 過濾器。

后續(xù)我們會詳細介紹可用的字符串命令,也會詳細介紹 Redis 數(shù)據(jù)類型的更多高級信息。

列表 (Lists)

Redis 列表僅僅是按照插入順序排序的字符串列表??梢蕴砑右粋€元素到 Redis 列表的頭部 (左邊) 或者尾部 (右邊)。

LPUSH 命令用于插入一個元素到列表的頭部,RPUSH 命令用于插入一個元素到列表的尾部。當這兩個命令操作在一個不存在的鍵時,將會創(chuàng)建一個新的列表。同樣,如果一個操作會清空列表,那么該鍵將會從鍵空間 (key space) 移除。這些是非常方便的語義,因為列表命令如果使用不存在的鍵作為參數(shù),就會表現(xiàn)得像命令運行在一個空列表上一樣。

一些列表操作的例子結果:

LPUSH mylist a   # now the list is “a”  
LPUSH mylist b   # now the list is “b”, ”a”  
RPUSH mylist c   # now the list is “b”,”a”, ”c”(RPUSH was used this time)  

列表的最大長度是 223-1 個元素 (4294967295,超過 40 億個元素)。

從時間復雜度的角度看,Redis 列表主要的特性是支持以常量時間在列表的頭和尾附近插入和刪除元素,即使列表中已經(jīng)插入了上百萬的數(shù)據(jù)。訪問列表兩端的元素非常的快速,但是訪問一個非常大的列表的中間卻非常的慢,因為這是一個 O(N)時間復雜度的操作。

你可以使用 Redis 的列表類型做很多有意思的事情,例如,你可以:

  • 為社交網(wǎng)絡時間軸 (timeline) 建模,使用 LPUSH 命令往用戶時間軸插入元素,使用 LRANGE 命令獲得最近事項。
  • 使用 LPUSH 和 LTRIM 命令創(chuàng)建一個不會超出給定數(shù)量元素的列表,只存儲最近的 N 個元素。
  • 列表可以用作消息傳遞原語,例如,眾所周知的用于創(chuàng)建后臺任務的 Ruby 庫 Resque。
  • 你可以用列表做更多的事情,這種數(shù)據(jù)類型支持很多的命令,包括阻塞命令,如 BLPOP。

后續(xù)我們會詳細介紹可用的列表命令,也會詳細介紹 Redis 數(shù)據(jù)類型的更多高級信息。

集合 (Sets)

Redis 集合是沒有順序的字符串集合 (collection)??梢栽?O(1) 的時間復雜度添加、刪除和測試元素存在與否 (不管集合中有多少元素都是常量時間)。

Redis 集合具有你需要的不允許重復成員的性質(zhì)。多次加入同一個元素到集合也只會有一個拷貝在其中。實際上,這意味著加入一個元素到集合中并不需要檢查元素是否已存在。

Redis 集合非常有意思的是,支持很多服務器端的命令,可以在很短的時間內(nèi)和已經(jīng)存在的集合一起計算并集,交集和差集。

你可以使用 Redis 的集合類型做很多有意思的事情,例如,你可以:

  • 你可以使用 Redis 集合追蹤唯一性的事情。你想知道訪問某篇博客文章的所有唯一 IP 嗎?只要 每次頁面訪問時使用 SADD 命令就可以了。你可以放心,重復的 IP 是不會被插入進來的。
  • Redis 集合可以表示關系。你可以通過使用集合來表示每個標簽,來創(chuàng)建一個標簽系統(tǒng)。然后你可以把所有擁有此標簽的對象的 ID 通過 SADD 命令,加入到表示這個標簽的集合中。你想獲得同時擁有三個不同標簽的對象的全部 ID 嗎?用 SINTER 就可以了。
  • 你可以使用 SPOP 或 SRANDMEMBER 命令來從集合中隨機抽取元素。

后續(xù)我們會詳細介紹可用的集合命令,也會詳細介紹 Redis 數(shù)據(jù)類型的更多高級信息。

哈希 / 散列 (Hashes)

Redis 哈希是字符串字段 (field) 與字符串值之間的映射,所以是表示對象的理想數(shù)據(jù)類型 (例如:一個用戶對象有多個字段,像用戶名,姓氏,年齡等等):

@cli  
HMSET user:1000 username antirez password P1pp0 age 34  
HGETALL user:1000  
HSET user:1000 password 12345  
HGETALL user:1000  

擁有少量字段 (少量指的是大約 100) 的哈希會以占用很少存儲空間的方式存儲,所以你可以在一個很小的 Redis 實例里存儲數(shù)百萬的對象。

由于哈希主要用來表示對象,對象能存儲很多元素,所以你可以用哈希來做很多其他的事情。

每個哈??梢源鎯Χ噙_ 223-1 個字段值對 (field-value pair)(多于 40 億個)。

后續(xù)我們會詳細介紹可用的哈希命令,也會詳細介紹 Redis 數(shù)據(jù)類型的更多高級信息。

有序集合 (Sorted sets)

Redis 有序集合和 Redis 集合類似,是非重復字符串集合 (collection)。不同的是,每一個有序集合的成員都有一個關聯(lián)的分數(shù) (score),用于按照分數(shù)高低排序。盡管成員是唯一的,但是分數(shù)是可以重復的。

對有序集合我們可以通過很快速的方式添加,刪除和更新元素 (在和元素數(shù)量的對數(shù)成正比的時間內(nèi))。由于元素是有序的而無需事后排序,你可以通過分數(shù)或者排名 (位置) 很快地來獲取一個范圍內(nèi)的元素。訪問有序集合的中間元素也是很快的,所以你可以使用有序集合作為一個無重復元素,快速訪問你想要的一切的聰明列表:有序的元素,快速的存在性測試,快速的訪問中間元素!

總之,有序集合可以在很好的性能下,做很多別的數(shù)據(jù)庫無法模擬的事情。

使用有序集合你可以:

例如多人在線游戲排行榜,每次提交一個新的分數(shù),你就使用 ZADD 命令更新。你可以很容易地使用 ZRANGE 命令獲取前幾名用戶,你也可以用 ZRANK 命令,通過給定用戶名返回其排行。同時使用 ZRANK 和 ZRANGE 命令可以展示與給定用戶相似的用戶及其分數(shù)。以上這些操作都非常的快。

有序集合常用來索引存儲在 Redis 內(nèi)的數(shù)據(jù)。例如,假設你有很多表示用戶的哈希,你可以使用有序集合,用年齡作為元素的分數(shù),用用戶 ID 作為元素值,于是你就可以使用 ZRANGEBYSCORE 命令很快且輕而易舉地檢索出給定年齡區(qū)間的所有用戶了。

有序集合或許是最高級的 Redis 數(shù)據(jù)類型,后續(xù)我們會詳細介紹可用的有序集合命令,也會詳細介紹 Redis 數(shù)據(jù)類型的更多高級信息。

位圖 (Bitmaps) 和超重對數(shù) (HyperLogLogs)

Redis 還支持位圖和超重對數(shù)這兩種基于字符串基本類型,但有自己語義的數(shù)據(jù)類型。

后續(xù)我們會詳細介紹這些數(shù)據(jù)類型的更多高級信息。