首页/数据/Redis 进阶速查/编码阈值与内存:listpack 家族
内存与管理99 条

编码阈值与内存:listpack 家族

hash、zset、list 等类型在小规模时用紧凑编码(Redis 7 为 listpack,此前为 ziplist),超过条目数或元素大小阈值转为标准结构。

Redis 进阶速查数据更新于 2026-10-13

小对象用紧凑编码

规模较小的哈希、有序集合与列表并不使用标准结构,而是用紧凑编码把数据塞进一块连续内存里,7.0 起是 listpack,更早的版本叫 ziplist。什么时候切换成标准结构由配置阈值决定:元素个数超过阈值,或者单个元素的长度超过阈值,编码就会转换。转换本身要付出代价,尤其是跨过阈值那一刻,单个键的内存占用会有明显跳变。

基本信息

适用类型哈希、有序集合、列表等小规模对象
当前编码7.0 起为 listpack,更早版本为 ziplist
触发转换元素个数超限或单元素长度超限
配置命名新版使用统一的新命名,旧版沿用旧命名
查看编码查看对象的编码类型字段

典型使用场景

  • 内存优化时核对小对象的实际编码是否符合预期
  • 评估键规模贴着阈值设计的风险,避免突然跳变
  • 确认升级后旧配置名是否还生效,避免配置被静默忽略
  • 排查某类键内存占用突然升高,定位到编码转换
  • 为业务设计键结构时按阈值上限倒推合理的元素个数

查看与调整

查看与调整
redis-cli CONFIG GET hash-max-listpack-entries hash-max-listpack-value
redis-cli CONFIG GET zset-max-listpack-entries list-max-listpack-size
redis-cli OBJECT ENCODING myhash          # 查看对象当前使用的编码
redis-cli MEMORY USAGE myhash             # 单个键的实际占用,便于对比阈值前后

编码与内存关系

观察项含义异常表现
紧凑编码小对象使用连续内存结构元素数超阈值后自动转为标准结构
元素个数阈值每个类型各自的上限跨过阈值时单键内存明显上升
单元素长度阈值单个元素允许的最大长度个别超长元素会拉高整体占用
配置命名差异新版与旧版命名不同沿用旧名在新版上不生效
设计键规模贴着阈值时要预估跳变:跨过阈值之后单个键的内存占用可能明显上升,提前留出余量比事后扩容省事。
升级到 7.x 之后仍沿用旧版配置名可能不生效,部署前要逐项核对配置是否被新版本识别,避免优化措施凭空失效。

易错点

  • 盲目调高阈值让大键继续使用紧凑编码,单次操作变慢且阻塞风险上升
  • 升级后沿用旧版配置名,配置未生效,内存优化预期落空
  • 键规模刚好贴着阈值却不做压测,业务量增长后集中发生编码转换
  • 只看总内存不查对象编码,编码转换引起的占用上升被归因为数据增长

数据来源与参考

  • Redis 官方文档:内存优化与编码阈值
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌