Redis的集合是Sting类型的无序集合,集合成员唯一,集合中最大的成员数为 2^32 - 1
1. 编码
集合对象的编码可以是INTSET或HT。
INTSET编码的集合对象使用整数集合作为底层实现,集合对象的所有元素都存储在整数集合中。
HT编码的集合对象使用字典作为底层实现,每个字符串对象(字典的键)包含了一个集合元素,而字典的值为NULL。
2. 编码转换
当集合对象满足下面条件时使用INTSET编码:
- 集合对象存储的所有元素都为整数值。
- 集合对象存储的元素个数不超过512.
配置文件中set-max-intset-entries可以修改元素个数的上线
当对INTSET编码的集合对象进行一些操作致使无法使用INTSET编码是,则将集合对象转换成HT编码,INTSET中保存的键值对会移动到新的字典中。
3. 命令
命令 | 作用 |
---|---|
SADD | 向集合添加一个或多个成员 |
SCARD | 获取集合的成员数 |
SDIFF | 返回给定所有集合的差集 |
SDIFFSTORE | 返回给定所有集合的差集并存储在 dst 中 |
SINTER | 返回给定所有集合的交集 |
SINTERSTORE | 返回给定所有集合的交集并存储在 dst 中 |
SISMEMBER | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS | 返回集合中的所有成员 |
SMOVE | 将 member 元素从 src 集合移动到 dst 集合 |
SPOP | 移除并返回集合中的一个随机元素 |
SRANDMEMBER | 返回集合中一个或多个随机数 |
SREM | 移除集合中一个或多个成员 |
SUNION | 返回所有给定集合的并集 |
SUNIONSTORE | 所有给定集合的并集存储在 dst 集合中 |
SSCAN | 迭代集合中的元素 |
4. 源码剖析
- 编码转换
1 | void setTypeConvert(robj *setobj, int enc) { |
- 添加成员
1 | /** |
- 删除成员
1 | /** |