OBJECT IDLETIME 是什么
OBJECT IDLETIME 返回键距上次被访问过去了多少秒,属于 Redis 4.0 起的对象自省命令。它依赖 LRU 的访问时间戳,每次读写该键都会刷新时间戳。需要注意:一旦 maxmemory-policy 是 LFU 系,Redis 为省内存不再维护空闲时间,这条命令会直接报错,而不是返回 0。
基本信息
| 命令 | OBJECT IDLETIME key |
|---|---|
| 版本 | Redis 4.0 及以上 |
| 单位 | 秒 |
| 前提 | 当前策略不是 LFU(LFU 策略下直接报错) |
| 返回 | 键不存在时为空(nil) |
| 开销 | O(1) |
典型使用场景
- 抽查冷键:按关键前缀抽样,找出长期无人访问的键,决定是否补 TTL
- 验证 TTL 决策:键空闲很久却没有过期时间,说明业务漏设了 TTL
- 排查内存只增不减:键普遍空闲却没有任何过期,配合策略确认是否根本不会淘汰
- 确认缓存预热效果:刚预热完的键空闲时间应该很小
- 与 MEMORY USAGE 组合:先按空闲时间筛出冷键,再按体积排序决定清理顺序
最小示例
最小示例
redis-cli OBJECT IDLETIME cache:home # 查看单个键的空闲秒数
redis-cli OBJECT IDLETIME cache:hot # 与热点键对比,正常应有数量级差异
redis-cli CONFIG GET maxmemory-policy # LFU 策略下本命令会报错,先确认策略
redis-cli --scan --pattern 'cache:*' > /tmp/keys.txt # 导出候选键名
head -20 /tmp/keys.txt | xargs -I{} redis-cli OBJECT IDLETIME {} # 抽样 20 个键返回值读法
| 返回值 | 含义 | 下一步 |
|---|---|---|
| 0 到几分钟 | 刚被访问过 | 正常热点键,不必处理 |
| 数小时到数天 | 长期没人读 | 评估能否加 TTL 或直接清理 |
| 返回空(nil) | 键不存在 | 核对键名,必要时用 redis-cli -n 指定库 |
| 报错要求 LFU 策略 | 当前是 LFU | 改用 OBJECT FREQ 看频率,而不是空闲时间 |
写操作也会刷新空闲时间:一个只被定时覆盖、从没被读取的键看起来并不空闲,判断冷热时要结合业务读写模式。
空闲时间属于运行时元数据,跨实例、跨迁移工具之后不可比;判断冷热只看同一实例内的相对排序。
空闲时间和 TTL 是两件事:空闲久只是「最近没人读」,真正的回收时间由 TTL 决定。清理冷键前先确认它有没有被业务当作兜底数据周期读取,误删会造成缓存穿透式回源。