集合对象的编码可以是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 |