首页/数据/Redis 进阶速查/OBJECT ENCODING 查看键的底层编码
数据结构与选型42 条

OBJECT ENCODING 查看键的底层编码

读取键当前使用的内部编码(int/embstr/raw、listpack、intset、quicklist、skiplist、hashtable 等),为内存优化与结构选型提供直接依据。

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

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                  # 编码查询前先确认键存在

类型与编码对应

类型紧凑编码常规编码
stringint、embstrraw
hashlistpackhashtable
zsetlistpackskiplist
setintset、listpackhashtable
listlistpackquicklist
编码不是恒定属性:追加元素、修改内容使之变长、或调整阈值配置,都可能让它发生变化。因此内存评估必须基于当前数据量下的实际编码,并考虑未来增长是否会把键推到另一个编码区间。
查询不存在的键返回 nil 而不是报错:排查编码前应先用 EXISTS 或 TYPE 确认键存在,否则很容易把「键已删除或过期」误读成「编码异常」。

易错点

  • 键不存在时返回 nil 被当成编码异常处理,排查方向跑偏,应先确认键是否存在
  • 以为编码可以随数据减少自动退回,实际升级不可逆,优化存量数据只能通过删除重建
  • 只按数据体积估算内存,忽略编码升级带来的指针与结构开销,容量规划偏乐观
  • 忽视编码阈值配置的差异:不同实例阈值不一致时,同样结构的键在两台机器上内存表现不同

数据来源与参考

  • Redis 官方文档:OBJECT ENCODING 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌