整数集合

当一个集合只包含整数值元素,并且这个集合的元素数量不多的时候,Redis就会使用整数集合张作伟集合键的底层实现

整数集合的实现

1
2
3
4
5
6
7
8
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;

整数集合的每个元素都是contents数组的一个数组项。各个项在数组中按值的大小从小到大有序排列,并且不重复

length记录长度

虽然contents类型为int8_t,但实际上contents的真正类型有encoding属性来决定:

  • encoding为INTSET_ENC_INT16,那么contents就是一个int16_t类型的数组
  • encoding为INTSET_ENC_INT32,那么contents就是一个int32_t类型的数组
  • encoding为INTSET_ENC_INT64,那么contents就是一个int64_t类型的数组

升级

添加一个新元素时:

  1. 根据新元素类型,扩展整数集合底层数组的空间大小,并为新元素分配空间
  2. 将底层数据现有的所有元素都转换成与新元素相同类型,并将转换后的元素放到正确的位置上,而且在放置元素的过程中,需要继续维持底层数组的有序性质不变
  3. 将新元素添加到底层数组里

升级好处

  • 提升灵活性
  • 节约内存

降级

整数集合不支持降级,一旦进行升级,编码会一直保持