Redis面试题
目录
缓存穿透:
解决办法:
1.缓存空值:
2.布隆过滤器:
缓存预热:
误判的情况:
缓存击穿:
互斥锁和逻辑过期
互斥锁:
逻辑过期:
缓存雪崩:
双写一致:
延迟双删
先删除缓存,后删除数据库:
先删除缓数据库,后删除缓存:
小结:
读写锁:
异步通知:
基于MQ的异步通知:
基于Canal的异步通知:
总结:
数据过期策略:
惰性删除:
定期删除:
slow模式:
fast模式:
数据淘汰策略
redis的其他面试问题:
前言
在当今数字化高速发展的时代,数据的存储与处理效率成为众多企业关注的核心要点。Redis,作为一款高性能的键值对存储数据库,凭借其丰富的数据结构、卓越的读写性能以及出色的可扩展性,在互联网技术栈中占据着举足轻重的地位。无论是小型创业公司,还是大型互联网巨头,都离不开 Redis 的助力。当我们渴望踏入相关技术岗位,深入掌握 Redis 面试题就成为了迈向成功的关键一步。它不仅能帮助我们梳理知识体系,更能让我们在面试中从容应对,展现专业风采。现在,就让我们一同深入探索 Redis 面试题的世界。
缓存穿透:
大量的恶意请求去访问你数据库里不存在的数据,导致请求不走缓存,直接打到数据库,造成数据库压力过大甚至崩溃。
解决办法:
1.缓存空值:
每次的请求发现数据库不存在的数据,也会对他进行缓存(key:1 value:null)。因为可能会缓存大量的空值,所以占用的内存会很高。而且可能缓存里存了空值,数据库更新有数据了,这就会导致缓存不一致
2.布隆过滤器:
大量请求过来,先去查布隆过滤器,布隆过滤器要是没有,那就直接返回,缓存都不走。
实现:
缓存预热:
我们把热点数据在放进redis同时也放进布隆过滤器。
误判的情况:
id等于3的数据它不存在,但是他经过哈希函数算出来的位图下标都为1,会判定它存在
缓存击穿:
互斥锁和逻辑过期
互斥锁:
线程1到查询这个key,它过期了,他会加一把互斥锁,然后重建数据库。这个时候如果线程2来访问,那就会让他等待,并且他还会隔一段时间就来请求
逻辑过期:
线程1到查询这个key,它过期了,他会加一把互斥锁。然后他会新开一个线程2来去重建数据库,写入缓存,重建过期时间,这个时候线程1会返回过期数据,线程2释放锁,这个时候注意:新来的线程(线程3)他如果来的时间是线程2释放锁之前,他会获取锁失败返回旧数据,线程2释放锁之后,那么它(线程4)就能获取最新数据
缓存雪崩:
如果是这个key同时过期,我们可以给这些key设随机过期时间
如果是redis宕机了,那就可以用哨兵模式集群模式
这里可以参考:我写的redis主从模式和集群模式
双写一致:
延迟双删
写操作时:延迟双删
这个时候到底是先删库还是删缓存呢?
其实都有弊端:
先删除缓存,后删除数据库:
缓存10 ,库10
线程1:执行完了:缓:null,库10
线程2:缓:10,库,10
线程1:缓:10,库:20(不一致)
先删除缓数据库,后删除缓存:
起始条件:缓存:null,数据库10
线程1:缓存:null,数据库10
线程2:缓存:null,数据库20
线程1:缓存:10,数据库20(不一致)
小结:
两种删除方法都会导致脏数据的出现导致不一致
所以这个时候就要用延时双删了,修改完数据库后延时再删一次缓存,保证数据的一致性,但是延时多少,我们就不知道到底是多少比较好,所以这个延时双删的策略也有脏数据的产生
那延时双删不能保证强一致性,那有以下办法来保证
读写锁:
业务场景一般是读多写少,所以我们可以加一个共享锁(读锁)和排他锁(写锁)
读数据时:其他线程可以共享读操作
写数据时:加锁后阻塞其他线程的读写操作。
因为是读多写少,读的时候加读锁,其他线程也不干扰,在写操作时加了写锁,能保证数据的一致性,这样对比分布式锁(读和写都添加了锁)肯定性能要更高。
异步通知:
基于MQ的异步通知:
修改数据时,会发送一条消息给MQ,缓存服务要监听这个MQ,一旦有消息,那就更新redis。
这个虽然会有延迟性(发消息要时间),但是它可以保证最终的一致性,他是依靠于MQ的稳定性。
基于Canal的异步通知:
数据库发生变化后,数据库更新BINLOG二进制日志,Canal监听到消息后,通知redis。
优点:异步通知对代码没有侵入
总结:
数据过期策略:
假如redis里的数据过期了,会立即删除吗?
我们有两种不同的删除策略:惰性删除和定期删除
惰性删除:
当我们的线程访问数据时看他有没有过期,过期了就删掉。这种策略很明显,对CPU很友好,但是对内存不太友好,因为可能会存在大量过期的Key不能被删掉。
定期删除:
每隔一段时间,我们就对一部分Key做一些检查,检查他们是否过期,删除过期的Key。当然了,会把所有的Key都遍历一遍。
定期删除又分为两个模式:Slow和Fast模式
slow模式:
频率为10HZ,每次不超过25ms,可以通过修改配置文件来调整参数
fast模式:
Fast模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms。
Redis所用的是惰性删除和定期删除混合的策略。
数据淘汰策略
重点是:LRU和LFU解释清楚,分别是时间和频率。
redis的其他面试问题:
结尾
通过对一系列 Redis 面试题的剖析与探讨,我们对 Redis 的原理、应用场景、性能优化等方面有了更为透彻的理解。这些知识不仅是面试场上的有力武器,更是我们在实际开发工作中优化系统、提升效率的宝贵财富。面试是检验知识储备与技术能力的关卡,但学习 Redis 远不止于此。技术的浪潮永不停歇,Redis 也在持续演进,我们应保持求知若渴的态度,不断探索新特性、新用法,在技术之路上稳步前行,以更好地适应不断变化的开发需求,为项目和团队创造更大价值。