EXPIRE、PEXPIRE:设置生存时间

用户可以通过执行 EXPIRE 命令或者 PEXPIRE 命令,为键设置一个生存时间(TTL,time to live):键的生存时间在设置之后就会随着时间的流逝而不断地减少,当一个键的生存时间被消耗殆尽时,Redis 就会移除这个键。

Redis 提供了 EXPIRE 命令用于设置秒级精度的生存时间,它可以让键在指定的秒数之后自动被移除:

  1. EXPIRE key seconds

PEXPIRE 命令则用于设置毫秒级精度的生存时间,它可以让键在指定的毫秒数之后自动被移除:

  1. PEXPIRE key milliseconds

EXPIRE 命令和 PEXPIRE 命令在生存时间设置成功时返回 1 ;如果用户给定的键并不存在,那么命令返回 0 表示设置失败。

以下是一个使用 EXPIRE 命令的例子:

  1. redis> SET msg "hello world"
  2. OK
  3.  
  4. redis> EXPIRE msg 5
  5. (integer) 1
  6.  
  7. redis> GET msg -- 5 秒钟之内访问,键存在
  8. "hello world"
  9.  
  10. redis> GET msg -- 5 秒钟之后访问,键不再存在
  11. (nil)

上面的代码通过执行 EXPIRE 命令为 msg 键设置了 5 秒钟的生存时间:

  • 如果我们在 5 秒钟之内访问 msg 键,那么 Redis 将返回 msg 键的值 "hello world"

  • 但如果我们在 5 秒钟之后访问 msg 键,那么 Redis 将返回一个空值,因为 msg 键已经自动被移除了。

表 12-1 展示了 msg 键从设置生存时间到被移除的整个过程。


表 12-1 msg 键从设置生存时间到被移除的整个过程

时间(以秒为单位)动作
0000执行 EXPIRE msg 5 ,将 msg 键的生存时间设置为 5 秒钟。
0001msg 键的生存时间变为 4 秒钟。
0002msg 键的生存时间变为 3 秒钟。
0003msg 键的生存时间变为 2 秒钟。
0004msg 键的生存时间变为 1 秒钟。
0005msg 键因为过期被移除。

而以下则是一个使用 PEXPIRE 命令的例子:

  1. redis> SET number 10086
  2. OK
  3.  
  4. redis> PEXPIRE number 6500
  5. (integer) 1
  6.  
  7. redis> GET number -- 6500 毫秒(也即是 6.5 秒)之内访问,键存在
  8. "10086"
  9.  
  10. redis> GET number -- 6500 毫秒之后访问,键不再存在
  11. (nil)

表 12-2 展示了 number 键从设置生存时间到被移除的整个过程。


表 12-2 number 键从设置生存时间到被移除的整个过程

时间(以毫秒为单位)动作
0000执行 PEXPIRE number 6500 ,将 number 键的生存时间设置为 6500 毫秒。
0001number 键的生存时间变为 6499 毫秒。
0002number 键的生存时间变为 6498 毫秒。
0003number 键的生存时间变为 6497 毫秒。
…………
6497number 键的生存时间变为 3 毫秒。
6498number 键的生存时间变为 2 毫秒。
6499number 键的生存时间变为 1 毫秒。
6500number 键因为过期而被移除。

更新键的生存时间

当用户对一个已经带有生存时间的键执行 EXPIRE 命令或是 PEXPIRE 命令时,键原有的生存时间将会被移除,并设置上新的生存时间。

举个例子,如果我们执行以下命令,将 msg 键的生存时间设置为 10 秒钟:

  1. redis> EXPIRE msg 10
  2. (integer) 1

然后在 10 秒钟之内执行以下命令:

  1. redis> EXPIRE msg 50
  2. (integer) 1

那么 msg 键的生存时间将被更新为 50 秒钟,并重新开始倒数,表 12-3 展示了这个更新过程。


表 12-3 msg 键生存时间的更新过程

时间(以秒为单位)动作
0000执行 EXPIRE msg 10 命令,将 msg 键的生存时间设置为 10 秒钟。
0001msg 键的生存时间变为 9 秒钟。
0002msg 键的生存时间变为 8 秒钟。
0003msg 键的生存时间变为 7 秒钟。
0004执行 EXPIRE msg 50 命令,将 msg 键的生存时间更新为 50 秒钟。
0005msg 键的生存时间变为 49 秒钟。
0006msg 键的生存时间变为 48 秒钟。
0007msg 键的生存时间变为 47 秒钟。
…………

其他信息

属性
复杂度EXPIRE 命令和 PEXPIRE 命令的复杂度都为 O(1)
版本要求EXPIRE 命令从 Redis 1.0.0 版本开始可用,PEXPIRE 命令从 Redis 2.6.0 版本开始可用。