1.5 redis数据结构-整数集合(intset)

127 阅读1分钟

1. 用途

该数据结构主要用于集合(set)中.当元素为int且数量不多的时候,集合使用该数据结构实现.而且本身是有序的,不包含重复值。

新增的时候应该是插入排序。

2. 数据结构

typedef stuct intset {
    uint32_t length;//元素个数
    uint32_t encoding ;//编码方式,底层存储的整数类型
    int8_t []contents;//保存原始的byte数组,实际是根据encoding来决定几个数组组成一个真正的整数
}

  • length:已保存的原始类型
  • encoding:
    • intset_enc_int16:底层contents存放的16int.两个字节表示一个元素
    • intset_enc_int32:32int
    • intset_enc_int64:64int

3. 编码升级

当一个一直存放int32_tintset存入一个int64_t的时候,为了保证数据对齐和能按照下标查找的特性,所有已存入的元素会从原来占据4个字节变成占据8个字节.

  • encoding值会变成intset_enc_int64
  • 同时length加一

例如原来0-31位保存第一个元素,32-63保存第二个元素,当加入一个int64_t的时候,底层contents会扩容到64*3=192个字节.同时第0元素占据的位置会从0-31变成0-63,第二位类似.

redis中大量使用这种编码和升降级。

4.不支持降级

5. 优点

  1. 灵活
  2. 节省内存空间