EXPIREAT、PEXPIREAT:设置过期时间

Redis 用户不仅可以通过设置生存时间来让键在指定的秒数或毫秒数之后自动被移除,还可以通过设置过期时间(expire time),让 Redis 在指定 UNIX 时间来临之后自动移除给定的键。

设置过期时间这一操作可以通过 EXPIREAT 命令或者 PEXPIREAT 命令来完成。其中,EXPIREAT 命令接受一个键和一个秒级精度的 UNIX 时间戳为参数,当系统的当前 UNIX 时间超过命令指定的 UNIX 时间时,给定的键就会被移除:

  1. EXPIREAT key seconds_timestamp

与此类似,PEXPIREAT 命令接受一个键和一个毫秒级精度的 UNIX 时间戳为参数,当系统的当前 UNIX 时间超过命令指定的 UNIX 时间时,给定的键就会被移除:

  1. PEXPIREAT key milliseconds_timestamp

EXPIREAT 使用示例

如果我们想要让 msg 键在 UNIX 时间 1450005000 秒之后不再存在,那么可以执行以下命令:

  1. redis> EXPIREAT msg 1450005000
  2. (integer) 1

在执行这个 EXPIREAT 命令之后,如果我们在 UNIX 时间 1450005000 秒或之前访问 msg 键,那么 Redis 将返回 msg 键的值:

  1. redis> GET msg
  2. "hello world"

另一方面,如果我们在 UNIX 时间 1450005000 秒之后访问 msg 键,那么 Redis 将返回一个空值,因为这时 msg 键已经因为过期而自动被移除了:

  1. redis> GET msg
  2. (nil)

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


表 12-4 msg 键从设置过期时间到被移除的整个过程

UNIX 时间(以秒为单位)动作
1450004000执行 EXPIREAT msg 1450005000 命令,将 msg 键的过期时间设置为 1450005000 秒。
1450004001msg 键未过期,不做动作。
1450004002msg 键未过期,不做动作。
1450004003msg 键未过期,不做动作。
…………
1450004999msg 键未过期,不做动作。
1450005000msg 键未过期,不做动作。
1450005001系统当前的 UNIX 时间已经超过 1450005000 秒,移除 msg 键。

PEXPIREAT 命令使用示例

以下是一个使用 PEXPIREAT 命令设置过期时间的例子,这个命令可以将 number 键的过期时间设置为 UNIX 时间 1450005000000 毫秒:

  1. redis> PEXPIREAT number 1450005000000
  2. (integer) 1

在 UNIX 时间 1450005000000 毫秒或之前访问 number 键可以得到它的值:

  1. redis> GET number
  2. "10086"

而在 UNIX 时间 1450005000000 毫秒之后访问 number 键则只会得到一个空值,因为这时 number 键已经因为过期而自动被移除了:

  1. redis> GET number
  2. (nil)

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


表 12-5 number 键从设置过期时间到被移除的整个过程

UNIX 时间(以毫秒为单位)动作
1450003000000执行 PEXPIREAT number 1450005000000 命令,将 number 键的过期时间设置为 1450005000000 毫秒。
1450003000001number 键未过期,不做动作。
1450003000002number 键未过期,不做动作。
1450003000003number 键未过期,不做动作。
…………
1450004999999number 键未过期,不做动作。
1450005000000number 键未过期,不做动作。
1450005000001系统当前的 UNIX 时间已经超过 1450005000000 毫秒,移除 number 键。

更新键的过期时间

EXPIRE / PEXPIRE 命令会更新键的生存时间一样,EXPIREAT / PEXPIREAT 命令也会更新键的过期时间:如果用户在执行 EXPIREAT 命令或 PEXPIREAT 命令的时候,给定键已经带有过期时间,那么命令首先会移除键已有的过期时间,然后再为其设置新的过期时间。

比如在以下调用中,第二条 EXPIREAT 命令就将 msg 键的过期时间从原来的 1500000000 修改成了 1600000000

  1. redis> EXPIREAT msg 1500000000
  2. (integer) 1
  3.  
  4. redis> EXPIREAT msg 1600000000
  5. (integer) 1

自动过期特性的不足之处

无论是本节介绍的 EXPIREAT / PEXPIREAT ,还是前面介绍的 EXPIRE / PEXIRE ,它们都只能对整个键进行设置,而无法对键中的某个元素进行设置:比如说,用户只能对整个集合或者整个散列设置生存时间/过期时间,但是却无法为集合中的某个元素或者散列中的某个字段单独设置生存时间/过期时间,这也是目前 Redis 的自动过期功能不足的一个地方。

其他信息

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