《Redis官方文檔》Data types—數據類型
String類型(字符串類型)
String 是Redis中最基本的類型。Redis中的String 類型是二進製安全的,也就是說在Redis中String類型可以包含各種數據,比如一張JPEG圖片或者是一個序列化的Ruby對象。一個String類型的值最大長度可以是512M。
在Redis中String有很多有趣的用法,比如:
查看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