intset 小整数集合
set 集合容纳的元素都是整数并且元素个数较少
时, Redis 会使用 intset 来存储集合元素。
intset 是紧凑的数组结构,同时支持 16 位、 32 位和 64 位整数
struct intset<T>
{int32 encoding;//决定整数位宽是 16 位、 32 位还是 64int32 length ;//元素个数int<T> contents;//整数数组,可以是 16 位、 32 位和 64
}
5-8 所示是 intset 的内部结构示意图。老钱也不理解为什么 intset encoding字段和 length 字段使用 32 位整数存储,毕竟它们只是用来存储小整数的,长度不应该很长,而且 encoding 只有 16 位、 32 位和 64 位三个类型,用一个字节存储就绰绰有余。关于这点,读者们可以进一步讨论。
> sadd codehole 1 2 3
(integer) 3
> debug object codehole
Value at : Ox7fec2dc2bde0 refcount:l encoding:intset serializedlength:15 lru:6065795 lru_seconds_idle:4
> sadd codehole go java python
(integer) 3
> debug object codehole
Value at:Ox7fec2dc2bde0 refcount:1 encoding:hashtable serializedlength:22 lru:6065810 lru_seconds_idle:5
注意观察 debug object 的输出字段 encoding 的值,可以发现当 set 里面放进去了非整数值时,存储形式立即从 intset 转变成了 hash 结构。