剩余生存时间怎么读
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 已到期但内存尚未释放属于正常现象,不需要当成故障处理。