*Redis OBJECT ENCODING 命令
OBJECT ENCODING 返回指定 key 对应值的内部编码方式(encoding)。
*语法
OBJECT ENCODING key
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 键名 |
*返回值
- String:值的内部编码类型
- String 类型:
raw、int、embstr - List 类型:
quicklist(Redis 3.2+)、ziplist(旧版) - Set 类型:
intset、hashtable - ZSet 类型:
ziplist、skiplist - Hash 类型:
ziplist、hashtable
- String 类型:
- 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: embstr 和 raw 有什么区别?
A: embstr 将 redisObject 和 SDS 放在连续内存中,只分配一次内存,适合短字符串(≤ 44 字节)。raw 是分开分配,适合长字符串。
Q2: 为什么 List 的编码是 quicklist?
A: Redis 3.2 起 List 底层由 quicklist(双向链表 + ziplist 节点)实现,兼顾插入性能和内存紧凑。
Q3: 编码会自动变化吗? A: 会。当数据量增长或元素类型变化时,Redis 会自动从小内存编码(如 intset、ziplist)升级到高性能编码(如 hashtable、skiplist)。