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

文章目录

  • 一、Redis的过期策略
    • 1、为什么不用定时删除策略?
    • 2、定期删除+惰性删除是如何工作的呢?
    • 3、采用定期删除+惰性删除就没其他问题了么?
  • 二、数据(内存)淘汰策略
    • 1、LRU算法
    • 2、Redis中的LRU算法

  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算法

Redis的过期策略以及内存淘汰机制_第1张图片

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

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

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

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

2、Redis中的LRU算法

  在redis.conf中有一行配置:

# maxmemory-policy allkeys-lru
  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧

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

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

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

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

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

你可能感兴趣的:(数据库(MySQL,Redis))