IntSet 是集合类型的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redis 就会使用 IntSet作为集合键的底层实现
InSet 结构
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;
- encoding 表示编码方式,取值有三个:INTSET_ENC_INT16, INTSET_ENC_INT32, INTSET_ENC_INT64
- length 表示存储的整数个数
- contents 指向实际存储数值的连续内存区域,就是一个数组;整数集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序排序,并且数组不包含任何重复项。(虽然contents 项声明为int8_t类型的数组,但实际保存值的类型取决于encoding)
整数集合的升级
当一个int16类型的整数集合中插入一个int32类型的值,整个整数集合的所有元素都会转成int32类型。过程有三步:
- 根据新的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
- 将底层数组现有的所有元素都转换成与新元素相同的类型,并将类型转换后的元素放置在正确的位上,放置过程中保持数组的有序性质不变
- 最后改变encoding的值,length + 1