写点什么

Redis 学习笔记 05:整数集合

发布于: 2021 年 01 月 17 日
Redis 学习笔记 05:整数集合

一、定义

整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构,它可以保存类型为 int16_t、int32_t 或者 int64_t 的整数值,并且保证集合中不会出现重复元素。

二、数据结构

1、整数集合数据结构

typedef struct intset {	uint32_t encoding; //编码方式 	uint32_t length; //集合包含的元素数量 	Int8_t contents[]; //保存元素的数组} intset;
复制代码


  • encoding 决定了插入数据的类型

       encoding 的枚举:

    #define INTSETENCINT16 (sizeof(int16_t))

    #define INTSETENCINT32 (sizeof(int32_t))

    #define INTSETENCINT64 (sizeof(int64_t))

  • contents 数组是整数集合的底层实现,各项从小到大有序排列,并且数组中不包含任何重复项。

  • length 属性记录整数集合包含的元素值,即 contents 数组的长度


三、升级

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


升级主要步骤:

1)跟进新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间;

2)将底层数组现有元素转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位置上,此过程,需要维持底层数组的有序性不变;

3)将新元素添加到底层数组里面。


举例:

现有一个包含 3 个 int16_t 类型元素的整数集合

每个元素占用 16 位空间,即整数集合底层数组的大小:3*16=48 位。

假设要将类型为 int_32 的整数值 65535 添加到整数集合里,需要对整数集合进行升级。

1)进行空间重新分配

2)将原有的 int_16 类型的三个元素转换成 int_32 类型,并将转换后的元素放置到正确的位上面,此过程有序性保持不变。

3)最终整数集合 encoding 属性值从 int_16 改为 int_32,并将 length 属性由 3 改为 4。


升级的优势:

  • 提升整数集合的灵活性

  • 尽可能的节约内存


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

四、特性及适合场景

1、作为列表键的底层实现

2、底层实现为数组,数组有序、无重复保存元素

3、升级操作带来操作的灵活性,并且尽可能地节约内存

4、只支持升级操作,不支持降级操作


发布于: 2021 年 01 月 17 日阅读数: 18
用户头像

坚持分享接地气儿的架构技术文章! 2018.02.26 加入

同名微信公众号「架构精进之路」,专注软件架构研究,技术学习与职业成长!坚持原创总结、沉淀和分享,希望能带给大家一些引导和启发,感谢各位的支持(关注、点赞、分享)!

评论

发布
暂无评论
Redis 学习笔记 05:整数集合