面试噩梦之redis击穿、穿透、雪崩_1 秒 5000 个请求全部落数据库_勤勤恳恳滴打工人的博客-程序员秘密

技术标签: 技术分享  缓存  数据库  redis  

前言

最近经历了一场面试,通过这场面试,让我深深的认识了自己的菜!


所以我决定先redis开始,慢慢的开始加强学习,同时我看到了一篇比较通俗易懂的文章,想通过文章,加上自己的见解,来学习一下redis击穿、穿透、雪崩。

一、redis击穿

解释:

击穿,顾名思义,就是穿了一个大洞,而redis的击穿指的并不是将redis击穿,而指的是,redis查询某个热点key,这个key突然失效的时候,所有的请求都会跳过redis这道屏障去查询DB,导致DB瘫痪的现象,就叫redis击穿。

场景:

某一秒,有5000个请求进来,要查询一条热点的信息,但是redis中的热点信息突然失效了,那么这一秒的时间内,5000信息就会直接穿过redis,直接去查询DB,导致DB不堪重负,宕机了,这就是redis击穿。

如何解决:

1:简单粗暴的方法:设置这个热点key,永不失效。(但是一般的系统,热点key都是会变得,所以这种方法简单粗暴,但是不是长久之际)。

2:比较复杂的方法:通过添加锁得方式,使第一个请求,去DB中查询,其他用户进行睡眠,等第一个请求将查询得结果加载到redis中(但是如果查询得这个线程挂掉,那就会导致死锁)。

3:比较复杂的方法:请求查询热点key的时候,发现不存在,则对setnx一个key,并且设置一个过期时间,这个key表示一把锁,然后只有一个请求可以设置成功,其他的请求,发现这把锁以后,要sleep一会,等第一个请求把key带回来后,其他请求再去访问(为什么要给key设置时间呢?其实是防止第一个请求设置锁以后,查询过程中挂掉了,所以为了防止形成死锁,所以要设置一个时间)

二、redis穿透

解释:

redis的穿透,就是指请求进来后去查询redis,但是redis查询不到,紧接着又去数据库查,结果数据库也查询不到,查询的太多,最终导致数据库被搞宕机。

场景:

对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。

黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。

举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

如何解决:

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

三、redis雪崩

解释:

redis的雪崩,指的是因为redis突然出现的事故,导致请求直接打到了DB中,倒是DB不堪重负,挂掉。

场景:

对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。

缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。
此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。

如何解决:

1:redis高可用:这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

2:限流降级:这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

上面redis击穿、穿透、雪崩,如果有什么不对的地方,希望大家可以指出来,谢谢。

参考文章
什么是 redis 的雪崩、穿透和击穿?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rumenxiaobai/article/details/119111301

智能推荐

Android编程权威指南(第11章 使用ViewPager)_℡倪的專属玉℡的博客-程序员秘密

11.11.创建子类CrimePagerActivity2.创建ViewPager(CrimePagerActivity.java) extends AppCompatActivityprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crime_pager);11.1

SPOJ-COT-Count on a tree_algzjh的博客-程序员秘密

COT-Count on a treeYou are given a tree with N nodes.The tree nodes are numbered from 1 to N.Each node has an integer weight.We will ask you to perform the following operation:u v k : ask for the kth m

我为什么还在用MacOSX_neora的博客-程序员秘密

    今天碰巧看到Robbin的一篇文章《 我为什么不用MacOSX了?》。很巧,我前两天还在跟一个朋友谈到“我为什么还在用MacOSX”。    用MacOSX已经快2年了。ProwerBook G4的本子,1G内存,。用这个本子之前,我已经用了半年的Linux。Robbin刚开始用MacOSX时引起一片“狂潮”, JavaEye里跟贴无数,应者云集。我倒是挺高兴的——又多了一个同道中人。没...

三种近场通信技术的特点及对未来近场通信技术的应用场景进行分析与预测_巡回宇宙的博客-程序员秘密

三种近场通信技术的特点及对未来近场通信技术的应用场景进行分析与预测一、三种近场通信技术WIFI蓝牙NFC二、分析与预测一、三种近场通信技术WIFI是以太网的一种无线扩展,理论上只要用户位于一个接入点四周的一定区域内,但受墙壁阻隔,在建筑物内的有效传输距离小于户外。主要应用在SOHO、家庭无线网络以及不便安装电缆的建筑物或场所,例如机场、酒店、商场等公共热点场所,可以节省大量铺设电缆所需花费的资金。蓝牙“蓝牙(Bluetooth)”是一个开放性的、短距离无线通信技术标准,也是目前国际上最新的一种

【转载】PAT考试大纲, 刷题方法, 模版_「已注销」的博客-程序员秘密

原文链接: https://timtingwei.github.io/2018/08/13/20180813-01/ref: https://blog.csdn.net/yinghuoai/article/details/78510094考试大纲乙级(Basic Level)考生应具备以下基本能力:1· 基本的C/C++的代码设计能力,以及相关开发环境的基本调试技巧;2· 理...

LoadRunner-性能测试_软件性能测试工具,loadrunner自带的飞机订票系统,录制输入账号、密码登录机_hyhrosewind的博客-程序员秘密

文章目录1. HP Loadrunner简介和安装1.1 Loadrunner简介1.2 Loadrunner安装1. HP Loadrunner简介和安装1.1 Loadrunner简介是一款工业级性能测试软件;通过模拟真实用户行为,通过负载,并发和性能实时监控以及完成后的测试报告,分析系统可能存在的瓶颈;Loadrunner支持的脚本语言为C语言。1.2 Loadrunner安装...

随便推点

数字图像处理基础实验(二):直方图均衡化_直方图均衡化实验_lyd1995的博客-程序员秘密

一、实验内容及原理1、计算灰度图像的归一化直方图具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在 窗口中以图形的方式显示出来步骤:(1)初始化一个256大小的数组,存放图像中每级灰度值的像素点的个数(2)遍历整张图像(3)归一化数组2、灰度图像直方图均衡处理具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。步骤:(1)读取该像素点的灰度值(...

hadoop3.1.1-ha高可用搭建_浮躁-lh的博客-程序员秘密

hadoop HA 集群的搭建依赖于 zookeeper,所以选取三台当做 zookeeper 集群我总共准备了四台主机node01,node02,node03,node04。其中 node01 和 node02 做 namenode 的主备切换安装zookeeper集群 # 目录 usr/hadoop-3.1.1/etc/hadoopexp...

敏捷开发_一念成佛_LHY的博客-程序员秘密

为什么敏捷可以拥抱变化?什么是敏捷?敏捷不只是高效,更多的是适应外界环境的不断变化,并做出灵活调整敏捷强调个体之间的互动,要求能够发布可以工作的成果,提倡跟客户建立合作共赢,也推崇拥抱变化的思维。在敏捷宣言提出后,业界也出现了一些偏实践的敏捷方法,例如:XP 极限编程、Scrum 敏捷方法、看板等。而这些敏捷方法中包括了很多有价值的工具,比如,每日站会、结对编程、代码评审、持续集成、测试驱动、计划扑克等。Scrum敏捷方法Scrum 敏捷方法,还提出了团队的角色...

前端上传图片文件到服务器 COS_前端上传图片到服务器_前端 小吕的博客-程序员秘密

平时前端上传图片都会要后端中转一下发送给资源服务器再返回路径给前端,这样势必影响效率。在开发中前端是可以直接上传资源文件到服务器上的,只不过服务器密钥(下文中SecretId,SecretKey)保存在前端不太安全。解决方法 向后端请求一个key值再拿这个key来请求服务器文件流形式上传import axios from 'axios'import COS from "cos-js-sdk-v5";import { Message } from 'element-ui'/* @fail

shell命令(一)_年华终归属时光的博客-程序员秘密

shell 注:本文的图片摘录于runoob网站http://www.runoob.com定义变量的时候,变量名不嫁美元符号 PHP语言中需要使用定义过的变量 $name 可以加花括号识别边界 ${name}只读变量 readonly name 删除变量 unset name  不能删除只读变量局部变量 仅在当前shell实例中有效环境变量 所有的程序包括shell启动...

dz如何自动生成html,DZ X3.2 发帖自动勾选 html代码-【已解决】_酸流的博客-程序员秘密

DZ X3.2 发帖自动勾选 html代码找到文件:/template/default/forum/post_editor_attribute.htm用文当打开,搜索:name="htmlon" id="htmlon"找到:替换为:保存文件上传到网站替换文件,后台更新缓存即可。DZ X2 发帖自动勾选 html代码DZ X2 发帖自动勾选 html代码方法跟上面一样,只是文件不同。template...

推荐文章

热门文章

相关标签