首页/数据/Redis 进阶速查/共享整数对象与内存节省
内存与管理99 条

共享整数对象与内存节省

Redis 默认共享 0 到 9999 的整数对象,命中时多个键复用同一对象,能显著节省小整数场景内存。

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

共享整数对象是什么

Redis 启动时会预创建一批小整数对象,当字符串值恰好落在这个范围内时,多个键共享同一个对象,省去重复的对象头与字符串结构开销。这个机制只对规范整数写法生效:值形如 42 才算,写成 00042 或超出范围的整数都会退化为普通字符串对象。

基本信息

共享范围由 shared.integers 控制,默认覆盖 0 到 9999
生效条件值的字符串表示是范围内的整数
受益场景计数器、状态码、布尔标记这类小整数
观测方式OBJECT REFCOUNT 看引用计数,OBJECT ENCODING 确认编码
已知限制共享对象不参与访问热度的老化统计

写法与是否复用

值的形态是否复用共享对象说明
4 或 100是落在默认共享范围内
2000000否超出范围,按普通对象存储
0004否不是规范整数写法,按字符串对象处理
abc否字符串对象

查看与验证

查看与验证
redis-cli CONFIG GET shared.integers        # 确认共享范围
redis-cli SET counter:42 42
redis-cli OBJECT REFCOUNT counter:42       # 共享整数的引用计数通常很高
redis-cli OBJECT ENCODING counter:42       # 显示 int 说明按整数编码存储
redis-cli MEMORY USAGE counter:42          # 单键开销,用于对比共享与普通对象

典型使用场景

  • 计数器场景:用 1、2、3 这类小整数作为状态值,天然落在共享范围内
  • 内存估算:判断某些键是否复用共享对象,避免高估开销
  • 编码排查:发现内存高于预期时,确认值是否因书写形式退化为字符串对象
  • 热键统计:共享对象不参与热度老化,统计口径要避开这类键
  • 规范核对:把业务枚举值收敛到小整数范围,减少重复对象
共享省下的是对象头与字符串结构,键本身、字典条目与过期记录的开销依旧存在;键的数量远大于值时,这部分节省占比有限。
共享范围由 shared.integers 配置,范围越大启动时需要预创建的对象越多;调整属于启动期选项,改动前先评估真实数据分布是否真的集中在小整数。

易错点

  • 把超出范围的整数(如大 ID、时间戳)也期待共享,导致内存估算偏差
  • 值以带前导零的形式写入,实际按字符串对象存储,共享失效
  • 为提高命中率随意调大共享范围,启动即多占内存,收益与场景不匹配
  • 用共享对象的热度统计判断热键,因不参与老化而得出错误结论
  • 只盯对象复用不看键数量与过期表开销,整体内存优化方向跑偏

数据来源与参考

  • Redis 官方文档:共享对象说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌