Redis 学习笔记 05:整数集合
一、定义
整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构,它可以保存类型为 int16_t、int32_t 或者 int64_t 的整数值,并且保证集合中不会出现重复元素。
二、数据结构
1、整数集合数据结构
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、只支持升级操作,不支持降级操作
版权声明: 本文为 InfoQ 作者【架构精进之路】的原创文章。
原文链接:【http://xie.infoq.cn/article/918f0d78809de0bdf346bd53a】。文章转载请联系作者。
评论