阈值调优的正确顺序
编码阈值决定小对象能否使用紧凑编码(listpack、intset、embstr 等),直接关系到内存占用,也影响单次操作需要搬动的字节数。合理的调优顺序是:先用 OBJECT ENCODING 看现状,用 MEMORY USAGE 量化单个键的实际占用,结合访问模式与延迟表现,最后才动阈值。还要记住阈值只影响后续触发编码判断的键,存量键要么被重建、要么在下次达到判断条件时才会转换。
基本信息
| 观测命令 | OBJECT ENCODING / MEMORY USAGE / INFO memory |
|---|---|
| Hash 阈值 | hash-max-listpack-entries 与 hash-max-listpack-value |
| 集合类阈值 | zset-max-listpack-* 与 set-max-intset-entries |
| 生效范围 | 新写入或后续触发编码判断的键 |
| 落盘 | CONFIG SET 后需要 CONFIG REWRITE |
典型使用场景
- 内存告警时定位哪些键从紧凑编码退化成了哈希表
- 上线前针对典型键做编码验证,确认设计与预期一致
- 大版本升级后复核参数命名变化(ziplist 系列改为 listpack 系列)
- 压测阶段对比不同阈值下的内存占用与尾延迟
- 规划大 key 拆分前,先量化拆与不拆的内存差异
调优与复核
调优与复核
redis-cli OBJECT ENCODING user:12345 # 当前编码,确认是否已退化
redis-cli MEMORY USAGE user:12345 # 单键实际占用字节数
redis-cli CONFIG GET hash-max-listpack-value # 单值长度阈值
redis-cli CONFIG SET hash-max-listpack-value 128
redis-cli INFO memory | grep -E 'used_memory_human|mem_fragmentation_ratio'
redis-cli CONFIG REWRITE # 确认收益后再落盘调优步骤
| 步骤 | 命令 | 目的 |
|---|---|---|
| 看现状 | OBJECT ENCODING | 确认当前编码与是否已退化 |
| 量化 | MEMORY USAGE | 判断优化空间有多大 |
| 改阈值 | CONFIG SET | 影响后续的编码判断 |
| 复核 | INFO memory 与延迟指标 | 确认收益与副作用 |
CONFIG SET 立即生效但不落盘,要长期生效必须执行 CONFIG REWRITE 或同步修改配置文件,否则重启后回到旧值,运维记录与实际行为就对不上了。
让存量键按新阈值重新编码需要重写数据(导出后重新写入)。这个过程本身会带来额外负载与风险,务必安排在低峰执行,并提前准备好回滚方案。
经验上优先调单值长度相关阈值,而不是只看条目数阈值:条目数决定一次操作要搬动多少个元素,单值长度决定要复制的字节量,后者对延迟的影响通常更直接。调整后至少观察一轮业务高峰,确认尾延迟没有恶化再固化配置。