首页/数据/Redis 进阶速查/TTL 批量检查与过期状态判定
性能与排障129 条

TTL 批量检查与过期状态判定

TTL 返回 -1(存在但无过期)与 -2(键不存在)两种特殊值;批量检查用 SCAN 迭代配合管道,避免在生产实例上用 KEYS 全量扫描。

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

剩余生存时间怎么读

TTL 用于查看键的剩余生存时间,返回值分三种情况:正数是剩余秒数,-1 表示键存在但没有设置过期时间,-2 表示键已经不存在。把 -1 与 -2 混为一谈是最常见的误判来源:前者是永久键,后者是键已不在。批量检查过期状态时不要用 KEYS 全量扫描,而应通过 SCAN 游标分批取键,再逐个查询 TTL 或 PTTL,把压力摊到多次调用上。

基本信息

单键命令TTL key 返回秒,PTTL key 返回毫秒
返回值正数为剩余时间,-1 无过期,-2 不存在
批量方式SCAN 游标配合客户端循环,或用 redis-cli --scan
相关命令EXPIRETIME / PEXPIRETIME(7.0 起返回绝对时间)
权限要求普通读写权限即可

典型使用场景

  • 巡检缓存键是否都带过期时间,揪出「忘设 TTL」的永久键
  • 排查内存异常增长:无过期时间的键持续堆积是最常见原因之一
  • 按业务域统计剩余时间分布,核对过期策略是否合理
  • 大促或活动开始前确认活动相关键的过期时间设置正确
  • 导出临近过期的键清单,做批量续期或提前清理

查询示例

查询示例
redis-cli TTL session:1001              # 正数:剩余秒数
redis-cli PTTL session:1001             # 毫秒精度,用于短 TTL 场景
redis-cli TTL some:permanent            # -1:键存在但没有过期时间
redis-cli TTL maybe:gone                # -2:键已经不存在
redis-cli --scan --pattern 'session:*' | head -50 | while read k; do echo "$k $(redis-cli TTL "$k")"; done
# 上万量级改用 --pipe 或应用侧批量处理,避免反复建立连接

返回值读法

返回值含义常见误判
正数剩余秒数以为访问会延长 TTL,实际不会
-1存在但没有过期时间误当成不存在,于是漏掉所有永久键
-2键不存在误当成永久键,统计口径整体出错
PTTL 的 -2同样是键不存在与秒级返回的语义完全一致
过期键不会在同一瞬间消失:Redis 采用惰性删除加定期抽样删除的组合策略,一个已经过期的键在内存里还可能短暂存在。因此看到某个键 TTL 已到期但内存尚未释放属于正常现象,不需要当成故障处理。

易错点

  • 把 -2 当成永久键统计,得出错误的永久键数量,掩盖真实问题
  • 用 KEYS 做批量检查,几十万键的实例会被整体阻塞数秒甚至更久
  • 在 shell 循环里逐条调用 redis-cli 查询 TTL,连接开销远大于查询本身,量级上万时几乎不可用
  • 用 TTL 代替 EXISTS 判断键是否存在,两者之间存在竞态,判断存在性应使用 EXISTS

数据来源与参考

  • Redis 官方文档:TTL / PTTL 命令
  • redis-cli 手册:--scan 选项
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌