从整数集合到哈希表的去重魔法
2010 年,Redis Set 类型诞生。底层使用 intset(整数集合)实现, 专为纯整数小集合设计,内存极其紧凑。
当 Set 包含非整数元素或元素数量超过 intset 阈值时, 自动转换为 dict(字典)实现。
确立 intset → dict 的转换阈值。当集合元素不超过 set-max-intset-entries 且全为整数时使用 intset,否则转为 dict。
Set 的 intset/dict 双编码机制稳定成熟。 dict 作为 O(1) 查询的核心,支持 SISMEMBER 高效判断成员存在性。
将 set-max-intset-entries 默认值从 512 调整为 512(保持), 但优化了 intset 升级到 dict 的转换性能。
Redis 7.0 将 set-max-intset-entries 扩大到 512(部分版本支持更大)。 intset 内部编码仍支持 int16_t/int32_t/int64_t 自动升级。
Redis Set 根据数据特征自动选择最优编码
Redis Set 的演进是一个"量体裁衣"的过程:
intset(纯整数小集合)⟷
dict(通用场景)
核心设计思想:
整数场景 → 用紧凑数组省内存(二分查找)
通用场景 → 用哈希表保性能(O(1) 查询)
自动切换 → 根据数据特征选择最优编码
这就是为什么 Set 既能存储"点赞用户 ID"(整数),也能存储"标签集合"(字符串),
而且都能保持高性能和低内存占用。