1. 作用

整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多,Redis会使用整数集合作为集合的底层实现

 

2. 数据结构

typedef struct intset{

    //编码方式

    uint32_t encoding;

    //集合包含的元素数量

    uint32_t length;

    //保存元素的数组

    int8_t contents[];

}

整数集合可以保存的值有int16,int32,int64

如果编码方式为INTSET_ENC_INT16,contents数组为16*5=80位/8 = 10

 

3. 升级

每当要把一个新元素加入集合,并且新元素类型比整数集合现有所有元素的类型都要长,整数集合需要先进行升级,然后才能将新元素添加到整数集合里面

升级分为三步

  1. 根据新元素扩展整数集合底层数组空间大小,并为新元素分配空间
  2. 将底层数组现有的所有元素都转换成新元素相同的类型,并将类型转换后的元素放置到正确的位上,放置过程中需要保持原有的次序不变
  3. 将新元素添加进底层数组中

所以插入一个元素的时间复杂度是O(N)

 

4. 升级的好处

  1. 提示灵活性
    1. c语音是静态类型,数组只能保存同一类型的元素,升级便于操作,不用担心类型错误
  2. 节约内存
    1. 如果想一个数组同时保持16,32,64位整数,底层数组需要是64位的,这样将会增大内存消耗,只有在集合中添加了64位整数才会升级至64位底层数组,再次之前都是可以节约内存的