共计 941 个字符,预计需要花费 3 分钟才能阅读完成。
整数汇合
整数汇合是汇合键的底层实现之一,当一个汇合只蕴含整数值元素,并且这个汇合的元素数量不多时,Redis 就会应用整数汇合作为汇合键的底层实现。
整数汇合实现
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];} intset;
contents
: 整数汇合的底层实现,整数汇合的每个元素都是contents
数组的一个数组项,各个项在数据中按值的大小从小到大有序地排序,并且数组中不蕴含任何反复项。length
: 记录了数组汇合蕴含的元素数量,即contents
数组的长度。-
encoding
: 数组的编码格局,决定了数组中保留的数据的真正格局。encoding
可选的值有INTSET_ENC_INT16
、INTSET_ENC_INT32
、INTSET_ENC_INT64
,别离对应contents
中保留值的真正类型:int16_t
、int32_t
、int64_t
降级
当将一个新元素增加到整数汇合时,新元素超出现有整数汇合中数据类型的最大值或者最小值时,整数汇合须要先进行降级,而后能力将新元素增加到整数汇合中。
整个降级过程分为三步:
- 依据新元素的类型,扩大整数汇合底层数组的空间大小,并为新元素调配空间。
- 将底层数组现有的所有元素都转换成与新元素雷同的类型,并将类型转换后的元素搁置到正确的地位上,而且在搁置元素的过程中,须要持续维持底层数组的有序性质不变。
- 将新元素增加到底层数组外面。
因为每次向数据汇合增加新元素时都可能会引起降级,而每次降级都须要对底层数组中已有的所有元素进行类型转换,所以向整数汇合增加新元素的工夫复杂度为 O(N)
降级的益处
整数汇合的降级策略有两个益处,一个是晋升整数汇合的灵活性,另一个是尽可能地节约内存。
晋升灵活性
为了防止类型谬误,通常不会将两种不同类型的值放在同一个数据结构外面。但因为整数汇合能够通过主动降级底层数组来适应新元素,所以在搁置值的时候,不须要思考值的类型,而不用放心呈现类型谬误。
节约内存
通过主动降级,整数汇合在保留数字时,确保只会在有须要的时候才应用占内存较大的类型,尽可能节俭内存。
降级
整数汇合不反对降级操作,一旦对数组进行了降级,编码就会始终放弃降级后的状态。
正文完