往期内容:
大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客
大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-CSDN博客
大厂面试官问我:Redis持久化RDB有没有可能阻塞?阻塞点在哪里?【后端八股文三:Redis持久化八股文合集】-CSDN博客
本文为【Redis内存淘汰策略八股文合集】初版,后续还会进行优化更新,欢迎大家关注点赞评论交流~
大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在面试中是大大加分的~
内存淘汰策略
(新写报错,最近最少使用,随机,过期最近最少使用,过期随机,过期更早)
指的是Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据
noeviction:新写入报错
allkeys-lru:在键空间中,移除最近最少使用的 key。
allkeys-random:在键空间中,随机移除某个key。
volatile-lru:在设置了过期时间的键空间中,移除最近最少使用的 key。
volatile-random:在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
Redis数据淘汰策略,最常用的是哪个?默认是哪个?
Redis中最常用的淘汰策略是LRU(Least Recently Used)。这也是Redis的默认淘汰策略。
有了删除策略为什么还需要有淘汰策略
因为删除策略的惰性策略是用到才比较是否过期,而定时策略是选一批执行删除。所以还有很多的数据是被漏掉的。
/
删除策略和淘汰策略都是为了解决Redis数据超出内存限制的问题。删除策略是在访问数据时才进行过期检查,比较被动。而淘汰策略是主动选择要淘汰的数据,更加主动和有计划。
Redis单线程怎么去淘汰Key的呢?
- Redis虽然是单线程的,但是它会定期(每100ms)主动扫描一批Key,检查是否过期。
- 对于过期的Key,Redis会立即将其删除。
- 同时,在执行其他命令时,如果遇到过期的Key,也会立即将其删除。
- 这样可以保证过期数据能够及时被清理。
Redis的超时淘汰了解过吗,数据结构是怎么实现的?
- Redis使用一个过期字典(expire dictionary)来存储每个Key的过期时间戳。
- 当访问一个Key时,会检查其是否过期,如果过期则立即删除。
- 同时Redis会定期(每100ms)对过期字典进行扫描,删除已经过期的Key。
- 这个过期字典采用惰性删除的方式,即在访问时检查过期,减轻了Redis的CPU负担。
Redis中的内存淘汰策略中volatile-lru和allkeys-lru有什么区别?
- volatile-lru: 在设置了过期时间的key中,淘汰最近最少使用的key。
- allkeys-lru: 在所有的key中,淘汰最近最少使用的key。
场景题:使用Redis淘汰策略为什么要给热门视频设置递增的TTL,有没有考虑过热门视频变的不那么热门了,但是零星有几个用户访问,此时该视频的生存时间又很长,很难被Redis淘汰,这个问题如何解决?
对于热门视频设置递增的TTL确实能让它们在一定时间内不被淘汰。但当热度下降后,这些视频可能会一直存在,难以被淘汰。可以考虑结合LRU策略,在过期前一段时间内将视频的TTL重置,或者使用volatile-lru策略来淘汰它们。
Redis如何设计LRU? / Redis内存淘汰, LRU维护整个队列吗?
- Redis使用一个双向链表来维护LRU队列。每个Key都对应一个节点,节点包含该Key的访问时间戳。
- 当访问一个Key时,会将其移动到链表头部,表示最近访问。
- 当需要淘汰时,会从链表尾部(最久未访问)删除节点对应的Key。
- 这样可以在O(1)时间内完成Key的访问和淘汰操作。
Redis如何设计LFU?
- Redis使用一个字典来维护每个Key的访问频率Counter。
- 当访问一个Key时,会增加其Counter值。
- 当需要淘汰时,会从Counter值最小的Key开始淘汰。
- 为了防止Counter无限增大,Redis会定期对所有Key的Counter进行衰减。
Redis为什么要使用LRU作为淘汰方式,不使用LFU呢?
(底层实现简单)
Redis使用LRU而不是LFU主要是因为LRU更简单高效,而且能较好地反映用户的访问模式。LFU需要维护一个频率统计,计算复杂度高,适合于某些特殊场景。
Redis怎么配置内存淘汰策略?
比如:配置文件中的maxmemory-policy的键中选
maxmemory-policy allkeys-lru
---------------------------------------------------------------------------------------------------------------
后期新的八股文合集文章会仅粉丝可见,感兴趣的小伙伴可以点个关注~
更多精彩内容以及一手消息请关注公众号:绝命Coding
公众号私信回复“免费资料”可免费获取简历模板以及技术亮点合集等免费资料