整数集合
介绍:
整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。集合的底层会对数组进行由小到大的排序
代码
typedef struct intset{
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint_32t length;
// 保存元素的数组
uint_8t contents[];
}
解析
-
其中 数组虽然是uint_8t 类型 但是具体类型还是有encoding来决定
-
encoding可选
-
INTSET_ENC_INT16 java的short
-
INTSET_ENC_INT32 java的int
-
INTSET_ENC_INT64 java的long
-
-
length 为数组中元素的数量
升级
- 升级是将数组类型进行升级如价将 short类型数组升级为 int或long类型
升级过程
如有一个数组类型为encoding = INTSET_ENC_INT16 其中包括3个数字分别为1 ,2 ,3 现添加一个int类型数字
-
首先要知道这个数组占多少内存 16×3 = 48bit 扩容为int 所占内存为 32×4 = 128bit
-
先将数组扩容为128bit 之后将新插入放入最后 在将1,2,3 排序后放入扩容到数组中 使得每个数组占中32bit
-
每次升级都需要将数组中的元素进行类型转换 所以升级的时间复杂度为O(n)
升级的好处
- 升级可以提升整数集合的灵活性,和解决内存(毕竟放在内存中)
PS: 整数集合不会降级 比如说数组中有long类型 那么数组肯定是INTSET_ENC_INT64 即使删除了这个long类型数组 整数集合还是不会降级 依旧保持在INTSER_ENC_INT64