新聞中心

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


咨詢
建站咨詢
