《Redis - 底层数据结构 - 整数集合(intset)》

一:概述

  - Redis 源码版本为3.0.0.

  - 整数集合(intset) 是集合键的底层实现之一。当一个集合元素不多,并只有整数时,会使用整数集合来实现。

 

二:整数集合的基础结构

  - 概述

    - 用于保存整数值集合,可以保存类型为 ini16_t、ini32_t、ini64_t 整数,并保证集合不会出现重复元素。 

  - 基本结构(src/intset.h)

    - 

    - content数组 是整数集合的底层实现,各个数组中按值大小有序排列,并且没有任何重复项。

    - length记录了数组的长度。

    - 集合的类型取决于 encoding 属性的值。而不是 contents 的类型。  

 

三:升级

  - 概述

    -  当有新元素添加到整数集合,而新元素的类型比整数集合的类型还要大时,此时整数集合便需要升级。

  - 原理

    - 扩展底层数组的空间大小,并为新元素分配空间。

    - 将数组现有元素转换与新元素相同的类型。并放在正确的位置上。

    - 将新元素添加值底层数组。

  - 源码实现

    - 

   - 实例

    - 假设原数组 存在 int16_t 类型的 数据 1,2,3,共占用  3 * 16 = 48位空间

      - 

     - 当新添加的元素为 65535,则就需要升级为 int32_t 类型。

     - 需要扩展底层数组空间为 4 * 32 = 128 位。

      - 

    - 这时需要对数组现有元素进行类型转换(这里要从后往前的处理原数据,因为如果从前往后处理的话,扩展的字节数会覆盖之前的数据)。

    - 首先处理原数据 3,按照位置转换类型至对应位置。

      - 

     - 其余元素同理,最后处理新元素,完成升级

  - 优势

    - 节省内存。

    - 提升整数集合的灵活性 (保持数组内类型的一致性)

四:降级

  -  不支持降级操作,一旦对数组升级,便会一致保持升级后状态。

posted @ 2020-04-06 21:06  Zzz哈  Views(354)  Comments(0Edit  收藏  举报