小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
redis数据结构之整数集合
整数集合是redis用于保存整数值的集合抽象数据结构,它可以保存类型为,集合中不会出现重复元素
intset.h中定义了了intset的数据结构:
typedef struct intset {
// 保存元素所使用的类型的长度
uint32_t encoding;
// 元素个数
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
整合集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序排列,并且数组中不包含任何重复项。
contents属性声明为int8_t,当实际contents数组的真正类型取决于encoding属性的值
如果contents数组保存的是16位的整数集合,当添加一个64位的整数值时,整数集合中已存在的所有元素都会被转换成64类型,这就是整数集合的升级。
升级
当我们要将一个新元素添加到整数集合里面,新元素的类型比整数集合现有元素的类型要长的时候,整数集合需要先进行升级,然后才能将新元素添加到整数集合中。
升级过程:
- 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。
- 将底层数据现有的所有元素转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位置,而且保证有序
- 将新元素添加到底层数组里面
升级优点:
- 提升整数集合的灵活性,通过自动升级底层数组来适应新元素,我们可以随意的将不同类型的整数添加到集合中,不必单选类型错误,非常灵活
- 尽可能的节约内存,升级操作只会在需要的时候进行,尽量节省内存。
整数集合不支持降级操作,一旦数组进行升级,编码就会保持升级后的状态。
总结
整数集合是set类型的底层实现之一
整数集合的底层实现是数组,数组以有序,无重复的方式保存集合元素,在有需要的时候,根据添加元素的类型改变数组类型
升级操作提升了整数集合的灵活性,尽可能节约了内存
整数集合只支持升级操作,不支持降级