乐趣区

关于redis:Redis数据结构-整数集合

整数汇合

整数汇合是汇合键的底层实现之一,当一个汇合只蕴含整数值元素,并且这个汇合的元素数量不多时,Redis 就会应用整数汇合作为汇合键的底层实现。

整数汇合实现

typedef struct intset {
    uint32_t encoding;
    uint32_t length;
    int8_t contents[];} intset;
  • contents : 整数汇合的底层实现,整数汇合的每个元素都是 contents 数组的一个数组项,各个项在数据中按值的大小从小到大有序地排序,并且数组中不蕴含任何反复项。
  • length : 记录了数组汇合蕴含的元素数量,即 contents 数组的长度。
  • encoding : 数组的编码格局,决定了数组中保留的数据的真正格局。

    encoding 可选的值有 INTSET_ENC_INT16INTSET_ENC_INT32INTSET_ENC_INT64,别离对应 contents 中保留值的真正类型:int16_tint32_tint64_t

降级

当将一个新元素增加到整数汇合时,新元素超出现有整数汇合中数据类型的最大值或者最小值时,整数汇合须要先进行降级,而后能力将新元素增加到整数汇合中。

整个降级过程分为三步:

  1. 依据新元素的类型,扩大整数汇合底层数组的空间大小,并为新元素调配空间。
  2. 将底层数组现有的所有元素都转换成与新元素雷同的类型,并将类型转换后的元素搁置到正确的地位上,而且在搁置元素的过程中,须要持续维持底层数组的有序性质不变。
  3. 将新元素增加到底层数组外面。

因为每次向数据汇合增加新元素时都可能会引起降级,而每次降级都须要对底层数组中已有的所有元素进行类型转换,所以向整数汇合增加新元素的工夫复杂度为 O(N)

降级的益处

整数汇合的降级策略有两个益处,一个是晋升整数汇合的灵活性,另一个是尽可能地节约内存。

晋升灵活性

为了防止类型谬误,通常不会将两种不同类型的值放在同一个数据结构外面。但因为整数汇合能够通过主动降级底层数组来适应新元素,所以在搁置值的时候,不须要思考值的类型,而不用放心呈现类型谬误。

节约内存

通过主动降级,整数汇合在保留数字时,确保只会在有须要的时候才应用占内存较大的类型,尽可能节俭内存。

降级

整数汇合不反对降级操作,一旦对数组进行了降级,编码就会始终放弃降级后的状态。

退出移动版