redis数据结构之整数集合

207 阅读2分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

redis数据结构之整数集合

整数集合是redis用于保存整数值的集合抽象数据结构,它可以保存类型为,集合中不会出现重复元素

intset.h中定义了了intset的数据结构:

typedef struct intset {

    // 保存元素所使用的类型的长度
    uint32_t encoding;

    // 元素个数
    uint32_t length;    

    // 保存元素的数组
    int8_t contents[];  

} intset;

整合集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序排列,并且数组中不包含任何重复项。

contents属性声明为int8_t,当实际contents数组的真正类型取决于encoding属性的值

如果contents数组保存的是16位的整数集合,当添加一个64位的整数值时,整数集合中已存在的所有元素都会被转换成64类型,这就是整数集合的升级。

升级

当我们要将一个新元素添加到整数集合里面,新元素的类型比整数集合现有元素的类型要长的时候,整数集合需要先进行升级,然后才能将新元素添加到整数集合中。

升级过程:

  1. 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。
  2. 将底层数据现有的所有元素转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位置,而且保证有序
  3. 将新元素添加到底层数组里面

升级优点:

  1. 提升整数集合的灵活性,通过自动升级底层数组来适应新元素,我们可以随意的将不同类型的整数添加到集合中,不必单选类型错误,非常灵活
  2. 尽可能的节约内存,升级操作只会在需要的时候进行,尽量节省内存。

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

总结

整数集合是set类型的底层实现之一

整数集合的底层实现是数组,数组以有序,无重复的方式保存集合元素,在有需要的时候,根据添加元素的类型改变数组类型

升级操作提升了整数集合的灵活性,尽可能节约了内存

整数集合只支持升级操作,不支持降级