redis 设置键过期时间

Jackey Redis 3,495 次浏览 , 没有评论

键过期功能的相关命令

  • 设置生存时间: EXPIRE 命令和 PEXPIRE 命令。
  • 设置过期时间: EXPIREAT 命令和 PEXPIREAT 命令。
  • 查看剩余生存时间: TTL 命令和 PTTL 命令。
  • 删除生存时间或过期时间: PERSIST 命令。

设置生存时间

EXPIRE key seconds 将键 key 的生存时间设置为指定的秒数。
PEXPIRE key milliseconds 将键 key 的生存时间设置为指定的毫秒数。

如果给定的键不存在,那么 EXPIRE 和 PEXPIRE 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功。
当一个键被设置了生存时间之后,它的生存时间将会随着时间的流逝而减少:时间过去一毫秒,键的生存时间就减少一毫秒;时间过去一秒钟,键的生存时间就减少一秒钟;以此类推。
当一个键的生存时间被减少至低于 0 时,Redis 就会自动将这个键删除掉。

redis> SET msg "hello world"
OK
redis> EXPIRE msg 5 # 设置生存时间
(integer) 1
redis> EXISTS msg # 仍然存在
(integer) 1
redis> EXISTS msg # 已被自动删除
(integer) 0

redis> PEXPIRE number 5500
(integer) 1
redis> EXISTS number
(integer) 1
redis> EXISTS number
(integer) 0

严格来说,设置生存时间为 5 ,会让键存在 6 秒钟。

设置过期时间

EXPIREAT key timestamp 将键 key 的过期时间设置为指定的秒级 UNIX 时间戳。
PEXPIREAT key milliseconds-timestamp 将键 key 的过期时间设置为指定的毫秒级 UNIX 时间戳。

如果给定的键不存在,那么 EXPIREAT 和 PEXPIREAT 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功。
对于被设置了过期时间的键来说,当键的过期时间小于当前时间的时候,Redis 就会自动地删除该键。

redis> SET msg "time to go"
OK
redis> EXPIREAT msg 1588498909
(integer) 1
redis> EXISTS msg # 1588498909 之前
(integer) 1
redis> EXISTS msg # 1588498909 之后
(integer) 0

redis> SET song "Last Night, Good Night"
OK
redis> PEXPIREAT song 1588498908000
(integer) 1
redis> EXISTS song # 1588498908000 之前
(integer) 1
redis> EXISTS song # 1588498908000 之后
(integer) 0

生存时间和过期时间的区别

设置生存时间和设置过期时间都可以让 Redis 自动删除指定的键,它们的区别在于设置“键什么时候要被删除”的方式不同:
• EXPIRE 和 PEXIRE 的作用是让键在 N 秒钟或者 N 毫秒之后被删除。
• 而 EXPIREAT 和 PEXPIREAT 的作用则是让键在指定的 UNIX 时间到达之后被删除。
带有生存时间的键就像是一个倒计时器,它会倒数 5、4、3、2、1、0,然后被删掉。
而带有过期时间的键则像是一个定时器,它会在指定的时间来临之后被删掉。

返回键的剩余生存时间

TTL key 以秒为单位,返回键的剩余生存时间。
PTTL key 以毫秒为单位,返回键的剩余生存时间。

TTL 和 PTTL 可能会返回三种不同的 值:

  • -2 键不存在。
  • -1 键存在,但没有设置过期时间或者生存时间。
  • >= 0 键的剩余生存时间。

redis> SET msg "hello"
OK
redis> EXPIRE msg 10086
(integer) 1
redis> TTL msg
(integer) 10083
redis> PTTL msg
(integer) 10079336

redis> SET number 10086
OK
redis> EXPIREAT number 1408498480
(integer) 1
redis> TTL number # 距离 14...80 的秒数
(integer) 15
redis> PTTL number # 距离 14...80 的毫秒数
(integer) 11651

注意,Redis 并没有提供查看键的过期时间的命令,所以对于一个设置了过期时间的键来说,我们只能使用TTL 和 PTTL 来查看它的剩余生存时间。

移除键的过期时间或生存时间

PERSIST key
移除为键 key 设置的过期时间或生存时间,使得它不会被 Redis 自动删除。
移除成功时命令返回 1 ;如果命令没有设置过期时间或生存时间,那么命令返回 0 。

redis> SET msg "hello"
OK
redis> EXPIRE msg 30
(integer) 1
redis> TTL msg
(integer) 28
redis> PERSIST msg
(integer) 1
redis> TTL msg
(integer) -1

redis> SET number 10086
OK
redis> EXPIREAT number 1408499100
(integer) 1
redis> TTL number
(integer) 25
redis> PERSIST number
(integer) 1
redis> TTL number
(integer) -1

SETEX 命令

因为
SET key value
EXPIRE key seconds
这个模式经常出现,所以 Redis 在 2.0 版本新增了 SETEX 命令:
SETEX key seconds value
这个命令相当于原子地执行 SET 命令和 EXPIRE 命令。

PSETEX 命令

在 Redis 2.6.0 ,Redis 开始支持毫秒精度的过期时间和生存时间,并增加了相应的 PEXPIRE、PEXPIREAT、PTTL 三个命令,以及 PSETEX 命令:
PSETEX key milliseconds value
执行这个命令相当于原子地执行以下两个命令:
SET key value
PEXPIRE key milliseconds

SET 命令对生存时间的支持

在 Redis 2.6.12 版本,Redis 又对 SET 命令进行了修改,让它支持可选的 EX 参数和 PX 参数:
SET key value [EX seconds] [PX milliseconds]
执行 SET key value EX seconds 相当于执行 SETEX key seconds value ;
而执行 SET key value PX milliseconds 相当于执行 PSETEX key milliseconds value 。
尽管目前 SETEX 和 PSETEX 都能正常使用,还是建议尽量使用 SET 而不是 SETEX 或者PSETEX ,因为使用 SET 来设置生存时间更简洁一些,而比较旧的 SETEX 和 PSETEX 在将来可能会被废弃

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go