Redis - Set底层数据结构


Set对象编码是 intset 或者 hashtable

1、intset

intset 编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。

举个例子,以下代码将创建一个intset 编码集合对象:

2、hashtable

hashtable 编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为 NULL。

举个例子,以下代码将创建一个 hashtable 编码集合对象:

3、编码转换

当Set对象可以同时满足以下两个条件时,则使用 intset 编码:

1)Set对象保存的所有元素都是整数值

2)Set对象保存的元素数量不超过 512 个(默认值,配置参数set-max-intset-entries可以修改);

不能满足这两个条件的Set对象需要使用 hashtable 编码。

注意:第二个条件的上限值是可以修改的,具体请看配置文件。

set-max-intset-entries 选项的说明:对于使用 intset 编码的Set对象来说,当使用 intset 编码所需两个条件的任意一个不能被满足时,对象的编码转换操作就会被执行,原本保存在整数集合中的所有元素都会被转移并保存到字典里面,并且对象的编码也会从 intset 变为 hashtable

示例1: 不满足“所有元素都是整数值”

示例2: 不满足“元素数量不超过 512 个

 

4、要点总结

1)Set对象的编码可以是 intset 或者 hashtable;

2)intset 编码的集合对象使用整数集合作为底层实现;

3)hashtable 编码的集合对象使用字典(map)作为底层实现;

4)intset 与 hashtable 编码之间,符合条件的情况下可以转换。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM