首页 > 代码库 > Redis附加功能之键过期功能
Redis附加功能之键过期功能
一、键过期功能的相关命令
二、设置生存时间
Redis 提供了两个命令来设置键的生存时间(TTL,time to live),它们分别是:
如果给定的键不存在,那么 EXPIRE 和 PEXPIRE 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功。
当一个键被设置了生存时间之后,它的生存时间将会随着时间的流逝而减少:时间过去一毫秒,键的生存时间就减少一毫秒;时间过去一秒钟,键的生存时间就减少一秒钟;以此类推。
当一个键的生存时间被减少至低于 0 时,Redis 就会自动将这个键删除掉。
EXPIRE示例:
redis> SET msg "hello world"OKredis> EXPIRE msg 5 # 设置生存时间(integer) 1redis> EXISTS msg # 仍然存在(integer) 1redis> EXISTS msg # 已被自动删除(integer) 0
严格来说,设置生存时间为 5 ,会让键存在 6 秒钟。
PEXPIRE 示例:
redis> PEXPIRE number 5500(integer) 1redis> EXISTS number(integer) 1redis> EXISTS number(integer) 0
注 1 :一秒钟 = 1000 毫秒
注 2 :Redis 默认每 100 毫秒检查一次键是否过期,所以上表也是以每 100 毫秒为单位列出的。
三、设置过期时间
Redis 提供了两个命令用于设置键的过期时间(expire time):
如果给定的键不存在,那么 EXPIREAT 和 PEXPIREAT 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功。
对于被设置了过期时间的键来说,当键的过期时间小于当前时间的时候,Redis 就会自动地删除该键。
EXPIREAT 示例:
redis> SET msg "time to go"OKredis> EXPIREAT msg 1000000005(integer) 1redis> EXISTS msg # 1000000005 之前(integer) 1redis> EXISTS msg # 1000000005 之后(integer) 0
PEXPIREAT 示例:
redis> SET song "Last Night, Good Night"OKredis> PEXPIREAT song 1000000005500(integer) 1redis> EXISTS song # 1000000005500 之前(integer) 1redis> EXISTS song # 1000000005500 之后(integer) 0
四、生存时间和过期时间的区别
设置生存时间和设置过期时间都可以让 Redis 自动删除指定的键,它们的区别在于设置“键什么时候要被删除”的方式不同:
EXPIRE 和 PEXIRE 的作用是让键在 N 秒钟或者 N 毫秒之后被删除。
EXPIREAT 和 PEXPIREAT 的作用则是让键在指定的 UNIX 时间到达之后被删除。
带有生存时间的键就像是一个倒计时器,它会倒数 5、4、3、2、1、0,然后被删掉。
而带有过期时间的键则像是一个定时器,它会在指定的时间来临之后被删掉。
五、返回键的剩余生存时间
在为一个键设置过期时间或者生存时间之后,用户可以使用 TTL 命令或者 PTTL 命令查看这个键的剩余生存时间,以此来获知键还有多久才会被 Redis 删除:
TTL 和 PTTL 可能会返回三种不同的值:
TTL 和 PTTL 示例:
redis> SET msg "hello"OKredis> EXPIRE msg 10086(integer) 1redis> TTL msg(integer) 10083redis> PTTL msg(integer) 10079336
redis> SET number 10086OKredis> EXPIREAT number 1408498480(integer) 1redis> TTL number # 距离 14...80 的秒数(integer) 15redis> PTTL number # 距离 14...80 的毫秒数(integer) 11651
注意:Redis 并没有提供查看键的过期时间的命令,所以对于一个设置了过期时间的键来说,我们只能使用TTL 和 PTTL 来查看它的剩余生存时间。
六、移除键的过期时间或生存时间
PERSIST key
移除为键 key 设置的过期时间或生存时间,使得它不会被 Redis 自动删除。
移除成功时命令返回 1 ;如果命令没有设置过期时间或生存时间,那么命令返回 0 。
PERSIST示例:
redis> SET msg "hello"OKredis> EXPIRE msg 30(integer) 1redis> TTL msg(integer) 28redis> PERSIST msg(integer) 1redis> TTL msg(integer) -1
redis> SET number 10086OKredis> EXPIREAT number 1408499100(integer) 1redis> TTL number(integer) 25redis> PERSIST number(integer) 1redis> TTL number(integer) -1
Redis附加功能之键过期功能