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

2021/6/21 19:26:10

本文主要是介绍redis的过期策略以及内存淘汰机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

为什么会有这篇文章?
面试的时候问到的,总结一下。
面试官:redis的过期策略是什么?
我:没看过源码,不知道。
面试官:你看过哪些源码?
我:eureka,openfeign,hystrix。。。
面试官:来讲讲。
我:巴拉巴拉巴拉。。。
面试官:(内心,我草牛逼。)好,下个问题。

好了,逼我装过了,总结一下redis的过期策略吧,争取下次可以完美回答出来。

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

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

 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.

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

  定期删除,redis默认每100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
  于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。

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

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

在redis.conf中有一行配置 maxmemory-policy volatile-lru

该配置就是配内存淘汰策略的:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,新写入操作会报错
ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

好了,期待下次面试我能完美回答出面试官的这个问题。



这篇关于redis的过期策略以及内存淘汰机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程