三大删除策略
redis在删除过期key的时候,不可能时时刻刻都遍历所有被设置过期时间的key来检测数据是否已经达到过期时间,然后再对它进行删除。所以有三种删除的方式
- 立刻删除
- 惰性删除
- 定期删除
一、立刻删除
立刻删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立刻删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰到了cpu很忙的时候,比如正在做交集或者排序等计算,那么就会给cpu造成额外压力,让cpu忙死。这会产生大量的性能消耗,同时也会影响数据的读取操作。
总结:对cpu不友好,用处理器性能换取存储空间(拿时间换空间)
二、惰性删除
数据到达过期时间,不做处理。等下次访问该数据的时候判断,是否过期,假如没过期则返回;假如已过期,删除返回不存在。惰性删除的缺点是对内存不友好。
总结:对内存不友好,用存储空间换取处理器性能(拿空间换时间)
三、定期删除
定期删除策略是前两种策略的折中。
定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。有两个特点:
- cpu性能占用设置有峰值,检测频度可自定义设置。
- 内存压力不是很大,长期占用内存的冷数据会被持续清理。
总结:周期性抽查存储空间(随机抽查,重点抽查),有漏网之鱼
举例:
redis默认每100ms检查是否有过期的key,有过期key则删除。注意:redis不是每隔100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms全部检查,redis直接进去icu)。因此如果只采用定期删除策略,会导致很多key到时见没有删除。
定期策略的难点是不确定删除操作执行的时长和频率:如果删除操作执行的太频繁或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过去的消耗在删除过期键上面。如果删除操作执行的太少或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。
八种淘汰策略
两幅图片,都看看,深入理解一下
一、策略
ttl:设置了过期时间的key中,剩余时间更少的优先淘汰。
lru:最近最少使用的key,优先被淘汰。
lfu:最近访问频率最少的key,优先被淘汰。
random:随机淘汰内存中内容。
noeviction:无法再写入Redis,不会处理内存中的内容,是默认的淘汰策略。
二、范围
allkeys-xxx:allkeys开头的是对Redis中的所有key都在淘汰范围内。
volatile-xxx:volatile开头的是对Redis中的设置了超时时间的key列入淘汰范围。
三、设置淘汰策略
Redis的配置文件中maxmemory-policy,就是我们说的,达到最大内存后的淘汰策略。
所以以上的淘汰策略+淘汰范围结合起来,Redis中有以下几类淘汰策略,可以进行设置
最好使用allkeys-lru