EXPIREAT、PEXPIREAT:设置过期时间
Redis 用户不仅可以通过设置生存时间来让键在指定的秒数或毫秒数之后自动被移除,还可以通过设置过期时间(expire time),让 Redis 在指定 UNIX 时间来临之后自动移除给定的键。
设置过期时间这一操作可以通过 EXPIREAT
命令或者 PEXPIREAT
命令来完成。其中,EXPIREAT
命令接受一个键和一个秒级精度的 UNIX 时间戳为参数,当系统的当前 UNIX 时间超过命令指定的 UNIX 时间时,给定的键就会被移除:
- EXPIREAT key seconds_timestamp
与此类似,PEXPIREAT
命令接受一个键和一个毫秒级精度的 UNIX 时间戳为参数,当系统的当前 UNIX 时间超过命令指定的 UNIX 时间时,给定的键就会被移除:
- PEXPIREAT key milliseconds_timestamp
EXPIREAT 使用示例
如果我们想要让 msg
键在 UNIX 时间 1450005000 秒之后不再存在,那么可以执行以下命令:
- redis> EXPIREAT msg 1450005000
- (integer) 1
在执行这个 EXPIREAT
命令之后,如果我们在 UNIX 时间 1450005000 秒或之前访问 msg
键,那么 Redis 将返回 msg
键的值:
- redis> GET msg
- "hello world"
另一方面,如果我们在 UNIX 时间 1450005000 秒之后访问 msg
键,那么 Redis 将返回一个空值,因为这时 msg
键已经因为过期而自动被移除了:
- redis> GET msg
- (nil)
表 12-4 展示了 msg
键从设置过期时间到被移除的整个过程。
表 12-4 msg
键从设置过期时间到被移除的整个过程
UNIX 时间(以秒为单位) | 动作 |
---|---|
1450004000 | 执行 EXPIREAT msg 1450005000 命令,将 msg 键的过期时间设置为 1450005000 秒。 |
1450004001 | msg 键未过期,不做动作。 |
1450004002 | msg 键未过期,不做动作。 |
1450004003 | msg 键未过期,不做动作。 |
…… | …… |
1450004999 | msg 键未过期,不做动作。 |
1450005000 | msg 键未过期,不做动作。 |
1450005001 | 系统当前的 UNIX 时间已经超过 1450005000 秒,移除 msg 键。 |
PEXPIREAT 命令使用示例
以下是一个使用 PEXPIREAT
命令设置过期时间的例子,这个命令可以将 number
键的过期时间设置为 UNIX 时间 1450005000000 毫秒:
- redis> PEXPIREAT number 1450005000000
- (integer) 1
在 UNIX 时间 1450005000000 毫秒或之前访问 number
键可以得到它的值:
- redis> GET number
- "10086"
而在 UNIX 时间 1450005000000 毫秒之后访问 number
键则只会得到一个空值,因为这时 number
键已经因为过期而自动被移除了:
- redis> GET number
- (nil)
表 12-5 展示了 number
键从设置过期时间到被移除的整个过程。
表 12-5 number
键从设置过期时间到被移除的整个过程
UNIX 时间(以毫秒为单位) | 动作 |
---|---|
1450003000000 | 执行 PEXPIREAT number 1450005000000 命令,将 number 键的过期时间设置为 1450005000000 毫秒。 |
1450003000001 | number 键未过期,不做动作。 |
1450003000002 | number 键未过期,不做动作。 |
1450003000003 | number 键未过期,不做动作。 |
…… | …… |
1450004999999 | number 键未过期,不做动作。 |
1450005000000 | number 键未过期,不做动作。 |
1450005000001 | 系统当前的 UNIX 时间已经超过 1450005000000 毫秒,移除 number 键。 |
更新键的过期时间
跟 EXPIRE
/ PEXPIRE
命令会更新键的生存时间一样,EXPIREAT
/ PEXPIREAT
命令也会更新键的过期时间:如果用户在执行 EXPIREAT
命令或 PEXPIREAT
命令的时候,给定键已经带有过期时间,那么命令首先会移除键已有的过期时间,然后再为其设置新的过期时间。
比如在以下调用中,第二条 EXPIREAT
命令就将 msg
键的过期时间从原来的 1500000000
修改成了 1600000000
:
- redis> EXPIREAT msg 1500000000
- (integer) 1
- redis> EXPIREAT msg 1600000000
- (integer) 1
自动过期特性的不足之处
无论是本节介绍的 EXPIREAT
/ PEXPIREAT
,还是前面介绍的 EXPIRE
/ PEXIRE
,它们都只能对整个键进行设置,而无法对键中的某个元素进行设置:比如说,用户只能对整个集合或者整个散列设置生存时间/过期时间,但是却无法为集合中的某个元素或者散列中的某个字段单独设置生存时间/过期时间,这也是目前 Redis 的自动过期功能不足的一个地方。
其他信息
属性 | 值 |
---|---|
复杂度 | EXPIREAT 命令和 PEXPIREAT 命令的复杂度都为 O(1) 。 |
版本要求 | EXPIREAT 命令从 Redis 1.2.0 版本开始可用,PEXPIREAT 命令从 Redis 2.6.0 版本开始可用。 |