【Redis】Redis常见面试题(2)
文章目录
- 【Redis】Redis常见面试题(2)
- 1. 缓存
- 2. Redis作为缓存
- 2.1 缓存雪崩
- 2.2 缓存穿透
- 2.3 缓存击穿
- 2.4 缓存雪崩、缓存穿透、缓存击穿的区别
- 2.5 缓存预热
- 2.6 如何保证缓存和MySQL双写一致
【Redis】Redis常见面试题(2)
1. 缓存
缓存在计算机系统中有着重要的作用,它可以显著提高系统的性能和响应速度
- 提升系统性能: 缓存将常用的数据或计算结果存储在高速的存储介质中,如内存,以便快速地响应请求。通过减少对慢速存储介质(如硬盘或数据库)的访问次数,可以降低响应延迟,提高系统的吞吐量和效率
- 减轻后端压力: 通过缓存,系统可以减少对后端资源的频繁访问,降低数据库或其他外部服务的负载。这样可以节省计算资源,提高系统的可扩展性和稳定性
- 改善用户体验: 缓存能够加速应用程序的响应速度,从而提供更好的用户体验。用户可以更快地获取所需的数据或结果,减少等待时间,提高用户满意度
就以我们的大脑为例
-
5的阶乘是120,一般不需要一直拆成
5*4*3*2*1
去算,而是直接答120,因为我们大脑吧5的阶乘是120保存到“缓存”了! -
再比如,你是个数学白痴,四道选择题一道不会,但是你在测试之前看到了答案,答案是ABCD,你记住了,放在“缓存”里;测试的时候,你直接写答案,四道选择题满分;下次遇到同样的四道选择题,题目和选项一模一样,一些你还记得答案,但是一些忘记了,“忘记了”也就是“缓存的过期”
2. Redis作为缓存
由于Redis高性能,多种数据结构,持久化支持的特性,再加上天生支持分布式,作为分布式机的缓存,担得起这个责任~
下面是Redis作为缓存常见的一些知识点
2.1 缓存雪崩
缓存雪崩是指在短时间内,由大量缓存同时过期,导致大量的请求直接访问查询数据库而不是缓存,从而对数据库造成巨大的压力,严重的情况下可能会导致数据库宕机!
缓存的存在,减少了请求访问查询数据库的频率,提高效率,减低数据库压力,过期后,“没人兜底了”
正常情况下:
缓存雪崩:
解决:
-
加锁排队,缺点就是增加系统的响应时间,降低系统吞吐量,牺牲一点用户体验
-
随机化过期时间,极大避免了同时过期这个事件的发生,系统常用的方式;甚至可以不设置过期时间,但对硬件要求高
-
设计二级缓存,Redis这一层防线沦陷后,二级缓存挺身而出
2.2 缓存穿透
缓存穿透指的是查询数据库和缓存都没有数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透
- 可以理解为每次都无视缓存,缓存一直没被存数据,缓存没有其作用
2.3 缓存击穿
缓存击穿指的是某个热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求,此时这些请求将会给数据库造成巨大的压力
- 就像被击穿了个洞,一个缺口,“流量大,水压高”形成一道强硬的“水刀”刺向数据库
- 而缓存雪崩则是水坝直接塌了,涌了下来
相比于缓存穿透,击穿的严重程度显然更高
解决方案:
- 加锁排队
- 设置永不过期,既然是热点缓存,它配永不过期!
2.4 缓存雪崩、缓存穿透、缓存击穿的区别
-
缓存穿透是因为一直没有缓存数据导致的问题
-
缓存击穿是因为某个热点缓存失效而导致的问题
-
缓存血本是因为同时又大量的缓存失效所带来的问题
2.5 缓存预热
是一个优化手段,就是应用程序启动或缓存失效之后,主动将热点数据加载到缓存中的策略
- 这样,在实际请求到达应用程序时,热点数据已经存在于缓存中,从而减少了缓存未命中的情况,提高了应用程序的响应速度
2.6 如何保证缓存和MySQL双写一致
可以采用以下几种方法:
- 读取优先
- 在读取数据时,优先从Redis缓存中读取,如果缓存中不存在,则从MySQL数据库读取,并将数据写入Redis缓存。这样可以确保读取到的数据都是最新的,避免缓存中的脏数据
- 更新同步
- 在更新数据时,先更新MySQL数据库,然后再更新Redis缓存。这样可以避免数据库和缓存中的数据不一致
- 使用队列
- 通过将更新操作写入队列中,然后异步地从队列中获取操作并依次执行更新操作,先更新MySQL数据库,然后再更新Redis缓存。这样可以保证更新操作的顺序一致性,并减少数据库和缓存的并发写入冲突
- 使用事务
- 在支持事务的数据库中,可以使用数据库事务来同时更新MySQL和Redis。当更新MySQL数据库时,在同一个事务中也更新Redis缓存。如果更新Redis缓存失败,可以回滚数据库事务,确保数据的一致性。
- 定时刷新
- 设置一个定时任务,在一定时间间隔内将MySQL数据库中的数据同步到Redis缓存中,保持数据的一致性。可以根据业务需求设置合适的刷新时间间隔
需要注意的是,以上方法会增加系统的复杂性和延迟
- 因此需要根据具体的业务场景和性能要求做出权衡和选择
- 另外,使用缓存和数据库作为双写一致性解决方案时,也需要考虑缓存和数据库的高可用性和容错机制,以确保整个系统的可靠性
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!