1、概述
- Redis set 对外提供的功能与 list 类似,是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
- Redis 的 Set 是 string 类型的无序集合。它底层其实是一个 value 为 null 的 hash 表,所以添加,删除,查找的时空复杂度都是 O (1)。
- 一个算法,随着数据的增加,执行时间的长短,如果是 O (1),数据增加,查找数据的时间不变。
2、相关操作
- sadd key member1 [member2…]-------------向集合添加一个或多个元素,返回成功添加个数
- scard key--------------获取集合的元素个数
- smembers key------------返回集合所有元素
- srandmember key [count]--------------返回集合中一个或多个随机数
- sscan key cursor[MATCH pattern] [COUNT count]-------------迭代集合中的元素
- sismember key member---------------判断member元素是否在集合key中,返回integer,1-存在,0-不存在
- sdiff key1 [key2…]---------------返回给定所有集合差集,如果只给一个key将列出所有集合元素
- sdiffstore destination key1 [key2…]-------------返回给定所有集合差集,并将差集存储在destination中
- sinter key1 [key2…]-------------返回给定所有集合交集
- sinterstore distination key1 [key2…]----------------返回给定所有集合交集,并将交集存储在destination中
- sunion key1 [key2…]---------------返回所有给定集合的并集
- sunionstore destination key1 [key2…]-------------------返回给定所有集合并集,并将并集存储在destination中
- srem key member1 [member2…]-------------移除集合中一个或多个元素,返回移除成功个数
- spop key---------------返回并移除集合中的一个随机元素
3、数据结构
- Set 数据结构是 dict 字典,字典是用哈希表实现的。
- Java 中 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。Redis 的 set 结构也是一样,它的内部也使用 hash 结构,所有的 value 都指向同一个内部值。