第六章 整数集合

当一个集合只包含整数,且集合的元素数量不多时,Redis会使用整数集合作为底层实现。

6.1 整数集合的实现

  可以保存int16_t、int32_t或者int64_t的整数值。并且保证集合中不会出现重复的元素。

typedef struct intset{
    //编码方式
    uint32_t encoding;

    //集合包含的元素数量
    uint32_t length;

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

}intset;

   在contents[]中,每个整数按照值的大小从小到大有序排列,并且不出现重复项。数组中元素的整数类型取决于encoding,例如encoding值为INTSET_ENC_INT32,那么contentds就是一个int32_t类型的数组,每一项都是一个int32_t类型的整数值。

6.2 升级

  当新元素长度超过当前encoding规定的大小时,根据新类型的长度,以及集合元素的数量(包括新元素在内),对底层数组进行空间重分配。并保持依然按照大小顺序排序。升级虽然会增加复制和重新分配内存的开销,但是,可以节约内存,按照实际需要的最小内存分配。一旦升级之后,不能降级。

  

 

posted @ 2021-02-21 17:00  walker993  阅读(185)  评论(0编辑  收藏  举报