参考:<<Redis设计与实现>>
- 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异
集合对象的编码是:
- intset
- hashtable
一、集合对象的编码
1.1 intset编码
intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。
创建一个使用intset编码的集合对象:
redis> sadd nums 1 3 5
(integer) 3
redis> object encoding nums
"intset"
intset编码的集合对象如下图所示:
1.2 hashtable编码
hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,字典的值全部置为NULL。
创建一个使用hashtable编码的集合对象:
redis> sadd fruits "apple" "banana" "cherry"
(integer) 3
redis> object encoding fruits
"hashtable"
hashtable编码的集合对象如下图所示:
二、编码的转换
当集合对象同时满足以下两个条件时,对象使用intset编码,不能满足这两个条件的将会使用hashtable编码:
- 集合对象保存的所有元素都是整数值
- 结合对象保存的元素数量不超过512个
注:512这个阈值可以配置,可以参考配置文件中set-max-intset-entries
选项或使用config get set-max-intset-entries
查看、修改。
redis> config get set-max-intset-entries
1) "set-max-intset-entries"
2) "512"
redis> config set set-max-intset-entries 600
OK
redis> config get set-max-intset-entries
1) "set-max-intset-entries"
2) "600"
2.1 intset -> hashtable
intset编码所需的两个条件任意一个不能满足时,就会执行对象的编码转换,原本在整数集合中的所有元素都会被转移保存到字典里,对象的编码也会从intset变为hashtable。
(1)向集合中添加字符串
示例:
redis> sadd nums 1 2 3
(integer) 3
redis> object encoding nums
"intset"
redis> sadd nums "four"
(integer) 1
redis> object encoding nums
"hashtable"
(2)集合元素超过阈值
临时设置set-max-intset-entries
值为5
示例:
redis> config set set-max-intset-entries 5
OK
redis> sadd nums 1 2 3 4 5
(integer) 5
redis> scard nums
(integer) 5
redis> object encoding nums
"intset"
redis> sadd nums 6
(integer) 1
redis> scard nums
(integer) 6
redis> object encoding nums
"hashtable"