集合(set)類(lèi)型也是用來(lái)保存多個(gè)字符串元素的剖膳,但是和列表不一樣的是,集合中不允許有重復(fù)元素,并且集合中元素是無(wú)序的,不能通過(guò)索引下標(biāo)獲取元素蓖乘。
一個(gè)集合最多可以存儲(chǔ)2^32 - 1個(gè)元素,Redis除了支持集合的增刪改查二拐,同時(shí)還支持多個(gè)集合取交集茂翔,并集,差集涧尿。
命令:
-- 添加元素
? ? sadd key element [element...] 返回添加成功的元素個(gè)數(shù)
-- 刪除元素
? ? srem key element [element...] 返回成功刪除元素個(gè)數(shù)
-- 計(jì)算元素個(gè)數(shù)
? ? scard key?
????????scard 的時(shí)間復(fù)雜度為O(1)系奉,他不會(huì)遍歷集合所有元素,而是直接用Redis內(nèi)部的變量
-- 判斷元素是否在集合中
? ? sismember key element
-- 隨機(jī)從集合返回指定個(gè)數(shù)元素
? ? srandmember key [count]
? ? [count]可選項(xiàng)姑廉,如果不寫(xiě)默認(rèn)為1
-- 隨機(jī)從集合中彈出元素
? ? spop key
? ? Redis 3.2之后缺亮,spop 也支持[count] 參數(shù)。
? ? srandmember和spop都是隨機(jī)從集合選出元素桥言,兩者不同的是spop命令執(zhí)行后萌踱,元素會(huì)從集合中刪除,而srandmember不會(huì)号阿。
-- 獲取所有元素
? ? smembers key
? ? 注意:smembers 和 lrange并鸵、hgetall都屬于比較重的命令,元素過(guò)多扔涧,可能會(huì)阻塞Redis园担,可以用sscan來(lái)完成
集合間操作:
-- 求多個(gè)集合的交集
sinter key [key...]
-- 求多個(gè)集合的并集
sunion key [key...]
-- 求多個(gè)集合的差集
sdiff key [key...]
-- 將交集、并集枯夜、差集的結(jié)果保存
sinterstore destination key [key...]
sunionstore destination key [key...]
sdiffstore destination key [key...]
內(nèi)部編碼:
-- intset(整數(shù)集合):當(dāng)集合匯總元素都是整數(shù)且元素個(gè)數(shù)小于set-max-intset-entries配置(默認(rèn)512)時(shí)弯汰,Redis會(huì)選用intset來(lái)作為集合的內(nèi)部實(shí)現(xiàn),而減少內(nèi)存使用
-- hashtable(哈希表):當(dāng)集合類(lèi)型無(wú)法滿足intset要求的時(shí)候湖雹,Redis會(huì)使用hashtable作為集合的內(nèi)部實(shí)現(xiàn)