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 编码之间,符合条件的情况下可以转换。