【Redis】数据结构与对象(六种底层数据结构)——整数集合 inset

整数集合 inset

(1)整数集合的定义实现

整数集合的定义为inset.h/inset

typedef struct intset {
    // 编码方式
    uint32_t encoding;
    // 集合包含的元素数量
    uint32_t length;
    // 保存元素的数组
    int8_t contents[];
} intset;

contents数组:整数集合的每个元素数组中按值的大小从小到大排序,且不包含重复项

length记录整数集合的元素数量,即contents数组长度

encoding决定contents数组的真正类型,如INTSET_ENC_INT16、INTSET_ENC_INT32、INTSET_ENC_INT64

img

例如:上图中,encoding属性的值为INTSET_ENC_INT16,表示整数集合的底层实现为int16_t类型的数组

length属性的值为5,表示整数集合包含五个元素

contents数组按照从小到大的顺序保存着集合的五个元素

  • 因为每个集合元素都是int16_t类型的整数值,所以contents数组的大小等于sizeof(int16_t) * 5 = 16 * 5 = 80 位

(2)整数集合的升级

**当想要添加一个新元素到整数集合中时,并且新元素的类型比整数集合现有的所有元素的类型都要长,整数集合需要先进行升级(upgrade),才能将新元素添加到整数集合里面。**每次想整数集合中添加新元素都有可能会引起升级,每次升级都需要对底层数组已有的所有元素进行类型转换

升级添加新元素:

  • 根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
  • 把数组现有的元素都转换成新元素的类型,并将转换后的元素放到正确的位置,且要保持数组的有序性
  • 添加新元素到底层数组

整数集合的升级策略可以提升整数集合的灵活性,并尽可能的节约内存

另外,整数集合不支持降级,一旦升级,编码就会一直保持升级后的状态

升级后新元素的摆放位置:

  • 小于所有现有元素,新元素放到最开头(索引0)
  • 大于所有现有元素,新元素放到最末尾(索引length - 1)
posted @ 2021-04-29 23:04  your_棒棒糖  阅读(105)  评论(0编辑  收藏  举报