首页/数据/数据库速查/键与值的内存设计(省内存实战)
Redis 运维与场景124 条

键与值的内存设计(省内存实战)

同样的数据不同的内存:短键名、整数编码、小哈希 listpack、分桶控制单键大小、压缩序列化——省下来的是真金白银。

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

同样的数据不同的内存

键名长度、值的编码方式、单键规模与值尺寸是否统一,都会直接影响 Redis 的内存占用与碎片水平:短键名减少每键固定开销,小 Hash 走 listpack 紧凑编码,把分散的小对象聚合进一个 Hash 能显著减少键数量。优化前必须用工具量化,改完再量化对比,避免凭感觉调整。

基本信息

适用Redis 4.0 及以上,编码阈值随版本略有差异
量化手段MEMORY USAGE、OBJECT ENCODING、redis-cli --memkeys
编码阈值hash-max-listpack-entries(默认 128)与 hash-max-listpack-value(默认 64 字节)
命名约定短前缀要在内部文档登记,否则排障全靠猜

编码与占用验证

编码与占用验证
HSET cfg a 1 b 2 c 3
OBJECT ENCODING cfg                       # listpack:小 Hash 的紧凑编码
MEMORY USAGE cfg                          # 精确到该键的字节占用
OBJECT ENCODING cfg                       # 字段数超阈值后会变成 hashtable
CONFIG GET hash-max-listpack-entries      # 查看列表压缩的字段数阈值
CONFIG GET hash-max-listpack-value        # 查看值长度阈值
redis-cli --memkeys -i 0.1               # 采样统计各键占用,定位大 key

省内存手段与代价

手段收益代价
短键名加命名空间前缀减少每键固定开销可读性下降,必须在文档登记
整数编码与 listpack小对象内存显著压缩超出阈值即退化为通用编码
小对象聚合进 Hash键数量大幅减少,开销下降单键过大后无法按字段设置过期
value 压缩后存储体积明显下降增加 CPU 与解压时延
统一 value 尺寸减少分配器尺寸类碎片需要业务侧配合改造

典型使用场景

  • 缓存节点内存吃紧,评估在不加机器的前提下压缩占用
  • 大 key 治理:定位单键占用过高的键并拆分
  • 计数器类业务:用 Hash 聚合多字段减少键数量
  • 碎片率偏高时从键设计入手排查成因
  • 容量规划:用 MEMORY USAGE 估算扩容后的内存需求
优化前先用 MEMORY USAGE 与采样工具量化,改完再量化对比;盲目压缩键名会拖累排障效率,收益与可维护性要一起权衡。
用采样工具统计大 key 会给实例带来额外开销,生产环境建议低峰执行,或改用从库采样。

易错点

  • 为省内存把键名压到两三个字符又不写文档:排障时只能靠猜键含义
  • 压缩大 value 却不评估解压开销:省了内存换来 CPU 飙升,整体延迟反而变差
  • 把大对象长期塞进单个 Hash:字段数上万后编码退化,单键内存与操作耗时同步放大
  • 只优化单键不看总量:占内存大头往往是数量庞大的小键,应从键数量入手

数据来源与参考

  • Redis 官方文档: 内存优化
  • Redis 官方文档: OBJECT ENCODING

相关工具

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