Redis最為常用的數據類型
- 字符串(String)
- 字符串列表(list)
- 字符串集合(set)
- 哈希(hash)
- 有序的字符串集合(sorted set)
String(字符串)
字符串是最基本的一種Redis值。Redis字符串是二進制安全的,這意味着Redis字符串可以包含任何類型的數據,例如JPEG圖像或序列化的Ruby對象。字符串的長度可以是最大512MB。
可以用Redis中的字符串做一些有趣的事情,例如:
- 將字符串用作原子計數器,使用INCR系列中的命令:INCR、DECR、INCRBY。
- 使用Append命令向字符串追加。
- 使用字符串作為帶有GETRANGE和SETRANGE的隨機訪問向量。
- 在小空間中編碼大量數據,或者使用GETBIT和SETBIT創建Redis支持的Bloom過濾器。
List(字符串列表)
Redis列表是簡單的字符串列表,按插入順序排序。可以將元素添加到Redis列表中,在列表的頭部(左側)或尾部(右側)添加新元素。LPUSH命令在頭部插入一個新元素,而RPUSH在尾部插入一個新元素。當對空鍵執行其中一個操作時,將創建一個新列表。類似地,如果列表操作將清空列表,則從鍵空間中刪除該鍵。這些都是非常方便的語義,因為如果使用不存在的鍵作為參數進行調用,那么所有列表命令的行為都與使用空列表調用它們時的行為完全相同。
列表操作和結果列表的一些示例:
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命令)
列表的最大長度是2^32 - 1個元素(4294967295,每個列表可以包含超過40億個元素)。從時間復雜性的角度來看,Redis列表的主要特性是支持在頭和尾附近不斷地插入和刪除元素,即使插入了數百萬元素。訪問元素在列表的極端位置非常快,但是如果你試圖訪問一個非常大的列表的中間位置,則速度會很慢,因為這是一個O(N)操作。
可以用Redis中的字符串做一些有趣的事情,例如:
- 為社交網絡中的時間軸建模,使用LPUSH在用戶時間線上添加新元素,使用LRANGE檢索最近插入的一些項。
- 可以使用LPUSH和LTRIM一起創建一個列表,該列表的元素數量不會超過給定的元素數量,但是只記住最新的N個元素。
- 列表可以用作消息傳遞原語,例如用於創建后台作業的著名Resque Ruby庫。
- 可以使用列表做更多的事情,這種數據類型支持許多命令,包括像BLPOP這樣的阻塞命令。
Set(集合)
Redis集合是字符串的無序集合。可以在O(1)中添加、刪除和測試成員的存在性(無論集合中包含多少元素,時間都是常量)。Redis集具有不允許重復成員的理想屬性。多次添加相同的元素將導致一個集合具有此元素的單一副本。實際上,這意味着添加成員不需要檢查是否存在,然后添加操作。關於Redis集合,它們支持從現有集合開始計算集合的許多服務器端命令,因此可以在很短的時間內完成集合的並集、交集和差異。一個集合的最大成員數是2^32 - 1(4294967295,每個集合的成員數超過40億)。
可以用Redis集合做很多有趣的事情,例如:
- 可以使用Redis集跟蹤唯一的東西。想知道訪問給定博客文章的所有唯一IP地址嗎?每次處理頁面視圖時只需使用SADD即可。不用擔心重復ip問題,因為集合會自動過濾。
- Redis集合很好地表示關系。可以使用Redis創建一個標記系統,使用一個集合來表示每個標記。然后,可以使用SADD命令將具有給定標記的所有對象的所有id添加到表示該特定標記的集合中。也可以使用SINTER命令返回交集成員集合。
- 可以使用集合使用SPOP或SRANDMEMBER命令隨機提取元素。
Hash(哈希)
Redis散列是字符串字段和字符串值之間的映射,因此它們是表示對象的最佳數據類型(例如,具有多個字段(如name、姓氏、年齡等)的用戶):
@cli
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000
- 帶有幾個字段的散列(其中幾個字段的意思是最多100個左右)以一種占用很少空間的方式存儲,因此可以在一個小型Redis實例中存儲數百萬個對象。
- 雖然散列主要用於表示對象,但它們能夠存儲許多元素,因此你也可以將散列用於許多其他任務。
- 每個散列最多可以存儲2^32 1個字段值對(超過40億)。
Sorted-set(有序的set集合)
與Redis集合類似,Redis排序集是字符串的非重復集合。不同之處在於,排序集的每個成員都與分數相關,分數是用來對排序集進行排序的,從最小的分數到最大的分數。雖然成員是唯一的,分數可以重復。使用排序的集合,可以以一種非常快的方式(在與元素數量的對數成比例的時間內)添加、刪除或更新元素。可以非常快速地按分數或按級別(位置)獲取范圍。訪問排序集的中間也非常快,所以可以使用排序集作為一個非重復元素的智能列表,在其中你可以快速訪問所需的一切:元素順序,快速存在測試,快速訪問中間元素!簡而言之,使用排序集,你可以完成許多性能優異的任務,這些任務在其他類型的數據庫中很難建模。
有了排序集,你可以:
- 在一款大型在線游戲中,你可以選擇一個排行榜,每當有新的分數被提交時,你就可以使用ZADD進行更新。可以輕松地使用ZRANGE獲取頂級用戶,還可以在給定用戶名的情況下,使用ZRANK返回其在列表中的排名。同時使用ZRANK和ZRANGE,可以向用戶顯示與給定用戶類似的分數。這些操作都非常快。
- 排序集通常用於索引存儲在Redis中的數據。例如,如果有許多表示用戶的散列,那么可以使用一個已排序的集合,其中的元素以用戶的年齡為得分,以用戶的ID為值。因此,使用ZRANGEBYSCORE檢索給定時間間隔的所有用戶既簡單又快速。
- 排序集可能是最先進的Redis數據類型,所以花點時間檢查排序集命令的完整列表,以發現可以使用Redis做什么!