*Redis OBJECT ENCODING 命令

OBJECT ENCODING 返回指定 key 对应值的内部编码方式(encoding)。


*语法

OBJECT ENCODING key

*参数说明

参数 类型 必填 说明
key String 键名

*返回值

  • String:值的内部编码类型
    • String 类型:rawintembstr
    • List 类型:quicklist(Redis 3.2+)、ziplist(旧版)
    • Set 类型:intsethashtable
    • ZSet 类型:ziplistskiplist
    • Hash 类型:ziplisthashtable
  • Nil:key 不存在

*时间复杂度

O(1)

*

*示例

*查看 String 编码

> SET mystr "hello"
OK
> OBJECT ENCODING mystr
"embstr"
> SET myint 42
OK
> OBJECT ENCODING myint
"int"
> SET mylong "this is a very long string that exceeds the embstr limit"
OK
> OBJECT ENCODING mylong
"raw"

*查看 List 编码

> LPUSH mylist "a" "b" "c"
(integer) 3
> OBJECT ENCODING mylist
"quicklist"

*查看 Set 编码变化

> SADD smallset 1 2 3
(integer) 3
> OBJECT ENCODING smallset
"intset"
> SADD smallset "hello"
(integer) 1
> OBJECT ENCODING smallset
"hashtable"

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 key 参数 补充 key 参数
返回 (nil) key 不存在 确认 key 名称是否正确

*最佳实践

  • 调试内存问题时,用 OBJECT ENCODING 确认数据结构是否按预期编码
  • 小整数(≤ 9999)会编码为 int,节省内存
  • 短字符串(≤ 44 字节)用 embstr,连续内存,高效
  • 大集合(Set、Hash、ZSet)会自动从紧凑编码升级到 hashtable/skiplist,无需手动干预

*FAQ

Q1: embstrraw 有什么区别? A: embstr 将 redisObject 和 SDS 放在连续内存中,只分配一次内存,适合短字符串(≤ 44 字节)。raw 是分开分配,适合长字符串。

Q2: 为什么 List 的编码是 quicklist A: Redis 3.2 起 List 底层由 quicklist(双向链表 + ziplist 节点)实现,兼顾插入性能和内存紧凑。

Q3: 编码会自动变化吗? A: 会。当数据量增长或元素类型变化时,Redis 会自动从小内存编码(如 intset、ziplist)升级到高性能编码(如 hashtable、skiplist)。