缘由:
因为redis数据是基于内存的,然而内存是非常宝贵的资源,然后我们就会对一些不常用或者只用一次的数据进行存活时间设置,这样才能提高内存的使用效率。但是我们在什么时候才把这些过期的数据移除内存呢?是过期马上删除,还是等有许多过期数据之后集中删除?主要有以下几种策略。
- 立即删除
在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。
优点:
立即删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。
缺点:
对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响。
- 惰性过期:
过期不会马上删了,只有当下次访问⼀个key时,先判断该key是否已过期,过期则清除。
优点:
该策略可以最⼤化地节省CPU资源,却对内存⾮常不友好。极端情况可能出现⼤量的过期key没有再次被访问,从⽽不会被清除,占⽤⼤量内存。
- 定期过期:
每隔⼀定的时间,会扫描⼀定数量的数据库的设置了过期数据字典中⼀定数量的key,并清除其中已过期的key。该策略是⼀个折中⽅案,可以通过设置多久扫描一次和一次扫描多久来使得CPU和内存资源达到最优的平衡效果。
Redis中同时使⽤了惰性过期和定期过期两种过期策略。