共享整数对象是什么
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 配置,范围越大启动时需要预创建的对象越多;调整属于启动期选项,改动前先评估真实数据分布是否真的集中在小整数。