面试题答案
一键面试导致Redis整数集合降级的基本情况
Redis整数集合一般不会发生降级,只会升级。因为整数集合的设计初衷是为了高效存储同类型且数值范围较小的整数。整数集合升级的情况为:当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的类型都要长时,整数集合需要先进行升级,然后才能将新元素添加到整数集合里面。升级操作可以让整数集合适应新元素。
数据结构层面的体现
- 升级:
- 整数集合(
intset
)的数据结构定义如下:
- 整数集合(
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
- 当添加新元素导致升级时,会改变
encoding
的值来表示新的编码方式。例如,如果之前是INTSET_ENC_INT16
(表示16位有符号整数),添加一个32位整数后,会升级为INTSET_ENC_INT32
。 - 同时,
contents
数组会重新分配内存,以适应新的元素类型和数量。原有的元素会被重新转换为新的类型并重新排列到新的内存空间中,新元素也会被添加进去。这样就完成了从较低类型到较高类型的升级,以满足存储需求。