redis支持两种过期删除策略:定期扫描删除和惰性删除
定期扫描策略
redis会将所有设置了过期时间的key放到一个独立字典中,会定期的扫描该字典,到期的key会被清除。过期删除并不会删除全部,而是采用了一种非常有意思的策略:贪心策略。
1、随机从过期字典中选出20个key。
2、判断20个key中已过期的key,并删除。
3、如果过期的key超过1/4,就重复第一步。
这样就会导致一个问题:如果业务端有大量的同时过期的key,就会导致redis在某一时间段频繁进行过期扫描删除而出现卡顿现象。所以redis对过期扫描做了限制。
1、默认每秒10次过期扫描
2、扫描时间上限为25ms
即便如此,极端场景下,redis依然可能会出现25ms卡顿的现象,所以我们在做业务时,如果有大量同时过期的key时,就应该考虑将过期时间随机散列,以减少redis过期扫描带来的卡顿现象。
惰性删除策略
所谓惰性删除策略,顾名思义就是不会主动删除,而是客户端访问某个key时,对过期时间进行检查,如果过期则删除。
从库删除策略
从库是不会直接执行删除策略的,而是主库删除后会在AOF文件中记录一条del
指令。从库同步到这条指令后执行删除。