自学内容网 自学内容网

Redis的过期策略、内存淘汰机制

Redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的?还有,你的数据已经设置了过期时间,但是时间到了,为什么内存占用率还是比较高?

一、Redis的过期策略

  Redis采用的是定期删除+惰性删除策略。

1、为什么不用定时删除策略?

  定时删除:用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。

2、定期删除+惰性删除是如何工作的呢?

  定期删除,Redis默认每隔100ms检查,是否有过期的key,有过期key则删除。需要说明的是,Redis不是每隔100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,Redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。

  于是,惰性删除派上用场。也就是说在你获取某个key的时候,Redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。

3、采用定期删除+惰性删除就没其他问题了么?

  不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。

二、数据(内存)淘汰策略

1、LRU算法

 

e7873d022a762678b0d2271f1ddf373a.png

  • 最开始时,内存空间是空的,因此依次进入A、B、C是没有问题的。

  • 当加入D时,就出现了问题,内存空间不够了,因此根据LRU算法,内存空间中A待的时间最为久远,选择A,将其淘汰。

  • 当再次引用B时,内存空间中的B又处于活跃状态,而C则变成了内存空间中,近段时间最久未使用的。

  • 当再次向内存空间加入E时,这时内存空间又不足了,选择在内存空间中待的最久的C将其淘汰出内存,这时的内存空间存放的对象就是E->B->D。

2、Redis中的LRU算法

  在redis.conf中有一行配置:

<span style="color:#000000"><span style="background-color:#282c34"><code># maxmemory-policy allkeys-lru
</code></span></span>
  • 1
  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧

  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用

  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐

  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐

  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐

 


原文地址:https://blog.csdn.net/qq_74811378/article/details/145136116

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!