IntSet定义:
IntSet又叫整数数组,是redis中set集合的一种实现方式,其本质是对C语言中数组的一种封装与增强。
IntSet结构:
示例:
intset { encoding: int16_t, //元素类型编码信息 length: 5, //元素个数 contents: [1, 3, 5, 7, 9] //有序的整数数组 }
结构示意图:
结构特性:
-
整数数组:
-
intset 内部是一个数组,用于存储整数值。这个数组可以根据所需存储的整数值类型(int16_t、int32_t、int64_t)来动态调整大小。
-
-
元素类型编码信息:
-
每个元素在 intset 中都包含类型编码信息,用于存储整数值的类型,以便在需要时进行类型转换。
-
-
升序排列:
-
intset 内部的整数值是有序排列的,按升序排列在数组中,这有助于快速查找和插入操作,保持了整数值的有序性。
-
-
可变长度:
-
intset 具有灵活的长度,可以根据需要动态调整数组的大小,确保在插入新整数值时不会出现数组溢出的情况。
-
IntSet特点:
-
紧凑存储:
-
结构在内存中紧凑连续,节省内存空间
-
快速查找:
-
每个元素的大小都是固定的,所以将来查找时就可以通过第一个元素的内存地址,再根据距离和一个元素的大小,可以通过一个数学表达式直接快速寻址
IntSet自动升级:
如果原先的encoding规定数组每个元素大小为2个字节,但是现在要存储4个字节,这个时候Intset就会根据需要进行自动扩容,然后完成升级操作。
IntSet弊端:
IntSet适合于存储一些数据量较小的数据,因为它在内存中是连续的,如果数据量太大,就会出现内存无法分配的情况。所以当Redis中set类型数据量较大或存储数据不为整数时,底层就会采用Dict(哈希表)替代IntSet