- 提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的
- 提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的
- Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
常用命令
- 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
sadd <key> <value1> <value2> .....

smembers <key>
- 判断集合<key>是否为含有该<value>值,有1,没有0
sismember <key> <value>
scard <key>
srem <key> <value1> <value2> ....
spop <key>
srandmember <key> <n>
smove <source> <destination> value

sinter <key1> <key2>#redis7新加命令,显示交集结果的个数
sintercard numkey key1 key2 limit n
sunion <key1> <key2>
- 返回两个集合的差集元素(key1中的,不包含key2中的)
sdiff <key1> <key2>
数据结构
- Set数据结构是dict字典,字典是用哈希表实现的
- Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象
- Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值
应用场景
sadd key 用户ID #添加抽奖人员
SCARD key #显示抽奖人数
SRANDMEMBER key 2 #随机抽奖2个人,元素不删除
SPOP key 3 #随机抽奖3个人,元素删除
sadd pub:msgID 点赞用户ID1 点赞用户ID2 #新增点赞
srem pub:msgID 点赞用户ID #取消点赞
SMEMBERS pub:msgID #显示点赞人员
scard pub:msgID #显示点赞人数
SISMEMBER pub:msgID 用户ID 判断人员是否有点赞过