Redis——键的过期时间

6个月前 (05-31) wang 个人日志 0评论 已收录 152℃ 浏览数:131

一个键可以设置生存时间,那么一个键过期了,那么它什么时候会被删除呢?

这个问题有三种答案,分别代表三种不同的删除策略。

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立刻执行对键的删除操作。
  • 惰性删除:放任键过期不管,但是每次从键空间获取值的时候,都检查键是否过期,如果过期的话,就删除该键,如果没有过期,返回该值。
  • 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及检查多少个数据库,由算法觉得。

这三种策略中,第一种和第三种为主动删除策略,第二种为被动删除策略。

一、定时删除

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

但是缺点也很明确,对CPU是最不友好的,在过期键过的情况下,删除的操作会占用相当一部分的CPU时间,在内存不紧张,但是CPU紧张的情况下,将CPU时间放在删除或者当前任务无关的过期键上,会对服务器的响应时间和吞吐量造成影响。

二、惰性删除

惰性删除策略对CPU来说是最有好的,程序只会在取出键的时候才会对键进行过期检查,这样可以保证过期键的删除只会在非做不可的情况下进行,并且删除只针对于当前键,不会浪费时间在其他无关键上面。

但是缺点同样很明显,是对内存最不友好的,如果一个键已经过期,但是长时间没有访问,就会导致占用的内容一直没被释放。

如果数据库种有非常多的过期键,而这些过期键恰好长时间没被访问,那么他们永远不会被删除。我们可以看作是一种内存泄漏,无用的垃圾数据占用了大量的内存。

三、定时删除

两种方式在单一的使用都有明显的缺陷。

  • 定时删除占用太多CPU空间,惰性删除太耗内存。

定期删除是前两种策略的整合和一种折中。

定期删除策略每隔一段时间执行一次删除过期键的操作,通过限制操作的时长和频率减少对CPU得以影响。

但是难点是如何确认删除操作执行的时长和频率。

  • 如果删除操作执行的太频繁,或者执行的时间太长,就会对CPU造成很大的影响。
  • 如果删除操作执行的太少,或者执行的时间太短,就会出现浪费内存的情况。

因此,需要服务器根据情况,合理设置删除操作的执行时长和执行频率。

 

Redis的过期键删除策略

Redis使用的是惰性删除和定期删除两种策略,通过配合两种策略,在合理使用CPU时间和浪费内存中取得的一个平衡。

  1. Redis得定期删除函数每次运行时,都从一定数量得数据库取出一定数量的随机键进行检查,并且删除其中的过期键。
  2. 全局变量会记录当前检查的进度,而下次函数调用时,接着上一次的进度进行处理。
  3. 随着函数的不断执行,服务器中所有数据库都会被检查一遍,这时开始一次新一轮的检查工作。

 

 

博主

Just do it. Now or never.

相关推荐

嗨、骚年、快来消灭0回复。