OBJECT 系列诊断是什么
OBJECT 命令族查看单个键的内部状态:ENCODING 看内部编码,REFCOUNT 看共享对象引用计数,IDLETIME 看空闲秒数(LRU 策略下维护),FREQ 看访问频次(LFU 策略下维护)。IDLETIME 与 FREQ 只在对应淘汰策略下才有意义,策略不匹配时会报错或恒为零,这是排查时最容易踩的坑;内存占用要用 MEMORY USAGE 而不是 OBJECT。
基本信息
| 适用版本 | Redis 全版本(OBJECT FREQ 需 4.0+) |
|---|---|
| ENCODING | 内部编码(int/embstr/raw/listpack/quicklist/hashtable/skiplist 等) |
| IDLETIME | LRU 空闲秒数;LFU 策略下恒为 0 |
| FREQ | LFU 访问频次计数器;LRU 策略下报错 |
| REFCOUNT | 共享对象引用计数,大于 1 说明用了共享整数对象 |
| 内存占用 | MEMORY USAGE key 才是正确入口 |
典型使用场景
- 大 key 分析:确认某个键使用了哪种编码、是否已转为开销更大的结构
- 热 key 定位:在 LFU 策略下读 FREQ,找出访问最频繁的键
- 冷数据识别:用 IDLETIME 找长期未被访问的键,评估清理
- 内存优化:核对短字符串是否仍是 embstr
- 缓存命中率排查:结合编码与访问统计判断是否被频繁重建
示例
示例
SET k v
OBJECT ENCODING k # embstr
OBJECT REFCOUNT k # 共享对象引用计数
OBJECT IDLETIME k # 空闲秒数(需 maxmemory-policy 为 LRU 系才更新)
# LFU 策略下看访问频次(策略不匹配会报错)
CONFIG SET maxmemory-policy allkeys-lfu
OBJECT FREQ k
# 内存占用与编码是两个维度
MEMORY USAGE k子命令与前置条件
| 子命令 | 返回什么 | 前置条件 |
|---|---|---|
| ENCODING | 内部编码名称 | 无,任何键都可查 |
| REFCOUNT | 引用计数 | 无,用于判断是否共享对象 |
| IDLETIME | 空闲秒数 | maxmemory-policy 为 LRU 系才维护 |
| FREQ | LFU 访问频次 | maxmemory-policy 为 LFU 系,否则报错 |
| MEMORY USAGE | 键的内存字节数 | 无,替代 OBJECT 的内存视角 |
分析热 key 时,OBJECT 只能看单个键:需要全局视角可用 redis-cli --hotkeys(LFU 策略下有效)或对 INFO commandstats、慢日志做采样统计,再回到具体键上用 OBJECT 确认。
在 LRU 策略下执行 OBJECT FREQ 会直接报错,在 LFU 策略下读 IDLETIME 又只会得到 0:排查热 key 或冷 key 之前,先确认 maxmemory-policy 是哪种淘汰策略。