• 集合中的元素不重复
  • 无序, 不能通过下标获取元素
  • 最多可以存储 2 - 1 个元素
  • 处理支持集合内的增删改查, 同时还支持多个集合取交集, 并集, 差集

image.png

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

image.png

(4) 将交集, 并集, 差集的结果保存
  • sinterstore
  • sunionstore (书中拼写错误: suionstore)
  • sdiffstore

在元素比较多的情况下会比较耗时.

image.png

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 (社交需求)