redis · 29 3 月, 2021 0

REDIS数据结构-集合对象(Set)

集合对象的编码可以是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函数,从字典中删除所有键为给定元素的简直对