[Redis]Intset

intset 小整数集合#

set 集合容纳的元素都是整数并且元素个数较少时, Redis 会使用 intset 来存储集合元素。
intset 是紧凑的数组结构,同时支持 16 位、 32 位和 64 位整数

struct intset<T>
{
	int32 encoding;//决定整数位宽是 16 位、 32 位还是 64
	int32 length ;//元素个数
	int<T> contents;//整数数组,可以是 16 位、 32 位和 64
}

5-8 所示是 intset 的内部结构示意图。老钱也不理解为什么 intset encoding字段和 length 字段使用 32 位整数存储,毕竟它们只是用来存储小整数的,长度不应该很长,而且 encoding 只有 16 位、 32 位和 64 位三个类型,用一个字节存储就绰绰有余。关于这点,读者们可以进一步讨论。

image

> sadd codehole 1 2 3
(integer) 3
> debug object codehole
Value at : Ox7fec2dc2bde0 refcount:l encoding:intset serializedlength:15 lru:6065795 lru_seconds_idle:4
> sadd codehole go java python
(integer) 3
> debug object codehole
Value at:Ox7fec2dc2bde0 refcount:1 encoding:hashtable serializedlength:22 lru:6065810 lru_seconds_idle:5

注意观察 debug object 的输出字段 encoding 的值,可以发现当 set 里面放进去了非整数值时,存储形式立即从 intset 转变成了 hash 结构。

作者:Esofar

出处:https://www.cnblogs.com/DCFV/p/18389647

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Duancf  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示