Redis 中提供了三种过期删除的策略
1)惰性删除
惰性删除,当一个键值对过期的时候,只有再次用到这个键值对的时候才去检查删除这个键值对,也就是如果用不着,这个键值对就会一直存在。
优点:对 CPU 是友好的,只有在取出键值对的时候才会进行过期检查,这样就不会把 CPU 资源花费在其他无关紧要的键值对的过期删除上。
缺点:如果一些键值对永远不会被再次用到,那么将不会被删除,最终会造成内存泄漏,无用的垃圾数据占用了大量的资源,但服务器却不能去删除。
2)定时删除
在设置某个 key 的过期时间,同时创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。
优点:通过使用定时器,可以保证过期 key 可以被尽快的删除,并且释放过期 key 所占用的内存
缺点:对 CPU 是不友好的,当过期键比较多的时候,删除过期 key 会占用相当一部分的 CPU 资源,对服务器的响应时间和吞吐量造成影响。
3)定期删除
每隔一段时间执行一次删除(配置redis.conf 的hz选项,默认为10,1s刷新的频率。即1秒执行10次,100ms一次,值越大说明刷新频率越快,Redis性能损耗也越大)过期key操作。
定期删除是对上面两种删除策略的一种整合和折中。
每个一段时间就对一些 key 进行采样检查,检查是否过期,如果过期就进行删除
1、采样一定个数的key,采样的个数可以进行配置,并将其中过期的 key 全部删除;
2、如果过期 key 的占比超过可接受的过期 key 的百分比,则重复删除的过程,直到过期key的比例降至可接受的过期 key 的百分比以下。
优点:定期删除,通过控制定期删除执行的时长和频率,可以减少删除操作对 CPU 的影响,同时也能较少因过期键带来的内存的浪费。
缺点:
a、执行的频率不太好控制
b、频率过快对 CPU 不友好,如果过慢了就会对内存不太友好,过期的键值对不能及时的被删除掉
c、如果一个键值对过期了,但是没有被删除,这时业务再次获取到这个键值对,那就会获取到被删除的数据了,这肯定是不合理的
注意:上面讨论的三种策略,都有或多或少的问题。Redis 中实际采用的策略是惰性删除+定期删除的组合方式:定期删除,获取 CPU 和 内存的使用平衡,针对过期的 KEY 可能得不到及时的删除,当 KEY 被再次获取的时候,通过惰性删除再做一次过期检查,来避免业务获取到过期内容。
标签:策略,删除,过期,键值,内存,key,CPU From: https://www.cnblogs.com/beatle-go/p/18042214