OBJECT ENCODING 是什么
OBJECT ENCODING 用来查看一个键当前实际使用的内部编码。同一个逻辑类型可能有多种编码实现:字符串可能是整数编码、短字符串编码或常规字符串,Hash 可能是紧凑的 listpack 也可能是哈希表,有序集合可能是 listpack 也可能是跳表。了解编码是内存优化的第一手依据,因为紧凑编码与常规编码在同一份数据上的内存差距可以达到数倍,而这个差异无法从 TYPE 命令看出来。
基本信息
| 语法 | OBJECT ENCODING key,键不存在时返回 nil |
|---|---|
| 常见取值 | int、embstr、raw、listpack、intset、quicklist、hashtable、skiplist、stream |
| 配套命令 | TYPE 看逻辑类型,MEMORY USAGE 看占用字节数 |
| 决定因素 | 数据形态与各结构的编码阈值配置共同决定 |
| 单向性 | 从紧凑编码升级为常规编码后不会自动退回 |
典型使用场景
- 内存优化核查:抽样确认线上热点键是否真的处于紧凑编码,而不是已经悄悄升级
- 容量评估:按实际编码估算内存,避免只按数据体积推算导致容量规划偏差
- 问题定位:怀疑某个键过大时,先用编码判断结构实现是否已经发生变化
- 阈值调优前后对比:调整阈值后观察新建键的编码,验证配置是否按预期生效
- 迁移准备:识别长期处于常规编码的大键,评估拆分或改造的必要性
常用示例
常用示例
redis-cli TYPE user:1 # 逻辑类型,如 string 或 hash
redis-cli OBJECT ENCODING user:1 # 底层编码,如 embstr 或 listpack
redis-cli OBJECT ENCODING rank:board # zset 可能是 listpack 或 skiplist
redis-cli OBJECT ENCODING tags:news # set 可能是 intset 或 hashtable
redis-cli MEMORY USAGE user:1 # 该键占用的字节数
redis-cli EXISTS user:1 # 编码查询前先确认键存在类型与编码对应
| 类型 | 紧凑编码 | 常规编码 |
|---|---|---|
| string | int、embstr | raw |
| hash | listpack | hashtable |
| zset | listpack | skiplist |
| set | intset、listpack | hashtable |
| list | listpack | quicklist |
编码不是恒定属性:追加元素、修改内容使之变长、或调整阈值配置,都可能让它发生变化。因此内存评估必须基于当前数据量下的实际编码,并考虑未来增长是否会把键推到另一个编码区间。
查询不存在的键返回 nil 而不是报错:排查编码前应先用 EXISTS 或 TYPE 确认键存在,否则很容易把「键已删除或过期」误读成「编码异常」。