Redis过期删除策略

设置键的生存时间或过期时间

          通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的时间之后,服务器就会自动删除生存时间为0的键。

set key value
EXPIRE key 5
GET key 
 

       与EXPIRE命令和PEXPIRE命令类似,客户端可以通过EXPIREAT命令或PEXPIREAT命令,以秒或毫秒精度给键设置过期时间(expire time).过期时间是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键。

SET key value
EXPIREAT key 1371234567
TIME  //当前时间
GET key
TIME  //当前时间
GET key
        TTL命令和PTTL命令接收一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间,也就是距离这个键被服务器自动删除还有多长时间。
SET key value
EXPIRE key 1000
TTL key
PTTL msg
     Redis有四种不同的命令可以用于设置键的生存时间。
  • EXPIRE $key $TTL   设置key的过期时间为TTL秒
  • PEXPIRE $key $TTL 设置key的过期时间为TTL毫秒
  • XPIREAT $key $timestamp 设置key过期时间为指定的timestamp秒数
  • PXPIREAT $key $timestamp 设置key过期时间为指定的timestamp毫秒数

过期键删除策略

      如果一个键过期了,可能会有三种删除策略:定时删除、惰性删除、定期删除。

定时删除

        定时删除策略对内存是最友好的,通过使用定时器,定时删除策略可以保证过期键会尽可能快的被删除,并释放过期键所占用的内存。

        另一方面,定时删除策略缺点是,它对CPU时间是不友好的,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐造成影响。

惰性删除

       惰性删除策略对CPU时间来说是友好的,程序只会在取出键时才进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会再删除其他无关的键上花费任何时间。

      惰性删除的缺点是,它对内存是不友好的,如果一个键已经过期,而这个键有仍然保留在数据库中,那么只要这个键不被删除,内存就不会释放。在使用惰性删除策略是,如果数据库中有非常多的过期键,而这些过期键又敲好没有被访问到,那么他们永远也不会被删除。

定期删除

      从定时删除和惰性删除来看,这两种删除方式单一--使用时都有明显的缺陷:

  • 定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量
  • 惰性删除浪费太多内存,有内存泄漏的危险

定期删除时前两种策略的一个折中:

  • 定期删除策略每隔一段时间执行一次删除过期键的操作,并通过限制删除操作执行时常和频率来减少删除操作对CPU时间的影响
  • 通过定期删除键,定期删除策略有效的减少了因为过期而带来的内存浪费

定期删除策略的难点是确定删除执行的时长和频率:

  • 如果删除操作执行的太频繁或者执行的时间太长,定期删除策略会退化成定时删除策略,以至于将CPU时间过多地消耗在删除过期键上面。
  • 如果删除操作执行的太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。

    因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除策略执行的时间和执行频率。

RDB和复制功能对过期键的处理

      在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。因此,数据库中包含过期键不会对生成新的RDB文件造成影响。

      在启动redis服务器时,如果服务器开启了RDB功能,那么服务器将对RDB文件进行载入:

  • 如果服务器以主服务器模式运行,那么在载入RDB文件时,程序会对文件保存的键进行检查,未过期的键会被载入到数据库中,而过期键则会被忽略,所以过期键对载入RDB文件的嘱咐其不会造成影响。
  • 如果以从服务器模式运行,那么在载入RDB文件时,文件中保存的所有键,不论是否过期,都会被载入到数据库中。不过,因为主从服务器在进行数据同步的时候,从服务器的数据就会被清空,所以一般来讲,过期键对载入RDB文件的从服务器也不会造成影响。

      当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制:

  • 主服务器在删除一个过期键之后,会显式的向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键
  • 从服务器在执行客户端发送的读命令是,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键。
  • 从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。

      通过主服务器来控制从服务器统一删除过期键,可以保证主从服务器数据一致,也正是因为这个原因,当一个过期键仍然存在于主服务器的数据库时,这个过期键在从服务器的复制时也会继续存在。

猜你喜欢

转载自woodding2008.iteye.com/blog/2296475