一:定时删除
策略 : 设置键的过期时间的,对键的删除操作。
优点 : 对内存友好,释放过期键所占用的内存。
缺点 : 对CPU时间不友好,占用太多CPU时间,影响服务器的响应时间和吞吐量。
二:惰性删除
策略 : 只有在读写操作时,检查键是否过期,如果过期,删除该键,如果没有过期,返回该键。
优点 : 对CPU时间友好,读写操作键时才对键进行过期检查。
缺点 : 过期键占用内存,有内存泄漏风险。
三:定期删除
**策略 ?*定时删除和惰性删除的折中。
隔时间执行一次定时删除,并通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。
**难点:**确定删除操作执行的总时长和总频率。执行太频繁,执行时间过长,就会退化成定时删除策略,影响客户端请求效率;执行得太少,执行时间太短,会演变为惰性删除,存在内存浪费的情况。
四:主动清理
内存超过maxmemory限定时,触发主动清理。
清理时会根据用户配置的maxmemory-policy来做适当的清理。
圈起来,要考的!!
Redis 惰性删除和定期删除两种策略,配合使用,很好地在合理使用CPU时间和避免浪费内存之间取得平衡。
举例:
键中随机选取 20 个 key,
遍历,过期 key删除,
过期的 key 比率超过25%,则重复步骤 1。
同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,增加了扫描时间的上限,默认不会超过 25ms以及频次上线10次。