Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
Set常用操作
SADD key member [member ...]//往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member ...]//从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key//获取集合key的元素个数
SISMEMBER key member//判断member元素是否存在于集合key中
SRANDMEMBER key [count]//从集合key中选出count个元素,元素不从key中删除
SPOP key [count]//从集合key中选出count个元素,元素从key中删除
Set 运算操作
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ..]//将交集结果存入新集合destination中
SUNION key [key ..] //并集运算
SUNIONSTORE destination key [key ...]//将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...]//将差集结果存入新集合destination中
应用场景
1、抽奖程序
想必大家都用过微信里的抽奖小程序吧,如下图,我们可以点击立即参与进行抽奖,还可以查看所有参与人员,最后就是开奖的功能,一共三个关键点
我们看一下这三个关键点用set数据类型怎么实现:
1) 点击参与抽奖,则将用户id用户加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽取count名中奖者
SRANDMEMBER key [count]//返回但不从set中剔除
SPOP key [count]//返回并剔除
如果设置了一等奖二等奖三等奖…,并且每人只能得一种,则可以用SPOP key count
2、微信微博点赞,收藏,标签
比如你发了一条朋友圈有人点赞
- 点赞 点赞就把点赞这个人的ID加到这个点赞的集合中
SADD like:{消息ID} {用户ID}
2) 取消点赞 从集合中移除用户ID
SREM like:{消息ID} {用户ID}
3) 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数
SCARD like:{消息ID}
Set集合运算操作的应用场景
基于Redis set集合提供的丰富的命令,我们可以对集合轻松的实现交并差的运算。例如,现有集合set1,set12,set3,元素如下:
set1:{a,b,c}
set2:{a,c,e}
set3:{c,d,f}
对集合进行交、并、差的运算
SINTER set1 set2 set3 //交集–> { c }
SUNION set1 set2 set3 //并集–> { a,b,c,d,e,f }
SDIFF set1 set2 set3 //差集–> { b }