集合对象的编码可以是intset
或者hashtable
.
intset编码的集合
intset编码集合对象使用整数集合作为底层实现, 集合对象包含的所有元素都被保存在整数集合里面.
hashtable
hashtable编码的集合对象使用字典作为底层实现, 字典的每个键都是一个字符串对象, 每个字符串对象包含了一个集合元素。而字典的值全部被设置为NULL
编码转换
-
集合对象保存的所有元素都是整数值
-
集合对象保存的元素数量不超过512个
不能满足这两个条件的集合对象需要使用hashtable编码
编码转换条件设置
-
set-max-intset-entries
: 用于设置当整数集合中的节点数量的最大值, 当达到最大值的时候, 整数集合将转换为hastable
集合命令的实现
命令 | intset编码的实现方法 | hashtable 编码的实现方法 |
---|---|---|
SADD | 调用intsetAdd 函数, 将所有新元素添加到整数集合里面 |
调用dictAdd ,以新元素为键, NULL为值, 将键值对添加到字典里面 |
SCARD | 调用intsetLen 函数, 返回整数集合所包含的元素数量, 这个数量就是集合对象所包含的元素的数量 |
调用dictSize 函数, 返回字典所包含的键值对数量, 这个数量就是集合对象所包含的元素数量 |
SISMEMBER | 调用intsetFind 函数, 在证书集合中查找给定元素, 如果找到了说明元素存在于集合, 没找到则说明元素不存在与集合 |
调用dictFind 函数, 在字典的键中查找给定的元素, 如果找到了说明元素存在于集合, 没找到则卓明元素不存在于集合 |
SMEMBERS | 遍历整个整数集合, 使用intsetGet 函数返回集合元素 |
遍历整个字典, 使用dictGetKey 函数返回字典的键作为集合元素 |
SRANDMEMBER | 调用intsetRandom 函数, 从整数集合中随机返回一个元素 |
调用dictGetRandomKey 函数, 从字典中随机返回一个字典键 |
SPOP | 调用intsetRandom 函数, 从整数集合中随机取出一个元素, 在讲这个随机元素返回给客户端之后, 调用intsetRemove 函数, 将随机元素从整个集合中删除掉 |
调用dictGetRandomKey 函数, 从字典中随机去除一个字典键, 再将这个随机字典键的值返回给客户端之后, 调用dictDelete 函数, 从字典中删除随机字典键所对应的键值对 |
SREM | 调用intsetRemove 函数, 从整数集合中删除给定元素 |
调用dictDelete |