Redis (七) 过期策略和淘汰机制

redis过期策略和淘汰机制

  redis删除清理key的一般有如下两种情况:(1)对设置过期时间redis的进行删除(2)通过内存淘汰机制删除部分key;下面我们对这两种情况的原理分别进行探讨。

设置过期时间redis的清理机制:

  redis中对某一个key设置过期时间相信我们再熟悉不过了,因为我们只要在set key的时候,就可以给一个expire time,就是过期时间,指定这个key多久后过期,到达过期时间后缓存就会失效。那么具体redis是怎么删除我们这些已经过期的key的呢?答案是:定期删除+惰性删除

  所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意,这里并不是每隔100ms就遍历所有的设置过期时间的key,因为如果是遍历检测所有设置过期时间的key的话那你的redis基本就挂了。简单做个比喻说明:假设redis里存放了100万个key,都设置了过期时间,你每隔几百毫秒,就检查这100万个key,那么很不幸你的redis基本上就死了,因为cpu的负载全消耗在你检查过期key上了。实际上redis是每隔100ms随机抽取一些key来检查和删除的。但是随机抽取一些key的话又会造成另一个问题: 可能会出现很多过期key到了时间并没有被删除掉,因为随机抽取的时候并没有抽取到,那redis又是怎么解决这个问题的呢?答案就是惰性删除。惰性删除的意思就是,在你获取某个key的时候,redis会检查一下 ,这个key是否设置了过期时间,如果设置了过期时间那么是否过期了?如果过期了此时就会删除该key,并不会给你返回任何东西。因此要注意并不是key到时间就会被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下。redis就是通过上述两种手段结合起来,以确保过期的key一定会被删除掉。简单来说就是你设置的过期key,如果通过定期删除没有被删除掉,就仍然会停留在内存里,占用着你的内存,这个时候只有你的系统去主动查一下那个key,才会被redis给删除掉。但是实际上经过以上的处理机制后,如果定期删除漏掉了很多过期key的话,然后你也没及时去查,也就没走惰性删除,就会造成大量过期key堆积在内存里,最终仍然可能会导致redis内存耗尽,因此这个问题又该怎么解决呢?

  答案是:走内存淘汰策略

内存淘汰策略:

  当redis的内存占用过多或者快达到redis可用内存上限一定比例的时候,此时会触发redis内存淘汰策略,具体有如下一些策略:

  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用
  2. allkeys-lru当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
  3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般也没人用
  4. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)
  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

  注:一般都是采用第二种策略allkeys-lru,因为删除最近最少使用key基本符合我们的业务要求

posted @ 2020-10-09 02:57  跃小云  阅读(814)  评论(0编辑  收藏  举报