首页/数据/Redis 进阶速查/OBJECT IDLETIME 与空闲分析
内存与管理99 条

OBJECT IDLETIME 与空闲分析

OBJECT IDLETIME 返回键的空闲秒数(自上次访问);LRU 系策略下可用来抽查哪些键长期无人访问。

Redis 进阶速查数据更新于 2026-10-13

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 决定。清理冷键前先确认它有没有被业务当作兜底数据周期读取,误删会造成缓存穿透式回源。

易错点

  • 以为 LFU 策略下会返回 0:实际是直接报错 idle time not tracked,先用 CONFIG GET maxmemory-policy 判断
  • 逐键扫描数百万个键会给实例增加可观负载,用抽样或离线分析 RDB 代替
  • 把空闲时间当作业务不再使用的证据:只被周期覆盖、不被读取的键同样不空闲
  • 重启或迁移后直接对比数值:空闲时间基准变化,跨实例比较没有意义
  • 拿少量抽样键的空闲时间给整个前缀定性:冷热分布通常是长尾的,样本太少容易把偶发未命中当成整体闲置

数据来源与参考

  • Redis 官方文档:OBJECT IDLETIME 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌