Redis数据结构底层(二):IntSet

IntSet定义:

IntSet又叫整数数组,是redis中set集合的一种实现方式,其本质是对C语言中数组的一种封装与增强。

IntSet结构:

示例:

intset {
    encoding: int16_t, //元素类型编码信息
    length: 5, //元素个数
    contents: [1, 3, 5, 7, 9] //有序的整数数组
}

结构示意图:

image-20240708115517280

结构特性:

  1. 整数数组

    • intset 内部是一个数组,用于存储整数值。这个数组可以根据所需存储的整数值类型(int16_t、int32_t、int64_t)来动态调整大小。

  2. 元素类型编码信息

    • 每个元素在 intset 中都包含类型编码信息,用于存储整数值的类型,以便在需要时进行类型转换。

  3. 升序排列

    • intset 内部的整数值是有序排列的,按升序排列在数组中,这有助于快速查找和插入操作,保持了整数值的有序性。

  4. 可变长度

    • intset 具有灵活的长度,可以根据需要动态调整数组的大小,确保在插入新整数值时不会出现数组溢出的情况。

IntSet特点:

  1. 紧凑存储

  • 结构在内存中紧凑连续,节省内存空间

  1. 快速查找

  • 每个元素的大小都是固定的,所以将来查找时就可以通过第一个元素的内存地址,再根据距离和一个元素的大小,可以通过一个数学表达式直接快速寻址

IntSet自动升级:

如果原先的encoding规定数组每个元素大小为2个字节,但是现在要存储4个字节,这个时候Intset就会根据需要进行自动扩容,然后完成升级操作。

IntSet弊端:

IntSet适合于存储一些数据量较小的数据,因为它在内存中是连续的,如果数据量太大,就会出现内存无法分配的情况。所以当Redis中set类型数据量较大存储数据不为整数时,底层就会采用Dict(哈希表)替代IntSet

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值