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

Redis怎么查键的过期时间,命令用法和注意点分享

要查看Redis中一个键的过期时间,主要使用两个命令:TTLPTTL,这两个命令的用途相似,但返回值的单位不同。

TTL 命令

TTL 是 "Time To Live" 的缩写,这个命令用于获取指定键剩余的生存时间,单位是秒。

  • 命令用法TTL key_name
  • 返回值解读
    • 正整数:表示键剩余的生存时间,以秒为单位,返回 60 表示这个键在60秒后过期。
    • -1:表示键存在,但它没有设置过期时间,也就是永不过期。
    • -2:表示键不存在,你查询了一个已经不存在的键的过期时间。

PTTL 命令

PTTL 是 "Precise Time To Live" 的缩写,它和 TTL 的功能完全一样,唯一的区别是它的返回值单位是毫秒,当你需要更精确的过期时间控制时,这个命令就很有用。

  • 命令用法PTTL key_name
  • 返回值解读
    • 正整数:表示键剩余的生存时间,以毫秒为单位,返回 1500 表示这个键在1500毫秒(即1.5秒)后过期。
    • -1:表示键存在,但没有设置过期时间
    • -2:表示键不存在

使用示例

假设我们在Redis中设置一个名为 mykey 的键,并给它10秒的过期时间:

Redis怎么查键的过期时间,命令用法和注意点分享

0.0.1:6379> SET mykey "Hello" EX 10
OK

然后我们立即查询它的过期时间:

0.0.1:6379> TTL mykey
(integer) 8   // 大约还剩8秒
127.0.0.1:6379> PTTL mykey
(integer) 7894 // 大约还剩7894毫秒

重要的注意点分享

  1. 区分 -1 和 -2 的含义:这是最容易混淆的地方。-1 代表键是“永生”的,它会一直存在,除非你手动删除它。-2 则代表这个键已经“死亡”了,根本不存在,在写程序逻辑时,一定要对这两个值做不同的处理。

  2. 过期精度可能不是绝对的:Redis的过期机制是“惰性删除”和“定期删除”相结合,这意味着,一个键即使已经到了过期时间,它可能不会立刻被删除,而是等到下次有命令访问它时,Redis才会检查并删除它。TTL 返回 -2 是绝对准确的,但当一个键的 TTL 显示为 0 或很小的正数时,它可能已经被逻辑上过期了,但物理上还未被移除,根据 Redis 官方文档(antirez/RiSearch)的说明,这种延迟通常是非常短暂的。

    Redis怎么查键的过期时间,命令用法和注意点分享

  3. 只能查询整个键的过期时间TTL/PTTL 是针对整个键的,对于复杂数据类型(如 Hash, List, Set, Sorted Set),你无法查询其中某个字段或元素的单独过期时间,过期时间是设置在键本身上的。

  4. 如何设置过期时间:查询通常和设置配合使用,设置过期时间的常用命令有:

    • EXPIRE key seconds / PEXPIRE key milliseconds:为已存在的键设置过期时间。
    • SET key value EX seconds:在设置键值的同时直接指定过期时间(秒),如上面的例子。
    • SET key value PX milliseconds:在设置键值的同时直接指定过期时间(毫秒)。
  5. 持久化对过期时间的影响:当Redis进行持久化(RDB或AOF)时,过期键会被连同其过期时间一起保存,当Redis重启后加载数据,会重新恢复这些键和它们的过期状态,所以你不必担心重启后所有键都变成永久的。

  6. 使用场景建议

    • 在实现锁机制时,PTTL 可以用于获取更精确的锁剩余时间,从而做出更及时的决策。
    • 在检查用户会话(session)是否快过期时,可以用 TTL 来提醒用户或自动续期。
    • 在清理缓存时,可以先通过 TTL 检查一批键的剩余时间,优先处理那些即将过期的键。

TTLPTTL 是Redis中用于探查键“寿命”的核心工具,理解其返回值的含义以及Redis的过期删除策略,对于编写正确、高效的Redis相关程序至关重要。-1(永生)和 -2(已死)的区别,是使用这两个命令的第一课。