Redis对象自动过期

在构建应用时,我们常常会碰到一些在特定时间之后就不再有用的数据,比如:

  • 随着内容的不断更新,一个网页的缓存可能在5min之后就没有阅读价值了,为了让用户能够及时地获取到最新的信息,程序必须定期移除旧缓存并设置新缓存。
  • 为了保障用户的信息安全,应用通常会在用户登录一周或者一个月之后移除用户的一些会话信息,然后通过强制要求用户重新登录来创建新的会话。
  • 程序在进行聚合计算的时候,常常会创建出大量临时数据,这些数据在计算完毕之后通常不再有用,而且存储这些数据会花费大量内存空间和磁盘空间。

遇到上述情况时,我们虽然可以自行编写程序来处理这些不再有用的数据,但如果数据库本身能够提供自动移除无用数据的功能,就会给程序设计带来很多的便利。为了解决这个问题,Redis提供了键的自动过期功能(key expiring)。通过这个功能,用户可以让特定的键在指定的时间之后自动被移除,从而避免了须要在指定时间内手动执行删除操作的麻烦。

过期命令使用

expire、pexpire:设置过期时间

用户可以通过执行expire命令或者pexpire命令为键设置一个生存时间(time to live,ttl),键的生存时间在设置之后就会随着时间的流逝而不断地减少,当一个键的生存时间被消耗殆尽时,Redis会自动移除这个键。

Redis提供了expire命令用于设置秒级精度的过期时间,它可以让键在指定的秒数之后自动被移除

expire key seconds

而 pexpire命令则用于设置毫秒级精度的过期时间,它可以让键在指定的毫秒数之后自动被移除

pexpire key milliseconds

expire命令和pexpire命令在过期时间设置成功时返回1;如果用户给定的键不存在,那么命令返回0表示设置失败

上图示例,通过set命令设置键值对 ex1-value1,通过expire为该键值对设置生存时间100秒

上图示例,通过pexpire命令对键值对ex2 设置生存时间10000毫秒。

我们试着给一个不存在的键通过expire设置过期时间,会返回0表示设置失败

当用户对一个已经带有生存时间的键执行expire命令或pexpire命令时,键原有的生存时间将会被移除,并设置新的生存时间。

上图示例,在给键eex设置生存时间10秒(expire eex 10)后,再次设置生存时间为100秒(expire eex 100)的时候,先前设置的生存时间10秒会自动被移除,以新的生存时间100秒为准。

set命令的ex选项和px选项

在使用键过期功能时,组合使用set命令和expire/pexpire命令的做法非常常见,为了方便用户组合使用set和expire/pexpire命令,Redis从2.6.12版本开始为set命令提供ex选项和px选项,用户可以通过使用这两个选项的其中一个来达到同时执行set命令和expire/pexpire命令的效果

set key value [ex seconds] [px milliseconds]

也就是说,我们之前执行的set命令和expire命令

set key value

expire key seconds

那么现在只须要执行一条带有ex选项的set命令就可以了

set key value ex seconds

同样,如果之前执行的set命令和pexpire命令

set key value

pexpire key milliseconds

那么现在只须要执行一条带有px选项的set命令就可以了

set key value px milliseconds

上图示例,上面的set 和 expire 命令,可以通过set ke value ex 10 命令一次完成设置值和设置生存时间操作。

使用带有ex选项或者px选项的set命令除了可以减少命令的调用数量并提升程序的执行速度之外,更重要的是保证了操作的原子性,使得“为键设置值set操作”和“为键设置过期时间expire/pexpire操作”可以一起执行。

比如,前面示例中为键设置过期时间,首先使用set命令设置键值对,然后又使用expire命令为键值对设置生存时间,这相当于让程序依次向Redis服务器发送了两条命令

set key value

expire key timeout

因为这两条命令是完全独立的,所以服务器在执行它们的时候,可能出现set命令被执行了,但是expire命令却没有执行的情况。比如,如果Redis服务器在成功执行set命令之后因为故障下线,导致expire命令没有被执行,那么set命令设置的缓存就会一直存在,而不会因为国企而自动被移除。与此相反,使用带有ex选项或者px选项的set命令就没有这个问题:当服务器成功执行了一条带有ex选项或者px选项的set命令时,键的值和生存时间都会被设置好,因此程序就不会出现只设置了值但是却没有设置生存时间的情况。

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命令对键regards设置过期时间为1613715600,换算下来1613715600为 2021-02-19 14:20:00,该对象在21年2月19日14点20分过期。设置过期时间后,在过期之前,使用ttl查看regards键剩余时间,在达到14点20后,使用ttl查看剩余时间时,结果为-2,表示键不存在。

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

expire和expireat命令都可以设置键的存活时间,不同点有以下:

  • expire后面跟着的时间为从设置的当前时间开始,键可以存活的时间秒数。如20,从设置时候开始数20秒
  • expireat后面跟着的时间为某一个具体的时刻点。如时间戳1613715600为 2021-02-19 14:20:00,该对象到2021-02-19 14:20:00过期。

无论是expire/pexpire命令或expireat/pexpireat命令都只能对整个键进行设置,而无法对键中的某个元素进行设置。比如,用户只能对整个集合或者散列表设置生存/过期时间,但是却无法为集合中的某个元素或者散列表中的某个字段单独设置生存时间/过期时间。

ttl、pttl:获取键的剩余生存时间

在为键设置了生存时间或者过期时间后,用户可以通过ttl命令或者pttl命令查看键剩余生存时间,即键还有多久会过期而被移除。

其中,ttl命令将以秒为单位返回键的剩余生存时间

ttl key

而 pttl命令则以毫秒为单位返回键的剩余生存时间

pttl key

如果给定的键存在,但是没有设置生存时间或者过期时间,那么ttl命令和pttl命令将返回-1,表示该键永久有效,不会被自动移除。

如果给定的键不存在,那么ttl命令和pttl命令将返回-2。

上图示例,设置键ttlkey过期时间为20秒,设置后,立即使用ttl命令来查看ttlkey的剩余存活时间为18秒,再过十几秒钟,使用pttl命令查看ttlkey的存活时间为1062毫秒,再换ttl命令来查看ttlkey的存活时间时,由于ttlkey已经失效被移除,ttl命令找不到对应的键ttlkey,返回-2。

在使用ttl命令时,有时候会遇到命令返回0的情况。出现这种情况的原因在于ttl命令只能返回秒级精度的生存时间,所以当给定键的剩余时间不足一秒时,ttl命令只能返回0作为结果。这时,如果使用精度更高的pttl命令去检查这些键,就会看到它们实际的剩余生存时间。这个场景比较难操作处理,手速跟不上,就不做示例展示了。

自动过期总结

1、expire命令和pexpire命令可以为键设置生存时间,当键的生存时间随着时间的流逝而消逝殆尽时,键就会被移除

2、对已经带有生存时间的键执行expire命令或pexpire命令,将导致键已有的生存时间被新的生存时间替代

3、为了方便用户,Redis给set命令增加了ex和px选项,它们可以让用户在执行set命令的同时,执行expire命令或pexpire命令

4、expireat命令和pexpireat命令可以为键设置Unix时间戳格式的过期时间,当系统时间超过这个过期时间时,键就会被移除

5、Redis的自动过期特性只能应用于整个键,它无法对键中的某个元素单独执行过期操作

6、ttl命令和pttl命令可以分别以秒级和毫秒级两个精度来获取键的剩余生存时间

7、通过重复对键执行expire命令或pexpire命令,程序可以构建出一种自动淘汰冷数据并保留热数据的机制

 

 

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/113857342