日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

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

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 的哈希表與其相似,這里不再贅述。

命令匯總

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


網(wǎng)頁(yè)標(biāo)題:Redisset集合
鏈接分享:http://m.5511xx.com/article/cdeipid.html