redis是采用定期删除+惰性删除策略
一)redis有三种不同的删除机制
redis数据库键的过期时间都保存在过期字典中,根据系统时间和存活时间判断是否过期。
1,定时删除:实现方式,创建定时器
2,惰性删除:每次获取键时,检查是否过期
3,定期删除:每隔一段时间,对数据库进行一次检查,删除过期键,由算法决定删除多少过期键和检查多少数据库
二) 优缺点
1,定时删除,对内存友好,但是对cpu很不友好(因为单线程)
定时删除,用一个定时器来负责监视key,当这个key过期就自动删除,虽然内存及时释放,但是十分消耗CPU资源,在大并发请求下CPU要尽可能的把时间都用在处理请求,而不是删除key,因此没有采用这一策略
2,定期删除 ---- 如果删除太频繁,将退化为定时删除,如果删除次数太少,将退化为惰性删除。
redis默认每100ms检查是否有过期的key,有过期的key则删除。需要说明的是redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查。因此,如果只采用定期策略,会导致很多key到时间没有删除,也就是使用定时删除会导致删除不完全,于是引入了惰性删除
3,惰性删除
某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存
三)redis的内存淘汰机制
采用定期删除+惰性删除就没问题了呢?
不是的如果定期删除没有删除key,然后你也没有及时去请求这个key,也就是说惰性删除也没有生效。这样redis的内存会越来越高,那么就应该采用内存淘汰机制。
内存淘汰机制就能保证在redis内存占用过高的时候,去进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高
redis的淘汰策略有8种,不详细列举。