redis过期键删除

介绍

  Redis的过期键删除指的是,对redis中因有效时间到了而对失效数据的处理策略。
  Redis的内存淘汰策略指的是,当操作系统分配给Redis的内存不够使用时,在有新数据存入时,对老数据的处理逻辑。


Redis的过期键删除策略

  因为Redis时完全内存操作的,所以对其来说,内存资源是非常宝贵的,如果一些过期键不删除,就会造成内存资源的大量浪费。

常见的删除策略

  常见的删除策略有三种:

  1. 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
  2. 惰性删除:不主动处理过期键,等待每次从键空间中获取键时,判断该键是否过期,如果过期就删除该键,如果没有,就返回该键。
  3. 定期删除:每隔一定时间,程序对数据库进行一次检查,删除里面的过期键。

定时删除策略

  在设置键的同时,同时给该键创建一个定时器Timer,定时器会在键的过期时间来临时,立即对键进行删除操作。

  • 对内存是最友好的:通过定时器可以保证过期的键及时被删除,不浪费内存空间。
  • 对CPU是最不友好的:在过期键比较多的情况下,删除过期键可能会占用大量的CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。
  • 除此之外,创建一个定时器需要用到Redis服务器中的时间事件,而当前时间事件的实现方式——无序链表,查找一个事件的时间复杂度为O(N)——并不能高效地处理大量时间事件,也就是说这个模式并不高效。

惰性删除策略

  不主动处理键,每次获取键时,检查该键是否过期,如果过期就删除该键,如果没有,就返回该键。

  • 对CPU友好,程序只有在取出键时才会进行检查,这样可以保证只有非做不可的时候才会执行删除操作,而且只会删除相关的键,不会将CPU时间浪费在不相关的键上。
  • 对内存是最不友好的,如果一个键已经过期,没有及时清除,就会占用大量的内存空间,这些内存空间并不会主动释放(除非内存空间不足,内存淘汰)。

定期删除策略

  这是定时删除和惰性删除的一种折中方式。
  每隔一端时间,程序就对数据库进行一次检查,删除里面的过期键。检查多少个数据库,删除多少键则由算法决定。
  并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效地减少了因为过期键而带来的内存浪费。

  定期删除的问题在于,确定删除操作的执行时间和频率:

  • 时间过长,频率过高会占用大量的CPU时间,会逐渐退化为定时删除策略。
  • 时间太短,频率太少就不能及时删除过期数据,占用大量内存空间,会退化为惰性删除策略。

过期键删除实现

  Redis服务器实际上使用的是惰性删除策略和定期删除策略。

惰性删除的实现

  过期键的惰性删除策略由expireIfNeeded函数实现,所有读写Redis数据库的操作在执行之前都会调用expireIfNeeded函数对键进行检查:

  • 如果输入键已经过期,那么将输入键从数据库中删除。
  • 如果输入键未过期,那么不做任何处理。

定期删除的实现

  过期键的定期删除策略由activeExpireCycle函数实现,每当Redis服务器周期性执行serverCron函数时,activeExpireCycle函数就会被调用,他在规定的时间内,分多次遍历服务器中的各个数据库(Redis共16个数据库),从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。(随机抽取的办法)
  函数每次运行,会全局的遍历所有的数据库,本次检查0号数据库,下次检查1号数据库,直到15号库,又从0号库开始检查,这样保证每个库都被检查到。每次检查都会从检查的库中抽取一定数量的键来进行检查。
  随机检查的键,一般由算法决定,比如LRU(最近最少使用),LFU(使用频率最低)。


过期键对备份文件的影响

对RDB文件的影响

生成RDB文件时

  在执行save命令或者bgsave命令进行持久化时,程序会对数据库中的键进行检查,已经过期的键不会保存在RDB文件中

载入RDB文件时

  在启动Redis服务器时,如果服务器只开启了RDB持久化,那么服务器将会载入RDB文件:

  • 如果是主服务器,文件中过期的键则不会被加载进数据库中,未过期的键才会加载进数据库中。
  • 如果是从服务器,则全被加载。(主从同步时,从服务器的数据会被清空)

对AOF文件的影响

AOF文件写入

  当过期键被惰性删除或者定期删除后,程序会向AOF文件追加一条DEL命令,显式记录该键已被删除。

AOF文件重写

在执行AOF文件重写时,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中。


主从复制模式

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

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

参考文献 & 鸣谢