Redis数据类型之Set

一、Redis五种数据类型

Redis数据类型之Set_第1张图片
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2的32次方-1 (4294967295, 每个集合可存储40多亿个成员)。
类似于JAVA中的 Hashtable集合

redis的集合对象set的底层存储结构特别神奇,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。
intset内部其实是一个数组(int8_t coentents[]数组),而且存储数据的时候是有序的,因为在查找数据的时候是通过二分查找来实现的。

一、Set结构

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中删除

2.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中

Redis数据类型之Set_第2张图片

二、Set应用场景

1.微信抽奖小程序
Redis数据类型之Set_第3张图片
(1)点击参与抽奖加入集合
SADD key {userID}
(2)查看参与抽奖用户
SMEMBERS key
(3)抽取count名中将者
SRANDMEMBER key [count] / SPOP key [count]
例如:
1.抽取5个中奖用户
Redis数据类型之Set_第4张图片
2.抽取3个三等奖,2个二等奖,一个一等奖
Redis数据类型之Set_第5张图片

2.微信微博的点赞收藏
Redis数据类型之Set_第6张图片
(1)点赞
SADD like:{消息ID} {用户ID}
(2)取消点赞
SREM like:{消息ID} {用户ID}
(3)检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
(4)获取点赞的用户列表
SMEMBER like:{消息ID}
(5)获取点赞用户数
SCARD like:{消息ID}
3.集合操作实现微博微信关注模型
Redis数据类型之Set_第7张图片
例如:
(1)A用户关注的人:
Aset–>{B用户,C用户,D用户}
(2)B用户关注的人:
Bset–>{A用户,C用户,D用户,G用户}
(3)C用户关注的人:
Cset–>{A用户,B用户,G用户,D用户,H用户}
(4)xxx用户关注的人:
。。。。。
(5)A与B共同关注的人:
SINTER Aset Bset -->{C用户,D用户}
(6)A用户关注的人是否也关注B用户
SISMEMBER Cset B用户
SISMEMBER Dset B用户
(7) A用户可能认识的人(求差集):
SDIFF Bset Aset -->{A用户,G用户}

你可能感兴趣的:(Redis,redis)