*Redis OBJECT 命令
OBJECT 是 Redis 对象检查命令的入口,提供多个子命令用于查看 key 的内部编码、空闲时间、引用计数等底层信息。
*语法
OBJECT subcommand [arg ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| subcommand | String | 是 | 子命令:ENCODING / FREQ / IDLETIME / REFCOUNT |
| arg | 取决于子命令 | 是 | 子命令所需的参数(通常是 key) |
*返回值
- 返回值取决于子命令:
- OBJECT ENCODING:编码名称字符串(如
raw、int、ziplist等) - OBJECT FREQ:访问频率计数(LFU)
- OBJECT IDLETIME:空闲时间(秒)
- OBJECT REFCOUNT:引用计数(整数)
- OBJECT ENCODING:编码名称字符串(如
- 键不存在时返回 Nil
*时间复杂度
O(1)
*
*示例
*查看编码
> SET mykey "hello"
OK
> OBJECT ENCODING mykey
"raw"
> SET numkey 42
OK
> OBJECT ENCODING numkey
"int"
*查看空闲时间
> OBJECT IDLETIME mykey
(integer) 120
*查看引用计数
> OBJECT REFCOUNT mykey
(integer) 1
*查看 LFU 频率
> OBJECT FREQ mykey
(integer) 5
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR unknown subcommand | 子命令名称错误 | 使用 ENC/ENCODING/FREQ/IDLETIME/REFCOUNT |
| ERR wrong number of arguments | 缺少 key 参数 | 提供要检查的 key |
| WRONGTYPE | 不适用于该 key 类型(极少见) | 确认 key 存在 |
*最佳实践
- 使用 OBJECT ENCODING 分析数据结构选型是否合理(如小 Hash 应为 ziplist/listpack)
- OBJECT IDLETIME 结合 maxmemory-policy 分析键的访问模式
- OBJECT FREQ 需要配置 maxmemory-policy 为 LFU 相关策略才有效
- 调试内存问题时检查编码是否异常(如小字符串不应为 raw)
- 生产环境不建议高频调用,涉及内部状态读取
*FAQ
Q1: OBJECT ENCODING 返回的编码有哪些?
A: 常见有 raw、int、embstr(String)、ziplist/listpack(List/Hash/ZSet)、hashtable、skiplist、quicklist 等,因版本和配置而异。
Q2: OBJECT IDLETIME 和 LRU 策略有什么关系? A: IDLETIME 返回自上次访问以来的秒数,正是 LRU 驱逐策略的决策依据之一。
Q3: REFCOUNT 大于 1 是什么意思? A: 表示该对象被多个引用共享(如复制共享),Redis 内部优化机制。
Q4: OBJECT FREQ 返回 0 正常吗? A: 如果未启用 LFU 策略或对象从未被访问,可能返回 0。
Q5: 键不存在时返回什么?
A: 返回 nil (nil)。