- 集合中的元素不重复
- 无序, 不能通过下标获取元素
- 最多可以存储 2 - 1 个元素
- 处理支持集合内的增删改查, 同时还支持多个集合取交集, 并集, 差集
2.5.1 命令
1. 集合内操作
(1) 添加元素
- sadd
(2) 删除元素
- srem
(3) 计算元素个数
- scard
- O(1)
(4) 判断元素是否在集合中
- sismember
(5) 随机从集合返回指定个数元素
- srandmember
(6) 从集合随机弹出元素
- spop
- 从3.2版本开始, spop 也支持 count 参数
(7) 获取所有元素
- smembers
- 属于重型命令
2. 集合间操作
(1) 求多个集合的交集
- sinter
(2) 求多个集合的并集
- sunion (书中拼写错误: suinon)
(3) 求多个集合的差集
- sdiff
(4) 将交集, 并集, 差集的结果保存
- sinterstore
- sunionstore (书中拼写错误: suionstore)
- sdiffstore
在元素比较多的情况下会比较耗时.
2.5.2 内部编码
集合类型的内部编码有两种:
- intset: 当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置 (默认512个) 时, Redis 会选用intset 来作为集合的内部实现, 从而减少内存的使用。
- hashtable: 当集合类型无法满足 intset 的条件时, Redis 会使用 hashtable 作为集合的内部实现。
2.5.3 使用场景
标签 (tag):
- 一个人喜欢音乐, 体育, 另一个人喜欢历史, 新闻
- 可以用这些数据找到喜欢同一个标签的人 (共同喜好)
集合类型的应用场景通常为以下几种:
- sadd = Tagging (标签)
- spop/srandmember = Random item (生成随机数, 比如抽奖)
- sadd + sinter = Social Graph (社交需求)