目录

Redis(五)整数集合

整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且集合元素不多时,Redis会使用整数集合作为集合键的底层实现。

1、整数集合的实现

结构体定义如下:

https://narcissusblog-img.oss-cn-beijing.aliyuncs.com/uPic/file-09/ScreenShot2021-09-12%2015.21.10.png

contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项,各个项在数组中按值从小到大有序排列,并切不重复。虽然contents属性声明为int8_t类型的数组,但实际上数组的真正类型取决于encoding属性的值。

2、升级

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

升级步骤分为三步:

  1. 根据新元素类型,扩展整数集合底层数组空间的大小,并为新元素分配空间。
  2. 将底层数组现有所有元素转换为与新元素相同的类型,并将转换后的元素放置到正确位置。(有序性质不变)
  3. 新元素添加到底层数组里面。

注意:因为每次向整数集合添加新元素都可能会引起升级,并且每次升级都会对底层数组中所有元素进行类型转换,所以向整数集合添加新元素的时间复杂度为O(N)

https://narcissusblog-img.oss-cn-beijing.aliyuncs.com/uPic/file-09/ScreenShot2021-09-12%2016.16.36.png

3、升级的好处

整数集合升级策略有如下两个好处:

  • 提升灵活性

由于C语言是静态类型语言,为了避免类型错误,通常不会将两种类型的值放到同一个数据结构里面。但整数集合可以自动升级底层数组来适应新元素,所以可以将不同类型整数添加到集合中,非常灵活。

  • 节约内存

要让一个数组同时保存int16_t、int32_t、int64_t三种类型数据,最简单的方式就是直接使用int64_t类型,但这样会造成内存浪费。整数集合这样的做法可以确保升级操作只会在需要的时候进行,这样可以尽量节省内存。

4、降级

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

重点回顾

https://narcissusblog-img.oss-cn-beijing.aliyuncs.com/uPic/file-09/ScreenShot2021-09-12%2016.27.02.png