Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。
Redis 中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。
Set常用操作
SADD key member [member ...]//往集合key中存入元素,元素存在則忽略,若key不存在則新建
SREM key member [member ...]//從集合key中刪除元素
SMEMBERS key //獲取集合key中所有元素
SCARD key//獲取集合key的元素個(gè)數(shù)
SISMEMBER key member//判斷member元素是否存在于集合key中
SRANDMEMBER key [count]//從集合key中選出count個(gè)元素,元素不從key中刪除
SPOP key [count]//從集合key中選出count個(gè)元素,元素從key中刪除
Set 運(yùn)算操作
SINTER key [key ...] //交集運(yùn)算
SINTERSTORE destination key [key ..]//將交集結(jié)果存入新集合destination中
SUNION key [key ..] //并集運(yùn)算
SUNIONSTORE destination key [key ...]//將并集結(jié)果存入新集合destination中
SDIFF key [key ...] //差集運(yùn)算
SDIFFSTORE destination key [key ...]//將差集結(jié)果存入新集合destination中
應(yīng)用場(chǎng)景
1、抽獎(jiǎng)程序
想必大家都用過微信里的抽獎(jiǎng)小程序吧,如下圖,我們可以點(diǎn)擊立即參與進(jìn)行抽獎(jiǎng),還可以查看所有參與人員,最后就是開獎(jiǎng)的功能,一共三個(gè)關(guān)鍵點(diǎn)
我們看一下這三個(gè)關(guān)鍵點(diǎn)用set數(shù)據(jù)類型怎么實(shí)現(xiàn):
1) 點(diǎn)擊參與抽獎(jiǎng),則將用戶id用戶加入集合
SADD key {userlD}
2)查看參與抽獎(jiǎng)所有用戶
SMEMBERS key
3)抽取count名中獎(jiǎng)?wù)?/p>
SRANDMEMBER key [count]//返回但不從set中剔除
SPOP key [count]//返回并剔除
如果設(shè)置了一等獎(jiǎng)二等獎(jiǎng)三等獎(jiǎng)...,并且每人只能得一種,則可以用SPOP key count

2、微信微博點(diǎn)贊,收藏,標(biāo)簽
比如你發(fā)了一條朋友圈有人點(diǎn)贊
- 點(diǎn)贊 點(diǎn)贊就把點(diǎn)贊這個(gè)人的ID加到這個(gè)點(diǎn)贊的集合中
SADD like:{消息ID} {用戶ID}
- 取消點(diǎn)贊 從集合中移除用戶ID
SREM like:{消息ID} {用戶ID}
- 檢查用戶是否點(diǎn)過贊
SISMEMBER like:{消息ID} {用戶ID}
- 獲取點(diǎn)贊的用戶列表
SMEMBERS like:{消息ID}
- 獲取點(diǎn)贊用戶數(shù)
SCARD like:{消息ID}

Set集合運(yùn)算操作的應(yīng)用場(chǎng)景
基于Redis set集合提供的豐富的命令,我們可以對(duì)集合輕松的實(shí)現(xiàn)交并差的運(yùn)算。例如,現(xiàn)有集合set1,set12,set3,元素如下:
set1:{a,b,c}
set2:{a,c,e}
set3:{c,d,f}
對(duì)集合進(jìn)行交、并、差的運(yùn)算
SINTER set1 set2 set3 //交集--> { c }
SUNION set1 set2 set3 //并集--> { a,b,c,d,e,f }
SDIFF set1 set2 set3 //差集--> { b }
通過這些基本操作我們看可以實(shí)現(xiàn)什么樣的業(yè)務(wù)需求。