redis三大删除策略以及redis八种淘汰策略

三大删除策略

redis在删除过期key的时候,不可能时时刻刻都遍历所有被设置过期时间的key来检测数据是否已经达到过期时间,然后再对它进行删除。所以有三种删除的方式

  1. 立刻删除
  2. 惰性删除
  3. 定期删除

一、立刻删除

立刻删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立刻删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰到了cpu很忙的时候,比如正在做交集或者排序等计算,那么就会给cpu造成额外压力,让cpu忙死。这会产生大量的性能消耗,同时也会影响数据的读取操作。

总结:对cpu不友好,用处理器性能换取存储空间(拿时间换空间)

二、惰性删除

数据到达过期时间,不做处理。等下次访问该数据的时候判断,是否过期,假如没过期则返回;假如已过期,删除返回不存在。惰性删除的缺点是对内存不友好。

总结:对内存不友好,用存储空间换取处理器性能(拿空间换时间)

三、定期删除

定期删除策略是前两种策略的折中。

定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。

周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。有两个特点:

  1. cpu性能占用设置有峰值,检测频度可自定义设置。
  2. 内存压力不是很大,长期占用内存的冷数据会被持续清理。

总结:周期性抽查存储空间(随机抽查,重点抽查),有漏网之鱼

举例:

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

 

posted @ 2018-09-29 19:54  温柔的风  阅读(358)  评论(0编辑  收藏  举报