最准确查看Redis key底层编码的方式是执行OBJECT ENCODING key命令;它返回string、list等type对应的实际实现编码(如embstr、ziplist、intset),而非TYPE命令所示的逻辑类型,且编码随数据特征自动切换以优化性能。

直接用 OBJECT ENCODING key 命令就能查出当前 key 的底层编码方式,这是最准确、最常用的方法。Redis 不会把“类型(type)”和“编码(encoding)”混为一谈——TYPE key 只告诉你这是 string、list 还是 set,而 OBJECT ENCODING 才揭示它**实际用什么数据结构存的**,比如是 embstr 还是 raw,是 ziplist 还是 skiplist。
怎么执行查看命令
在 redis-cli 中输入:
-
OBJECT ENCODING mykey—— 返回该 key value 的具体编码名,如"embstr"、"ziplist"、"intset"等 - 如果 key 不存在,返回
(nil) - 注意:命令区分大小写,必须全大写
OBJECT,小写会报错
常见编码结果及含义
不同 type 对应多种 encoding,同一 type 会随内容自动切换。例如:
-
string 类型 可能是:
"int"(值为整数且在 long 范围内)、"embstr"(短字符串 ≤44 字节,内存连续)、"raw"(长字符串或需修改的字符串) -
list 类型 可能是:
"ziplist"(元素少、长度小,默认阈值:元素≤512 且每个 ≤64 字节)、"linkedlist"(旧版本)或"quicklist"(现默认,由多个 ziplist 组成) -
set 类型 可能是:
"intset"(全是整数且数量不多)、"ht"(哈希表,通用场景) -
zset 类型 可能是:
"ziplist"(元素少、score 是整数或短浮点)、"skiplist"(标准跳表 + 字典组合)
为什么需要关注 encoding
编码直接影响内存占用和操作性能:
- ziplist 比 linkedlist 节省内存,但插入/删除中间元素更慢
- intset 查找快、无哈希冲突,但只能存整数;一旦插入非整数,立刻转成
"ht" - embstr 比 raw 少一次内存分配,适合只读短字符串;但任何修改(如
APPEND)都会升级为 raw
配合其他 OBJECT 子命令一起看
OBJECT 还支持多个实用子命令,可交叉验证:
-
OBJECT REFCOUNT key—— 查引用计数,判断是否被共享(如 int 编码的相同数字可能共用对象) -
OBJECT IDLETIME key—— 查空闲秒数,辅助识别冷热数据 -
OBJECT FREQ key—— 查访问频次指数(LFU 策略相关)


















