第六章 整数集合
当一个集合只包含整数,且集合的元素数量不多时,Redis会使用整数集合作为底层实现。
6.1 整数集合的实现
可以保存int16_t、int32_t或者int64_t的整数值。并且保证集合中不会出现重复的元素。
typedef struct intset{ //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[]; }intset;
在contents[]中,每个整数按照值的大小从小到大有序排列,并且不出现重复项。数组中元素的整数类型取决于encoding,例如encoding值为INTSET_ENC_INT32,那么contentds就是一个int32_t类型的数组,每一项都是一个int32_t类型的整数值。
6.2 升级
当新元素长度超过当前encoding规定的大小时,根据新类型的长度,以及集合元素的数量(包括新元素在内),对底层数组进行空间重分配。并保持依然按照大小顺序排序。升级虽然会增加复制和重新分配内存的开销,但是,可以节约内存,按照实际需要的最小内存分配。一旦升级之后,不能降级。
人生就像蒲公英,看似自由,其实身不由己。