Redis之intset(整数集合)

Redis中的set数据结构在仅包含整数且元素不多时可能会使用intset实现。intset是一个有序的整数集合,它可以存储int16_t、int32_t、int64_t类型的数据,并确保内部数据不重复。当添加的新元素类型大于现有元素类型时,intset会进行升级操作,但不支持降级。升级过程中,intset会扩展空间,转换元素类型并将新元素添加进去。

Redis中set数据结构它是由intset或者hashtable构成的今天我们就来讲一下intset
整数集合(intset)呢, 是一个有序的存储数据的结构
它有以下优点

  • 1.整数集合中, 元素按照值的大小由小到大排列;
  • 2.可以保存int16_t, int32_t, int64_t类型的数据
  • 3.存储数据时, 可以保证其内部不出现重复的数据
    当一个set只包含整数元素, 并且元素不多的时候, Redis就可能使用intset来实现set

intset底层实现

typedef struct intset {
	uint32_t encoding; // 编码类型
	uint32_t length;   // 元素数量
	int8_t contents[]; // 元素数组
}intset;

但有一点需要注意
在这里插入图片描述
intset的集合升级与降级
比如一开始set存储的是int16_t类型的数据, 但是当我们添加了一个int32_t类项的数据时,就需要操作升级

  1. 根据新元素的类型, 扩展底层元素的空间, 并为新元素分配空间
  2. 将现有的元素都转为新的元素类型, 并存储在正确的空间上面
  3. 将新元素添加进数组内
    最后集合是不支持降级的哦
### Redis 中 `intset` 数据结构 #### 使用方法 在 Redis 中,当集合中的元素均为整数且数量较少时,Redis 采用 `intset` 结构来实现。创建并操作 `intset` 主要通过 Redis 提供的命令集完成。 - **添加元素** 添加新元素到 `intset` 可以使用 `SADD key member [member ...]` 命令。如果所有给定的成员都已存在于集合中,则返回值为执行该命令之前集合中存在的成员的数量[^2]。 ```bash SADD myIntSet 1 2 3 ``` - **移除元素** 移除指定元素可借助 `SREM key member [member ...]` 实现。此命令仅会在键存在的情况下生效,并尝试从中删除所提供的成员;存在于集合内的成员会被忽略。 ```bash SREM myIntSet 2 ``` - **获取全部元素** 要查看当前 `intset` 所有元素,可以通过 `SMEMBERS key` 获取整个集合的内容列表。 ```bash SMEMBERS myIntSet ``` #### 特性 - **紧凑存储** `intset` 是一种非常紧凑的数据表示形式,它本质上是一个有序数组,其中保存着同类型的整数值(如 16 位、32 位或 64 位)。这种设计使得其占用更少的空间,尤其适合处理较小规模但频繁变动的小型整数集合[^4]。 - **动态调整大小** 随着更多元素被加入,`intset` 的容量也会相应增长。值得注意的是,尽管内部采用了固定长度的数组作为基础容器,但在实际编码过程中,`contents` 数组的实际类型会依据 `encoding` 属性而变化,从而适应同的数据范围需求。 - **高效性能** 对于插入和查找操作而言,由于 `intset` 维护了一个升序排列的状态,因此能够提供较为高效的检索效率。此外,在某些情况下还能利用二分查找算法进一步优化这些常见操作的时间复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gopher333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值