閱讀679 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Redis官方文檔》Data types—數據類型

String類型(字符串類型)

String 是Redis中最基本的類型。Redis中的String 類型是二進製安全的,也就是說在Redis中String類型可以包含各種數據,比如一張JPEG圖片或者是一個序列化的Ruby對象。一個String類型的值最大長度可以是512M。

在Redis中String有很多有趣的用法,比如:

  • 把String當做原子計數器,這可以使用INCR家族中的命令來實現:INCRDECRINCRBY
  • 使用APPEND命令來給一個String追加內容。
  • 把String當做一個隨機訪問的向量(Vector),這可以使用GETRANGE和 SETRANGE命令來實現
  • 使用GETBIT 和SETBIT方法,在一個很小的空間中編碼大量的數據,或者創建一個基於Redis的Bloom Filter 算法。

查看String類型可用命令來獲得更多信息,或者閱讀Redis數據類型介紹一章。

 

Lists類型(列表類型)

Redis的列表類型中存儲一係列String值,這些String按照插入的順序排序。Redis的List可以從頭部(左側)加入元素,也可以從尾部(右側)加入元素。

LPUSH 命令是在頭部加入一個新元素,RPUSH 命令是在尾部加入一個新元素。當在一個空的鍵值(key)上執行這些操作時會創建一個新的列表。類似的,當一個操作清空了一個list時,這個list對應的key會被刪除。這非常好理解,因為從命令的名字就可以看出這個命令是做什麼操作的。如果使用一個不存在的key調用的話就會使用一個空的list。

一些例子:

1 LPUSH mylist a   # 現在list是 "a"
2 LPUSH mylist b   # 現在list是"b","a"
3 RPUSH mylist c   # 現在list是 "b","a","c" (注意這次使用的是 RPUSH)

list的最大長度是2^32 – 1個元素(4294967295,一個list中可以有多達40多億個元素)

從時間複雜度的角度來看,Redis list類型的最大特性是:即使是在list的頭端或者尾端做百萬次的插入和刪除操作,也能保持穩定的很少的時間消耗。在list的兩端訪問元素是非常快的,但是如果要訪問一個很大的list中的中間部分的元素就會比較慢了,時間複雜度是O(N)。

Redis的Lists類型有很多有趣的用法,比如:

  • 在社交網絡中使用List進行時間表建模,使用LPUSH命令在用戶時間線中加入新的元素,然後使用LRANGE 命令來獲得最近加入的元素。
  • 可以把LPUSH 和LTRIM 命令結合使用來實現定長的列表,列表中隻保存最近的N個元素
  • 在創建後台運行的工作時,Lists可以作為消息傳遞原語,例如著名的Ruby庫 Resque
  • 還有很多可以使用lists來做的事,這種數據類型支持很多命令,包括像BLPOP這樣的阻塞命令

請查看lists類型可用命令來獲得更多的信息,或者閱讀Redis數據類型介紹一章

Sets類型(集合類型)

Redis的Sets類型是String的無序集合。增加,刪除,測試元素是否存在的時間複雜度都是O(1)(不管集合中有多少元素都是穩定的時間消耗)

Redis Sets的一個重要特性是不允許重複元素。向集合中添加多次相同的元素,集合中隻存在一個該元素。在實際應用中,這意味著在添加一個元素前不需要先檢查元素是否存在。

關於Redis Sets一個非常有意思的事情是,它們支持多個服務器端命令來從現有集合開始計算集合,所以執行集合的交集,並集,差集都可以很快。

set的最大長度是2^32 – 1個元素(4294967295,一個set中可以有多達40多億個元素)

Redis Sets有很多有趣的用法,比如:

  • 你可以使用Redis Sets來記錄唯一的事物,比如,你想知道訪問某個博客的IP地址,不要重複的IP,這種情況隻需要在每次處理一個請求時簡單的使用SADD命令就可以了,可以確信不會插入重複的IP.
  • Redis Sets 可以很好的表示關係。你可以使用Redis創建一個標簽係統,每個標簽使用一個Set來表示。然後你可以使用SADD 命令把具有特定標簽的所有對象的所有ID放在表示這個標簽的Set中。如果你想要知道同時擁有三個不同標簽的對象,那麼使用SINTER命令就好了。
  • 你可以使用SPOP 或者 SRANDMEMBER 命令從集合中隨機的提取元素。

查看Set可用命令獲得更多信息,或者閱讀Redis數據類型介紹一章

Hashes哈希類型

Redis Hashes 保存String域和String值之間的映射,所以它們是用來表示對象的絕佳數據類型(比如一個有著用戶名,密碼等屬性的User對象):

1 @cli
2  HMSET user:1000 username antirez password P1pp0 age 34
3  HGETALL user:1000
4  HSET user:1000 password 12345
5  HGETALL user:1000

一個有著少量數據域(這裏的少量大概100上下)的hash,其存儲方式占用很小的空間,所以在一個小的Redis實例中就可以存儲上百萬的這種對象。

雖然Hashes主要用於表示對象,他們可以存儲很多的元素,所以你可以使用Hashes來做許多其他的工作。

Hash的最大長度是2^32 – 1個域值對(4294967295,一個Hash中可以有多達40多億個域值對)

查看Hash類型可用命令來獲得更多信息,或者閱讀Redis數據類型介紹一章

Sorted sets 類型(有序集合類型)

Redis有序集合類型與Redis的集合類型類似,是非重複的String元素的集合。不同之處在於,有序集合中的每個成員都關聯一個Score,Score是在排序時候使用的,按照Score的值從小到大進行排序。集合中每個元素是唯一的,但Score有可能重複。

使用有序集合可以很高效的進行,添加,移除,更新元素的操作(時間消耗與元素個數的對數成比例)。由於元素在集合中的位置是有序的,使用get ranges by score或者by rank(位置)來順序獲取或者隨機讀取效率都很高。(本句不確定,未完全理解原文意思,是根據自己對Redis的淺顯理解進行的翻譯)訪問有序集合中間部分的元素也非常快,所以可以把有序集合當做一個不允許重複元素的智能列表,你可以快速訪問需要的一切:獲取有序元素,快速存在測試,快速訪問中間的元素等等。

簡短來說,使用有序集合可以實現很多高性能的工作,這一點在其他數據庫是很難實現的。

使用有序集合你可以:

  • 在大型在線遊戲中創建一個排行榜,每次有新的成績提交,使用ZADD命令加入到有序集合中。可以使用ZRANGE命令輕鬆獲得成績名列前茅的玩家,你也可以使用ZRANK根據一個用戶名獲得該用戶的分數排名。把ZRANK 和 ZRANGE結合使用你可以獲得與某個指定用戶分數接近的其他用戶。這些操作都很高效。
  • 有序集合經常被用來索引存儲在Redis中的數據。比如,如果你有很多用戶,用Hash來表示,可以使用有序集合來為這些用戶創建索引,使用年齡作為Score,使用用戶的ID作為Value,這樣的話使用ZRANGEBYSCORE 命令可以輕鬆和快速的獲得某一年齡段的用戶。

有序集合可能是Redis中最高級的數據類型了,所以請花一些時間查看一下 有序集合命令列表 來獲得更多信息,同時你可能也想閱讀Redis數據類型介紹

Bitmaps and HyperLogLogs類型(位圖類型和HyperLogLogs類型)

Redis 也支持位圖類型和HyperLogLogs 類型,他們是在String基本類型基礎上建立的類型,但有自己的語義。

請參考Redis數據類型介紹 獲得這些類型的信息。

最後更新:2017-05-22 10:03:35

  上一篇:go  《Redis官方文檔》 Pipelining – 請求應答模式和往返延時
  下一篇:go  帝國cms 7.2 版本 使用465端口發郵件 教程