Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说redis面试题2022_redis淘汰策略面试题,希望能够帮助你!!!。
2022年Redis最新面试题第6篇 - Redis淘汰策略
最近整理一份关于Redis常见面试题的,也会根据自己的经验, 标注一些出现的概率,最高5颗★出现的概率最高。比如这样:
Redis 最适合的场景, 可以简单的说说吗?
出现概率: ★★★★
一、Redis基础知识
二、数据结构
三、事务
四、Redis数据持久化
五、Redis集群
六、Redis淘汰策略
七、Redis分布式锁
八、Redis缓存问题
九、运维和部署
一般来讲在面试当中, 关于Redis相关的面试题频率出现比较高的几个关键词是适合哪些场景、数据结构、hash实现原理和如何扩容、如何做持久化、关系型数据库和非关系数据库对比等等。 把这几个点问完基本也差不多10~20分钟了(一般一轮面试1小时左右), 基本这些可以让面试官对你的Redis知识有一定的了解了。
也欢迎我的: 。 一起交流, 在coding的世界里漫步, sigusoft: , 免费最新Redis面试题(含答案)。
希望这篇文章可以帮助大家, 也希望大家都能找到的好工作。
也可以在线看我的博客, 界面如下:
Redis过期键的删除策略?
你可以简单聊聊Redis内存淘汰机制(回收策略)
出现概率: ★★★★
Redis过期键的删除策略是:定期删除+惰性删除。
1)、关于定期删除, Redis默认会每隔100ms就随机选取一些已经过期了的key,检查其是否过期,如果已经过期就删除。
不过假设Redis里放了100w个key,而且都设置了过期时间,你每隔几百毫秒,就检查100w个key,那 Redis基本上就卡死了,cpu负载也会很高的,基本都消耗在检查过期key上了。
注意,这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。实际情况是每次随机选取一些key进行检查和删除的。
但因为随机会带来不确定性,可能会导致很多过期key到了时间并没有被删除掉,那应该怎么办呢?所以就需要惰性删除了。
关于定期删除源码解析:每当 Redis 服务器的周期性操作 redis.c/serverCron 函数执行时,redis.c/activeExpireCycle 会被调用。
activeExpireCycle 函数在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的 expires 字典中随机检查一部分键的过期时间,并删除其中的过期键。
current_db 记录当前检查的数据库,如果函数 activeExpireCycle 当前正在处理 2 号数据库,时间超限,返回后,下次检查时,会从 3 号数据库开始检查。所有数据库检查一遍后,current_db 重置为 0,然后再次开始一轮的检查工作。
2)、关于惰性删除, 当用户某个key的时候,Redis会检查一下这个key是不是设置了过期时间, 并且是否过期了?如果过期了此时就会删除,不会给用户返回任何东西。
惰性删除有一个问题, 依赖用户的主动调用,那如果一些用户就长时间没有访问怎么办, 会导致大量过期 key堆积在内存里,进而导致Redis 内存块耗尽了,咋整?
答案就是:触发Redis内存淘汰机制。(下面会讲到)
出现概率: ★★★★
1)、Redis内存淘汰机制有以下几个:
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。(这个有点过于暴力, 不推荐)
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
2)、Redis默认的过期策略是noeviction, 最暴力那个, 如果内存满了那就是一场“华丽”的故事了。😂
3)、redis.conf 中的过期淘汰配置如下:
也欢迎我的: 。一起交流, 在coding的世界里漫步, sigusoft: , 免费最新Redis面试题(含答案)。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。