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的过期策略以及内存淘汰机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31Tiny RDM:你的下一代Redis桌面GUI神器-icode9专业技术文章分享
- 2024-03-21redisinsight-v2
- 2024-02-26Typed property App\Api\Mapper\GamePropsConfigMapper::$apiRedis must not be accessed before initia-icode9专业技术文章分享
- 2024-02-21redisson getlock
- 2024-02-20redis config
- 2024-02-20redis leaderboard
- 2024-01-23缓存选型:Redis or MemCache
- 2024-01-22面试官:Redis持久化能关吗?怎么关?
- 2024-01-21Redis压测工具redis-benchmark-icode9专业技术文章分享
- 2024-01-19这才是你应该了解的Redis数据结构!