Nivelle 开拓视野冲破艰险看见世界 身临其境贴近彼此感受生活

redis深入学习之整数集合

2017-09-07

整数集合

整数集合是集合建的底层实现之一,当一个集合只包含整数值元素,并且这个集合元素数量不多时,redis就会使用整数集合作为集合建的底层实现.

它可以保持类型为int16_t,int32_t或者int64_t的整数,并且保证集合中不会出现重复元素.

1、set里面的数不重复,均为唯一。

2、set里面的数是从小到大有序的,这在后面的intsetAdd函数中可以看到。

typedef struct intset{
	//编码方式
	uint32_t encoding;
	//集合包含的元素数量
	uint32_t length;
	//保存元素的数组
	int8_t contents[];
}intset;


contents数组是整个集合的底层实现:整个集合的每一个元素都是contents数组的一个数组项(item),各个项在数组中按值得大小有序地排列,并且数组中不包含任何重复项.

  • length属性记录了整数集合包含的元素数量,也就是contents数组的长度

  • contents数组的真正类型取决于encoding属性的值

升级

然后由于我们可以同时存储int_16、int_32和int_64这3种类型,一开始只能为一种类型。假设为int_32,那么我们要插入一个int_16类型的数,只需要找到位置直接插入就可以了;但是我们要插入一个int_64类型的数,我们需要先升级,然后再插入。之所以要升级是为了可以有足够的空间存下位数更多的整数,一开始不直接搞成int_64是为了节省内存空间,按需升级非常灵活,既可以节省空间,又可以同时存在不同类型(int_16、int_32和int_64)的整数,一举两得!


评论