一、过期键删除三种策略简介
1、定时删除策略
在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点:对内存是最友好的,保证过期键会尽可能快地被删除,并释放过期键所占用的内存。
缺点:对cpu时间是最不友好的,过期键比较多的情况下,删除键会占用相当一部分的cpu时间,无疑会对服务器的响应时间和吞吐量造成影响。
2、惰性删除策略
程序只会在取出键时才对键进行过期检查。
优点:对cpu时间来说是最友好的,可以保证过期键的删除操作只会在非做不可的情况下进行,并且删除目标仅限于当前处理的键。
缺点:对内存是最不友好的,如果一个键已经过期,而这个键又仍然保留在数据库中,只要过期键不被删除,占用的内存就不会被释放。
3、定期删除策略
每隔一段时间执行一次删除过期键的操作,通过限制删除操作执行时长和频率来减少删除操作对cpu时间的影响,是对定时删除策略和惰性删除策略的整合和折中。
难点是确定删除操作执行的时长和频率,如果删除太频繁或执行时间过长,就会退化称定时删除策略;如果删除操作执行的太少或者执行时间太短,又会退化为惰性删除策略,出现浪费内存的情况。
二、redis的过期删除策略
使用惰性删除和定期删除两种策略,通过两种策略的配合,可以很好地在合理使用cpu时间和避免浪费内存之间取得平衡。
1、惰性删除策略的实现
每当redis服务器的服务器周期性操作serverCron函数执行时,activeExpireCycle函数被调用,分多次遍历服务器
中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。
activeExpireCycle函数的工作模式:
a、函数每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
b、全局变量current_db会记录当前activeExpireCycle函数检查的进度,并在下一次activeExpireCycle函数调用时,
接着上一次的进度进行处理。
c、随着activeExpireCycle函数的不断执行,服务器中的所有数据库都会被检查一遍,这时函数将current_db变量
重置为0,然后再次开始新一轮的检查工作。