新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redisset集合
Redis set (集合)遵循無序排列的規(guī)則,集合中的每一個成員(也就是元素,叫法不同而已)都是字符串類型,并且不可重復。Redis set 是通過哈希映射表實現(xiàn)的,所以它的添加、刪除、查找操作的時間復雜度為 O(1)。集合中最多可容納 2^32 - 1 個成員(40 多億個)。

Redis set 使用以下方式向集合中添加一個成員,語法格式如下:
127.0.0.1:6379> SADD key member [member ...]
- key:指定一個鍵
- member:集合中要存儲的成員。
和其他數(shù)據(jù)類型一樣,當集合中最后一個成員被刪除時,存儲成員所用的數(shù)據(jù)結構也會被自動刪除。
集合有一個非常重要的特性就是“自動去重”,這使得它可以適用于許多場景,比如過濾掉已中獎用戶的 id,保證該用戶不會被第二次抽中。
認識set集合
1) intset
Redis set 采用了兩種方式相結合的
底層存儲結構,分別是 intset(整型數(shù)組)與 hash table(哈希表),當 set 存儲的數(shù)據(jù)滿足以下要求時,使用 intset 結構:
- 集合內保存的所有成員都是整數(shù)值;
- 集合內保存的成員數(shù)量不超過 512 個。
當不滿足上述要求時,則使用 hash table 結構。
Redis 中 intset 的結構體定義如下:
typedf struct inset{
uint32_t encoding;//指定編碼方式,默認為INSET_ENC_INT16
uint32_t length;//集合內成員的總個數(shù)
int8_t contents[];//實際存儲成員的數(shù)組,并且數(shù)組中的數(shù)值從小到大依次排列
}inset;
- encoding:用來指定編碼格式,共有三種,分別是 INTSET_ENC_INT16、INSET_ENC_INT32 和 INSET_ENC_INT64,它們對應不同的數(shù)值范圍。Redis 為了盡可能地節(jié)省內存,它會根據(jù)插入數(shù)據(jù)的大小來選擇不同的編碼格式。
- length:集合內成員的數(shù)量,記錄 contents 數(shù)組中共有多少個成員。
- contents:存儲成員的數(shù)組,數(shù)組中的成員從小到大依次排列,且不允許重復。
intset 結構示意圖如下所示:
在《Redis hash哈希散列(圖解)》一節(jié),我們已經(jīng)對哈希表原理做了講解, set 的哈希表與其相似,這里不再贅述。
命令匯總
| 命令 | 說明 |
|---|---|
| SADD key member1 [member2] | 向集合中添加一個或者多個元素,并且自動去重。 |
| SCARD key | 返回集合中元素的個數(shù)。 |
| SDIFF key1 [key2] | 求兩個或多個集合的差集。 |
| SDIFFSTORE destination key1 [key2] | 求兩個集合或多個集合的差集,并將結果保存到指定的集合中。 |
| SINTER key1 [key2] | 求兩個或多個集合的交集。 |
| SINTERSTORE destination key1 [key2] | 求兩個或多個集合的交集,并將結果保存到指定的集合中。 |
| SISMEMBER key member | 查看指定元素是否存在于集合中。 |
| SMEMBERS key | 查看集合中所有元素。 |
| SMOVE source destination member | 將集合中的元素移動到指定的集合中。 |
| SPOP key [count] | 彈出指定數(shù)量的元素。 |
| SRANDMEMBER key [count] | 隨機從集合中返回指定數(shù)量的元素,默認返回 1個。 |
| SREM key member1 [member2] | 刪除一個或者多個元素,若元素不存在則自動忽略。 |
| SUNION key1 [key2] | 求兩個或者多個集合的并集。 |
| SUNIONSTORE destination key1 [key2] | 求兩個或者多個集合的并集,并將結果保存到指定的集合中。 |
| SSCAN key cursor [match pattern] [count count] | 該命令用來迭代的集合中的元素。 |
命令演示
Redis 集合有特定的應用場景,比如用戶的共同關注場景就可以使用 set 來實現(xiàn)。下面看一組示例,其中 user:1 與 user:2 代表兩個用戶,他們都關注了一些編程課程:
#創(chuàng)建集合并添加多個成員 127.0.0.1:6379> SADD user:1 python java mysql (integer) 3 127.0.0.1:6379> SADD user:2 python c redis (integer) 3 #對兩個集合求交集,求出他們共同關注的編程技術 127.0.0.1:6379> SINTER user:1 user:2 1) "python" #兩個集合求并集 127.0.0.1:6379> SUNION user:1 user:2 1) "java" 2) "python" 3) "mysql" 4) "redis" 5) "c" #查看集合所有成員 127.0.0.1:6379> SMEMBERS user:1 1) "mysql" 2) "java" 3) "python" #兩個集合求并集,并把結果保存到另外一個user:3集合中 127.0.0.1:6379> SUNIONSTORE user:3 user:1 user:2 (integer) 5 #查看集合所有成員 127.0.0.1:6379> SMEMBERS user:3 1) "java" 2) "python" 3) "mysql" 4) "redis" 5) "c" #從集合中彈出一個元素 127.0.0.1:6379> SPOP user:1 1 1) "python" #從集合中彈出兩個元素 127.0.0.1:6379> SPOP user:1 2 1) "mysql" 2) "java" #查看集合元素個數(shù) 127.0.0.1:6379> SCARD user:2 (integer) 3 #迭代集合中元素 127.0.0.1:6379> SSCAN user:3 0 1) "0" 2) 1) "mysql" 2) "redis" 3) "java" 4) "python" 5) "c"
在線練習工具:https://try.redis.io/
查看更多命令:https://redis.io/commands
當前文章:Redisset集合
本文路徑:http://www.dlmjj.cn/article/cdeipid.html


咨詢
建站咨詢
