Redis的过期键删除策略

我们都知道数据库键的过期时间都保存在过期字典中,那么如果一个键过期了,那么什么时候会被删除呢?

以下三种不同的删除策略:

  • 定时删除: 在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行删除键。
  • 惰性删除:放任过期键不管,每次获取键时,先检查取得的键是否过期,如果过期,就删除;如果没,就返回该键。
  • 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,检查多少个数据库,则由算法决定。

这三种策略中,第一个和第三个是主动删除策略,第二个是被动删除策略。
下面我们来说明三种算法的优缺点:
1.定时删除

优点:这是对内存最友好的,通过使用定时器,可以保证过期键尽可能快的被删除,并释放所占用的内存。
缺点:对CPU不友好,在过期键比较多的时候,删除过期键操作会占用过多CPU时间,在内存不紧张,CPU紧张时,把CPU的时间用在删除和当前任务无关的过期键上,而不能及时响应客户端请求,对服务器的响应时间和吞吐量造成很大影响。
所以让服务器创建大量定时间,实现定时删除策略,目前不现实

2.惰性删除

优点:这是对CPU时间最友好的,程序只有取出键的时候才对键检查是否删除,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,而不会在删除其他无关的过期键上花费任何CPU时间。
缺点:对内存不友好,如果数据库中有很多键过期了,但这些键又不会被访问到,那么就永远不会被删除,从而占用很多内存,这可以被看作一种内存泄露-无用的垃圾数据占用了大量内存,由于redis是内存数据库,所以这不是一个好的现象。

3.定期删除

从上面定时删除和惰性删除来个,各有所长,也各有缺陷。

  • 定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量。
  • 惰性删除可能会浪费太多内存,会发生内存泄露危险。

所以定期策略就采用了两者的整合和折中:
优点:

  • 定期删除每隔一段时间执行一次删除过期键操作,并通限制删除操作执行时长和频率减少删除操作对CPU时间的影响。
  • 还有通过定期删除,可以减少内存浪费。

但定期删除也有缺点:难以确定删除操作执行的时长和频率

  • 如果删除操作执行太频繁,或执行时间太长,定期删除就退化成定时删除了,以至于浪费CPU时间在删除过期键上。
  • 如果删除操作执行的太少,或执行时间太短,又和惰性删除一样,出现浪费内存现象。

因此,采用定期删除策略的话,服务器需根据情况,合理地设置删除操作的执行时长和频率。

猜你喜欢

转载自blog.csdn.net/weixin_43155301/article/details/83653526