一. 编码
集合对象的编码可以是intset或者hashtable。
intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都保存在整数集合里面。
127.0.0.1:6379> sadd numbers 1 3 5
(integer) 3
127.0.0.1:6379> object encoding numbers
"intset"
hashtable编码的集合对象使用字典作为底层实现,字典的每一个键都是一个字符串对象,每一个字符串对象包含了一个集合元素,而字典的值全部被置为NULL。
127.0.0.1:6379> sadd fruits 'cherry' 'apple' 'banana'
(integer) 3
127.0.0.1:6379> object encoding fruits
"hashtable"
二. 编码转换
当一个集合对象同时满足下面两个条件时,使用intset编码:
- 集合对象保存的所有元素都是整数值
- 集合对象保存的元素数量不超过512个
不满足时使用hashtable编码。也就是如果一开始使用的是intset作为集合对象的底层实现,当下面两个条件其中一个不满足时,集合对象会执行编码转化操作,将保存在整数集合中的元素转移到字典中,编码修改成hashtable。
注意:第二个条件的上限值是可以修改的,具体看配置文件中的set-max-intset-entries选项说明。