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 降级

整数集合不支持降级操作,一旦对数组进行了升级,编码就会一直保持升级后的状态

 

posted @ 2022-12-17 18:03  junffzhou  阅读(93)  评论(0编辑  收藏  举报