首页/数据/数据库速查/Set 编码(intset / listpack / hashtable)
Redis 命令96 条

Set 编码(intset / listpack / hashtable)

全整数且不超 set-max-intset-entries(默认 512)用 intset;7.2+ 小集合可用 listpack;否则 hashtable。转换同样单向不可逆。

数据库速查数据更新于 2026-10-13

Set 编码是什么

Redis 的集合(Set)在底层有三种内部编码:intset(整数数组)、listpack(紧凑列表,7.2 起用于小集合)和 hashtable(哈希表)。调用方选不出编码,Redis 根据元素是否为整数、元素个数是否越过阈值自动决定。编码不改变命令语义,但显著改变内存占用,几十万个整数 ID 的集合从 intset 变成 hashtable 后内存涨好几倍是常态,所以做容量规划与内存排查时必须先看编码。

基本信息

适用版本Redis 3.2+(intset / hashtable);listpack 编码 7.2+
观察命令OBJECT ENCODING key;MEMORY USAGE key 看实际字节
intset 阈值set-max-intset-entries,默认 512
listpack 阈值set-max-listpack-entries,默认 128
触发条件集合内全部是十进制整数且数量不超阈值才可能用 intset

典型使用场景

  • 内存排查:某个 Set 占用异常高时,先用 OBJECT ENCODING 确认是否已从 intset 掉进 hashtable
  • 容量规划:把几百万用户 ID 放进集合前,先估算编码与元素数量带来的内存量级
  • 版本升级评估:7.2 引入 listpack 小集合编码,升级后可用同一批键对比升级前后的编码与内存
  • 调参验证:调整 set-max-intset-entries 或 set-max-listpack-entries 后,用重建的键验证是否按新阈值生效
  • 数据结构选型:需要去重且都是整数时,Set 比 Hash 更省内存,编码是关键依据

观察编码变化

观察编码变化
# 纯整数的集合走 intset,内存最省
SADD nums 1 2 3
OBJECT ENCODING nums        # -> intset
# 一旦混入非整数字符串,整个集合立刻转 hashtable,且不可逆
SADD nums abc
OBJECT ENCODING nums        # -> hashtable
# 字符串元素的小集合(7.2+)走 listpack
SADD str x y z
OBJECT ENCODING str         # -> listpack(7.2+)或 hashtable
CONFIG GET set-max-intset-entries
MEMORY USAGE nums           # 想知道真实字节数看这个,别只看编码

三种编码对照

编码触发条件内存特点常见命令代价
intset全整数且数量不超 512最省,有序整数数组SISMEMBER 二分查找 O(log N)
listpack7.2+ 小集合(数量不超 128 且元素小)紧凑连续,省指针开销线性扫描,集合小所以可接受
hashtable含非整数或数量超阈值每元素要哈希桶与指针,开销大SISMEMBER 平均 O(1),但内存高
编码转换是单向的:intset 转成 hashtable 后,即使把引起转换的字符串成员删掉也不会退回 intset,想恢复只能把成员读到客户端、删键、再 SADD 重建。
修改 set-max-intset-entries 这类阈值不会让已存在的键自动重新编码;只有新建键(或重建已有键)时才会按当前阈值判断。

易错点

  • 几十万个整数 ID 的集合里混进一个字符串 ID,整个集合转 hashtable,内存可能翻数倍且无法回退——敏感 ID 集合在写入前先做类型校验
  • 以为删掉非整数成员就能退回 intset:转换单向不可逆,只能重建键
  • 用 OBJECT ENCODING 代替 MEMORY USAGE 判断内存:编码只说明结构,实际占用还要看元素长度与数量
  • 把 set-max-intset-entries 调得极大:intset 插入要 memmove 搬移数组,超大 intset 的单次写入会明显变慢
  • 对该 Set 直接 SMEMBERS 全量拉取做统计:大集合一次性返回会长时间阻塞单线程并撑爆客户端内存,改用 SSCAN 分批

数据来源与参考

  • Redis 官方文档: OBJECT ENCODING
  • Redis 官方文档: 内存优化(set-max-intset-entries)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌