了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?

目录

一、面试官心理分析

二、面试题剖析

1. 缓存雪崩        

2. 缓存穿透

3. 缓存击穿


一、面试官心理分析

        其实这是问到缓存必问的,因为缓存雪崩和穿透,是缓存最大的两个问题,要么不出现,一旦出现就是致命性的问题,所以面试官一定会问你。

二、面试题剖析

1. 缓存雪崩        

        对于系统 A,假设每天高峰期每秒 5000个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时1秒5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。
        这就是缓存雪崩。

        大约在3年前,国内比较知名的一个互联网公司,曾因为缓存事故,导致雪崩,后台系统全部崩溃,事故从当天下午持续到晚上凌晨 3~4 点,公司损失了几千万。
缓存雪崩的事前事中事后的解决方案如下:
        · 事前: Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
        · 事中: 本地 ehcache 缓存 +hystrix 限流&降级,避免 MySQL 被打死。
        · 事后: Redis持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。 

        用户发送一个请求,系统A收到请求后,先査本地 ehcache 缓存,如果没査到再査 Redis。如果 ehcache 和 Redis 都没有,再査数据库,将数据库中的结果,写入 ehcache 和 Redis 中。
        限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示,或者空值。
好处:
        数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。

        只要数据库不死,就是说,对用户来说,2/5的请求都是可以被处理的。

        只要有 2/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来了。 

2. 缓存穿透

        对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。
        举个栗子。数据库id 是从1开始的,结果黑客发过来的请求id 全部都是负数。这样的话,缓存中不会有,请求每次都“ 视缓存于无物 ”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

        解决方式很简单,每次系统A从数据库中只要没查到,就写一个空值到缓存里去,比如set-999  UNKNOWN 。然后设置一个过期时间,这样的话,下次有相同的key来访问的时候,在缓
存失效之前,都可以直接从缓存中取数据。 

3. 缓存击穿

        缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
不同场景下的解决方式可如下:
        若缓存的数据是基本不会发生更新的,则可尝试将该热点数据设置为永不过期。

        若缓存的数据更新不频繁,且缓存刷新的整个流程耗时较少的情况下,则可以采用基于Redis、zookeeper 等分布式中间件的分布式互斥锁,或者本地互斥锁以保证仅少量的请求能请求数据库并重新构建缓存,其余线程则在锁释放后能访问到新缓存。
        若缓存的数据更新频繁或者在缓存刷新的流程耗时较长的情况下,可以利用定时线程在缓存过期前主动地重新构建缓存或者延后缓存的过期时间,以保证所有的请求能一直访问到对应的缓存。

(ps:一个点赞一份爱,点个关注不迷路!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/458862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

发票OCR-国税可进行的发票查验种类-接口文档

发票查验内容包括发票种类名称、发票代码、发票号码、金额、销售方名称、购买方名称等信息。可以在国家税务总局全国增值税发票查验平台上进行查验,也可以进入发票所属省、直辖市税务局官方网站的“我要查询-发票查询”模块进行查验,企业也可以通过发…

vue生命周期函数原理解析,vue阻止事件冒泡方法实现

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

#15封装vue3+el-table表格数据请求函数

目录 1、useTableData 2、util 3、使用 开箱即用,理解容易。 1、useTableData import { reactive } from vue import { getType } from /utils/utilsexport const useTableData (api) > {if (typeof api ! function && getType(api) ! Promise) {th…

Unity类银河恶魔城学习记录10-1 10-2 P89,90 Character stats - Stat script源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Stat.cs using System.Collections; using System.Collections.Generic; us…

【MAC】OpenResty安装

首先官方网站:http://openresty.org/cn/download.html 安装: 我是安装官网去执行的安装命令 配置环境变量 1.打开配置文件 vim ~/.bash_profile2.粘贴进去变量配置 #OPENRESTY export NGINX_HOME/opt/homebrew/etc/openresty export PATH$PATH:$NGI…

【面试精讲】String是如何实现的?String源码分析

【面试精讲】String是如何实现的?String源码分析 目录 一、String实现机制 二、String不可变性(使用final修饰) 三、String 和 StringBuilder、StringBuffer 的区别 四、和equals的区别 五、String创建对象与JVM辨析 六、String源码解…

Mybatis 动态sql环境搭建(学习笔记16)

什么是动态sql:根据不同的条件生成不同的sql语句 借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。 ifchoose (when, otherwise)trim (where, set)foreac…

拆解Spring boot:Springboot为什么如此丝滑而简单?源码剖析解读自动装配

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

Screaming Frog SEO Spider:网站优化利器,轻松掌握网络爬虫精髓

在数字时代,网络爬虫已成为各行各业获取数据、分析趋势的重要工具。而在众多网络爬虫开发工具中,Screaming Frog SEO Spider以其强大的功能和易用性脱颖而出,成为众多网站优化师和SEO从业者的首选。 Screaming Frog SEO Spider是一款适用于M…

笔记本电脑数据恢复:如何轻松地从笔记本电脑恢复文件

不小心从笔记本电脑中删除了一些重要文件?或者恶意软件和其他不可控因素是否导致您的文件消失?人们很容易认为这些文件已经永远消失,并且无法恢复。但这与事实相差甚远。通过遵循正确的数据恢复礼仪并使用良好的数据恢复工具,您可…

英语翻译报价,千字英语翻译报价

众所周知,英语作为全球通用的语言,其翻译需求量极大。无论是欧美国家的日常交流,还是小语种的翻译工作,英语都常常作为中介语言,扮演着桥梁的角色。那么,英语翻译公司是如何定价的?每千字的英语…

Qt中进行客户端开发框架

在Qt中进行客户端开发是一种常见的做法,Qt是一个跨平台的C框架,提供了丰富的工具和类库,用于开发图形用户界面(GUI)应用程序、网络应用程序以及其他类型的软件。以下是一些常用的Qt客户端开发框架和技术,希…

Exam in MAC [容斥]

题意 思路 正难则反 反过来需要考虑的是: (1) 所有满条件一的(x,y)有多少对: x 0 时,有c1对 x 1 时,有c对 ...... x c 时,有1对 以此类推 一共有 (c2)(c1)/2 对 (2) 符合 x y ∈ S的有多少对&#xff1a…

Qt客户端开发的技术难点

在Qt客户端开发中,可能会遇到一些技术难点,这些难点可能与UI设计、性能优化、跨平台兼容性等方面有关。以下是一些可能的技术难点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…

虚拟游戏理财 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。 现有一家Bank,它提供有若干理财产品m,风险及…

将SQL数据库转换为Mysql数据库

一、准备工作 1、SQL server安装包与已经有数据的mdf、ldf数据库文件; 2、.net Framework安装包;(用于支持SQL Server安装的组件) 3、MySql安装包;(用于目标数据库的环境安装) 4、navicat安装包…

YOLOv8旋转目标检测实战:训练自己的数据集

课程链接:https://edu.csdn.net/course/detail/39393 旋转目标检测是计算机视觉领域的一个高级任务,它在传统目标检测的基础上进一步发展。传统目标检测技术主要关注于识别和定位图像中的物体,通常以水平边界框(HBB)来标识目标物体的位置。而…

SpringBoot高级

1.自动配置-Condition Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载相应的Bean 进入 SpringBoot 启动类,点击进入 run() 可以看到这个方法是有返回值的,返回值为 ConfigurableApplicationConte…

[Redis]——主从同步原理(全量同步、增量同步)

目录 Redis集群: 主从同步原理: replid和offset: 全量同步和增量同步: repl_baklog文件: 主从集群的优化: Redis集群: 部署多台Redis我们称之为Redis集群,他有一个主节点(负责写操作)&…

什么是施密特触发器?一文详解

施密特触发器的定义 施密特触发器(Schmitt Trigger)是一种电子电路,常用于数字逻辑电路和信号处理电路中。它具有两个不同的阈值电压级别,通过这些不同的电压级别,可以将输入信号转换为相对稳定的输出信号。 当输入信…