Redis 中 key 的过期时间
# 70.Redis 中 key 的过期时间
在实际的开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。在关系数据库中一般需要额外的一个字段记录到期时间,然后定期检测删除过期数据。
# EXPIRE 命令
在 Redis 中可以使用 EXPIRE 命令设置一个键的过期时间,到时间后 Redis 会自动删除它。
EXPIRE 命令的使用方法为 EXPIRE key seconds
,其中 seconds 参数表示键的过期时间,单位是秒。如要想让 session:29e3d
键在 15 分钟后被删除:
redis> SET session:29e3d uid1314
OK
redis> EXPIRE session:29e3d 900
(integer) 1
2
3
4
5
EXPIRE 命令返回 1 表示设置成功,返回 0 则表示键不存在或设置失败。
# TTL 命令
如果想知道一个键还有多久的时间会被删除,可以使用 TTL 命令。返回值是键的剩余时间(单位是秒):
redis> SET foo bar
OK
redis> EXPIRE foo 20
(integer) 1
redis> TTL foo
(integer) 15
redis> TTL foo
(integer) 7
redis> TTL foo
(integer) –2
2
3
4
5
6
7
8
9
10
11
12
13
14
可见随着时间的不同,foo 键的过期时间逐渐减少,20 秒后 foo 键会被删除。当键不存在时 TTL 命令会返回 −2。
那么没有为键设置过期时间(即永久存在,这是建立一个键后的默认情况)的情况下会返回什么呢?答案是返回 −1:
redis> SET persistKey value
OK
redis> TTL persistKey
(integer) –1
2
3
4
5
# PERSIST 命令
如果想取消键的过期时间设置(即将键恢复成永久的),则可以使用 PERSIST 命令。如果过期时间被成功清除则返回 1;否则返回 0(因为键不存在或键本来就是永久的):
redis> SET foo bar
OK
redis> EXPIRE foo 20
(integer) 1
redis> PERSIST foo
(integer) 1
redis> TTL foo
(integer) –1
2
3
4
5
6
7
8
9
10
11
除了 PERSIST 命令之外,使用 SET 或 GETSET 命令为键赋值也会同时清除键的过期时间,例如:
redis> EXPIRE foo 20
(integer) 1
redis> SET foo bar
OK
redis> TTL foo
(integer) –1
2
3
4
5
6
7
8
使用 EXPIRE 命令会重新设置键的过期时间,就像这样:
redis> SET foo bar
OK
redis> EXPIRE foo 20
(integer) 1
redis> TTL foo
(integer) 15
redis> EXPIRE foo 20
(integer) 1
redis> TTL foo
(integer) 17
2
3
4
5
6
7
8
9
10
11
12
13
14
其他只对键值进行操作的命令(如 INCR、LPUSH、HSET、ZREM)均不会影响键的过期时间。
# PEXPIRE 命令、PTTL 命令
EXPIRE 命令的 seconds 参数必须是整数,所以最小单位是 1 秒。
如果想要更精确的控制键的过期时间应该使用 PEXPIRE 命令,PEXPIRE 命令与 EXPIRE 的唯一区别是前者的时间单位是毫秒,即 PEXPIRE key 1000 与 EXPIRE key 1 等价。对应地可以用 PTTL 命令以毫秒为单位返回键的剩余时间。