这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
Redis的过期键删除策略
我们知道过期键的删除策略有定时删除、惰性删除和定期删除,redis服务器实际使用的是惰性删除和定期删除
惰性删除
惰性删除策略在db.c的expireIfNeeded
1 | c复制代码/* |
所有读写数据库的redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查,如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除,如果输入键未过期,不删除键
定期删除
定期删除策略在redis,c的activeExpireCycle中,当redis的服务器周期性操作redis.c的serverCron函数的时候调用activeExpireCycle,在规定时间内分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键
每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键
全局变量current_db会记录当前activeExpireCycle函数检查的进度,并在下一次activeExpireCycle函数调用时,接着上一次进度进行处理
随着activeExpireCycle的不断执行,服务器的所有数据都会被检查一遍,这时函数将current_db变量重置为0,然后再次进行新一轮的检查
本文转载自: 掘金