redis底层数据结构之整数集合(intset)
整数集合(intset)
当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redis会使用整数集合(intset)作为集合键的底层实现
整数集合用于保存整数值的集合抽象数据类型,它可以保存类型为int16_t、int32_t 或者int64_t 的整数值,并且保证集合中不会出现重复元素
它是一个有序不重复的连续空间
1 intset结构
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;
其中:
encoding:编码类型,包含:int16_t,int32_t,int64_t
length:存放的元素数量
contents:存放元素的数组,从小到大排序
2 intset示意图
encoding=int16_t, 存有6个元素的intset示意图如下:
3 升级
编码由小到大:int16_t ----> int32_t ----> int64_t
当新增的元素类型比原集合元素类型的长度要大时,需要对整数集合进行升级,才能将新元素放入整数集合中,具体步骤:
1) 根据新元素类型,扩展整数集合底层数组的大小,并为新元素分配空间
2) 将底层数组现有的所有元素都转成与新元素相同类型的元素,并将转换后的元素放到正确的位置,放置过程中,维持整个元素顺序都是有序的
3) 将新元素添加到整数集合中,保证有序
4 降级
整数集合不支持降级操作,一旦对数组进行了升级,编码就会一直保持升级后的状态