小对象用紧凑编码
规模较小的哈希、有序集合与列表并不使用标准结构,而是用紧凑编码把数据塞进一块连续内存里,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 之后仍沿用旧版配置名可能不生效,部署前要逐项核对配置是否被新版本识别,避免优化措施凭空失效。