![3be38aec19d71572dd6e85b46e377a16.png](https://img-blog.csdnimg.cn/img_convert/3be38aec19d71572dd6e85b46e377a16.png)
本文我们要剖析的基本类型是Set,下面我们将深入源码剖析Redis中Set的实现。
存储类型:String 类型的无序集合,最大存储数量 2^32-1(40 亿左右)。
如图所示:
![4d78aa1f104d65b4e5805c4fd1c2619f.png](https://img-blog.csdnimg.cn/img_convert/4d78aa1f104d65b4e5805c4fd1c2619f.png)
操作命令
添加一个或者多个元素
sadd myset a b c d e f g
获取所有元素
smembers myset
统计元素个数
scard myset
随机获取一个元素
srandmember key
随机弹出一个元素
spop myset
移除一个或者多个元素
srem myset d e f
查看元素是否存在
sismember myset a
存储( 实现) 原理
Redis 用 intset 或 hashtable 存储 set。如果元素都是整数类型,就用 inset 存储。
如果不是整数类型,就用 hashtable(数组+链表的存来储结构)。
相关hashtable的源码分析,在前面已经分析过了,在此就不重复了。
问题:KV 怎么存储 set 的元素?key 就是元素的值,value 为 null。
如果整数类型元素个数超过 512 个,也会用 hashtable 存储。
配置文件 redis.conf 中配置属性如下
![4cd5cac054756797499a30970d5ae281.png](https://img-blog.csdnimg.cn/img_convert/4cd5cac054756797499a30970d5ae281.png)
![51b8d89165111cdf23e5852bb570e694.png](https://img-blog.csdnimg.cn/img_convert/51b8d89165111cdf23e5852bb570e694.png)
应用场景
抽奖
随机获取元素
spop myset
点赞、 签到、 打卡
![86710fa588f08da86e6168790cf86141.png](https://img-blog.csdnimg.cn/img_convert/86710fa588f08da86e6168790cf86141.png)
这条微博的 ID 是 t1001,用户 ID 是 u3001。
用 like:t1001 来维护 t1001 这条微博的所有点赞用户。
点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001 u3001
点赞的所有用户:smembers like:t1001
点赞数:scard like:t1001
比关系型数据库简单许多。
商品标签
用 tags:i5001 来维护商品所有的标签。
![217fedeab89f97d58e4b008022274f51.png](https://img-blog.csdnimg.cn/img_convert/217fedeab89f97d58e4b008022274f51.png)
sadd tags:i5001 画面清晰细腻
sadd tags:i5001 真彩清晰显示屏
sadd tags:i5001 流畅至极
商品筛选
获取差集
sdiff set1 set2
获取交集(intersection )
sinter set1 set2
获取并集
sunion set1 set2
![c529e3ee1eab32875da0936f123471a3.png](https://img-blog.csdnimg.cn/img_convert/c529e3ee1eab32875da0936f123471a3.png)
iPhone11 上市了。
sadd brand:apple iPhone11
sadd brand:ios iPhone11
sad screensize:6.0-6.24 iPhone11
sad screentype:lcd iPhone11
筛选商品,苹果的,iOS 的,屏幕在 6.0-6.24 之间的,屏幕材质是 LCD 屏幕
sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd