集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

6.1 整数集合的实现

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

redis整数最大值_Redis数据结构

按值从小到大有序地排列,并且数组中不包含重复项。

INTSET_ENC_INT16(int16_t类型:最小值-32768,最大值为32767)、INTSET_ENC_INT32(int32_t类型:最小值为-2147483648,最大值为2147483647)、INTSET_ENC_INT64(int64_t类型:最小值为-9223372036854775808,最大值为9223372036854775807)。

redis整数最大值_Redis_02

6.2 整数集合的升级规则

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

       升级整数集合并添加新元素分三步进行:

扩展整数集合底层数组的空间大小,并为新元素分配空间;

转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位上,而且在放置元素的过程中,需要继续维持底层数组的有序性质不变;

添加到底层数组里面。

向整数集合添加新元素的时间复杂度为O(N)。

       因为引发升级的新元素的长度总是比整数集合现有所有元素的长度都大,所以这个新元素的值要么大于所有现有元素(正数),要么就小于所有现有元素(负数)。

6.3 升级的好处

       升级的两个好处:

       1、提升整数集合的灵活性;

       2、尽可能地节约内存;

6.3.1 提升灵活性

       C语言是静态类型语言,为了避免类型错误,不会将两种不同类型的值放在同一个数据结构里面。

       整数集合可以通过自动升级底层数组来适应新元素,所以我们可以随意地将int16_t、int32_t或者int64_t类型的整数添加到集合中,而不必担心出现类型错误,这种做法非常灵活。

6.3.2 节约内存

       可以直接使用int64_t类型的数组作为整数集合的底层实现,保存所有int8_t、int16_t、int32_t、int64_t类型的整数。

升级操作只会在有需要的时候进行,这可以尽量节省内存。

6.4 降级(不支持)

       降级一般发生在删除元素时,不过整数集合不支持降级操作,升级后,整数集合的编码会一直保持升级后的状态。(如果要支持降级,每次删除元素都要遍历集合中的所有元素,查看这些元素的类型,再决定是否能够进行降级操作)

6.5 整数集合API

redis整数最大值_Redis_03