大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】

 hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

💥个人主页绝命Coding-优快云博客
💥 所属专栏后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖

 往期内容:

大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-优快云博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-优快云博客

大厂面试官问我:Redis持久化RDB有没有可能阻塞?阻塞点在哪里?【后端八股文三:Redis持久化八股文合集】-优快云博客

本文为【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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值