集合对象的编码可以是 intset
或者 hashtable
。
intset
编码的集合对象使用整数集合作为底层实现, 集合对象包含的所有元素都被保存在整数集合里面。
举个例子, 以下代码将创建一个如图 8-12 所示的 intset
编码集合对象:
redis> SADD numbers 1 3 5 (integer) 3
另一方面, hashtable
编码的集合对象使用字典作为底层实现, 字典的每个键都是一个字符串对象, 每个字符串对象包含了一个集合元素, 而字典的值则全部被设置为 NULL
。
举个例子, 以下代码将创建一个如图 8-13 所示的 hashtable
编码集合对象:
编码的转换
当集合对象可以同时满足以下两个条件时, 对象使用 intset
编码:
- 集合对象保存的所有元素都是整数值;
- 集合对象保存的元素数量不超过
512
个;
不能满足这两个条件的集合对象需要使用 hashtable
编码。
注意
第二个条件的上限值是可以修改的, 具体请看配置文件中关于 set-max-intset-entries
选项的说明。
对于使用 intset
编码的集合对象来说, 当使用 intset
编码所需的两个条件的任意一个不能被满足时, 对象的编码转换操作就会被执行: 原本保存在整数集合中的所有元素都会被转移并保存到字典里面, 并且对象的编码也会从 intset
变为 hashtable
。
举个例子, 以下代码创建了一个只包含整数元素的集合对象, 该对象的编码为 intset
:
redis> SADD numbers 53 redis> OBJECT ENCODING numbers "intset"
不过, 只要我们向这个只包含整数元素的集合对象添加一个字符串元素, 集合对象的编码转移操作就会被执行:
redis> SADD numbers seven"1hashtable"
除此之外, 如果我们创建一个包含 512
个整数元素的集合对象, 那么对象的编码应该会是 intset
:
redis> EVAL for i=1,512 do redis.call('SADD',KEYS[1],i) end" integers (nil) redis> SCARD integers (integer) 512 OBJECT ENCODING integers "
但是, 只要我们再向集合添加一个新的整数元素, 使得这个集合的元素数量变成 513
, 那么对象的编码转换操作就会被执行:
redis> SADD integers 10086513"
原文地址:https://www.cnblogs.com/tracydzf
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。