当前位置:首页 > 问答 > 正文

Redis里怎么看键快过期了,失效时间到底在哪儿查呢?

Redis里怎么看键快过期了,失效时间到底在哪儿查呢?”这个问题,其实核心就是两个命令和一些使用上的技巧,下面我直接告诉你方法,并解释清楚细节。

核心命令一:TTL(Time To Live)

这是你最需要记住的命令,TTL 专门用来查看一个键还有多少秒会过期,它的用法非常简单,打开你的 Redis 命令行客户端(redis-cli),然后输入:

TTL your_key_name

这里的关键是理解它返回的数字是什么意思,这比记住命令本身更重要:

  • 返回一个正整数(86):这是最常见的情况,意思是这个键还剩下 86 秒就要过期了,数字会随着时间一秒一秒地减少,直到变成 0。
  • 返回 -1:这是一个非常重要的信号,它表示这个键没有设置过期时间,是永久的,只要你不手动删除它或者 Redis 没有触发淘汰策略,它就会一直存在,当你查一个键发现 TTL 是 -1 时,就别等它自动过期了,它不会过期的。
  • 返回 -2:这表示你查询的这个键已经过期了,或者根本不存在,在 Redis 里,一个键一旦过期,就会被自动删除(虽然有延迟删除的策略,但对你查询来说,结果就是查不到了),所以看到 -2,你就可以认为这个键已经没了。

举个例子,你设置了一个键 user:session:123,并让它 10 分钟后过期(600秒),你可以在不同时间点查询它:

Redis里怎么看键快过期了,失效时间到底在哪儿查呢?

  • 刚设置完马上查:TTL user:session:123,可能返回 597
  • 过了两分钟再查:可能返回 477
  • 如果这个键是你用 SET 命令直接设的,没加过期时间,那查出来就是 -1
  • 10分钟后你再去查:很可能返回 -2,因为已经过期被删除了。

核心命令二:PTTL

这个命令是 TTL 的“毫秒版”,它的用法和 TTL 一模一样:

PTTL your_key_name

唯一的区别是,它返回的是毫秒数,如果你需要更精确的过期时间控制或监控,比如一个键在 5500 毫秒后过期,TTL 命令可能会显示 5 秒(因为它取整),而 PTTL 会精确地显示 5500,它返回值的含义和 TTL 是对应的:

  • 正整数:剩余的毫秒数。
  • -1:键没有设置过期时间。
  • -2:键不存在或已过期。

我怎么知道哪些键快要过期了呢?

Redis里怎么看键快过期了,失效时间到底在哪儿查呢?

上面两个命令是“逐个击破”的方法,你需要知道具体的键名才能查,但很多时候,你的问题可能是:“我有一大批键,我怎么知道其中哪些快到期了?” 遗憾的是,Redis 没有一个直接的命令能让你列出“所有将在未来5分钟内过期的键”。

要实现这个目标,你需要结合其他命令和步骤:

  1. 先找到你关心的键: 使用 KEYS 命令或者更推荐的 SCAN 命令来模糊匹配出你需要的键,你想查看所有以 user:session: 开头的会话键的状态,你可以用 SCAN 命令迭代地获取这些键的列表。

    • (注意:KEYS 命令在生产环境中要慎用,因为它会阻塞Redis服务,如果键非常多会导致服务短暂不可用。SCAN 是通过游标迭代的,不会阻塞,更安全。)
  2. 再逐个检查TTL: 获取到键的列表后,写一个简单的脚本(可以用 Lua 脚本在 Redis 服务器端执行,也可以用你熟悉的编程语言,如 Python、Java 等在应用端执行),循环遍历每一个键,分别对它们执行 TTLPTTL 命令。

    Redis里怎么看键快过期了,失效时间到底在哪儿查呢?

  3. 筛选出符合条件的键: 在脚本中判断返回值,你想找出所有在60秒内过期的键,那么就检查 TTL 返回值是否大于 0 并且小于等于 60。

这就是一个完整的流程,对于运维或开发人员来说,他们通常会写一个这样的监控脚本,定期运行,从而及时发现即将过期的关键键,比如会话键、锁键等,以便采取相应措施(比如告警、续期等)。

额外的一个相关命令:PERSIST

既然提到了过期,再多说一个相关的有用命令 PERSIST,如果你查到一个键的 TTL 是 300(还有5分钟过期),但你现在想取消它的过期时间,让它变成永久键,该怎么做呢?就是用这个命令:

PERSIST your_key_name

执行成功后,你再用 TTL 去查这个键,返回的就是 -1 了,这相当于移除了这个键的过期时间。

  • 查单个键的剩余秒数,用 TTL
  • 查单个键的剩余毫秒数,用 PTTL
  • 返回值是正数,表示剩余生存时间。
  • 返回值是 -1,表示键是永久的,不会自动过期。
  • 返回值是 -2,表示键已不存在。
  • 想批量找快过期的键,没有直接命令,需要结合 SCANTTL 自己写脚本遍历。
  • 如果想取消过期,使用 PERSIST 命令。

失效时间的查询并不复杂,核心就是理解 TTLPTTL 的返回值所代表的真实状态,希望这些直接的解释能帮到你。