数据雪崩和数据穿透、击穿

【Redis】数据击穿、穿透和雪崩 文章目录一、数据雪崩二、数据穿透三、数据击穿 一、数据雪崩 定时刷新清理缓存中的key时,Redis缓存中大面积key失效,从而导致大量请求直接访问了数据库,大面积的缓存失效,打崩了 DB。 举例: 大量key同时过期,大面积失效,请求直接打到数据库。你想想如果挂的是一个用户服务的库,那其他依赖他的库所有接口几乎都会报错。如果没做熔断等策略基本上就是瞬间挂一片的节奏。 解决: 对症下药,避免缓存中出现大量key同时失效的情况。 设置失效时间。批量往 Redis 存数据的时候,把每个 Key 的失效时间都加 阅读详情

目录

1、数据雪崩

2、数据穿透

3、数据击穿


1、数据雪崩

  • 问题:

定时刷新清理缓存中的key时,Redis缓存中大面积key失效,从而导致大量请求直接访问了数据库,导致数据库崩盘。

  • 举个栗子:

目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者查不到之后去更新缓存的,定时任务刷新就有一个问题。

如果首页所有 Key 的失效时间都是 12 小时,中午 12 点刷新的,我零点有个大促活动大量用户涌入,假设每秒 6000 个请求,本来缓存可以抗住每秒 5000 个请求,但是缓存中所有 Key 都失效了。此时 6000 个/秒的请求全部落在了数据库上,数据库必然扛不住,真实情况可能 DBA 都没反应过来直接挂了。此时,如果没什么特别的方案来处理,DBA 很着急,重启数据库,但是数据库立马又被新流量给打死了。这就是我理解的缓存雪崩。

同一时间大面积失效,瞬间 Redis 跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的。你想想如果挂的是一个用户服务的库,那其他依赖他的库所有接口几乎都会报错。如果没做熔断等策略基本上就是瞬间挂一片的节奏,你怎么重启用户都会把你打挂,等你重启好的时候,用户早睡觉去了,临睡之前,骂骂咧咧“什么垃圾产品”。

  • 解决

对症下药,避免缓存中出现大量key同时失效的情况。

具体来说:

1)设置失效时间。批量往 Redis 存数据的时候,把每个 Key 的失效时间都加个随机值就好了,这样可以保证数据不会再同一时间大面积失效;

setRedis(key, value, time+Math.random()*10000);

2)热点数据均匀分布。如果 Redis 是集群部署,将热点数据均匀分布在不同的 Redis 库中也能避免全部失效。

3)取消设置热点数据有一个失效时间,用更新缓存代替。或者设置热点数据永不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就好了,不要设置过期时间),电商首页的数据也可以用这个操作,保险。


2、数据穿透

  • 问题

缓存穿透:缓存和数据库中都没有的数据,而用户(黑客)不断发起请求。

  • 例子

我们数据库的 id 都是从 1 自增的,如果发起 id=-1 的数据或者 id 特别大不存在的数据,这样的不断攻击导致数据库压力很大,严重会击垮数据库。

  • 解决

1)增加校验。比如用户鉴权,参数做校验,不合法的校验直接 return,比如 id 做基础校验,id<=0 直接拦截;

2)布隆过滤器。Redis 里还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的预防缓存穿透的发生。

它的原理也很简单,就是利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在,不存在你 return 就好了,存在你就去查 DB 刷新 KV 再 return。

 


3、数据击穿

  • 问题

缓存击穿嘛,这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了 DB。

而缓存击穿不同的是缓存击穿是指一个 Key 非常热点,在不停地扛着大量的请求,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发直接落到了数据库上,就在这个 Key 的点上击穿了缓存。

  • 解决

1)设置热点数据永不过期;

2)或者加上互斥锁就搞定了

public static String getData(String key) throws InterruptedException {
        //从Redis查询数据 
        String result = getDataByKV(key);
        //参数校验
        if (StringUtils.isBlank(result)) {
            try {//获得锁
                if (reenLock.tryLock()) {
                    //去数据库查询 
                    result = getDataByDB(key);
                    //校验
                    if (StringUtils.isNotBlank(result)) {
                        //插进缓存 
                        setDataToKV(key, result);
                    }
                } else {
                    //睡一会再拿
                    Thread.sleep(100L);
                    result = getData(key);
                }
            } finally {
                //释放锁 
                reenLock.unlock();
            }
        }
        return result;
    }

 

数据访问的穿透能力-Big SQL与关系型数据库的联盟 在某些场景下,Hadoop平台上的数据分析需要用到RMDBS上的数据,每次从数据源移动或复制数据到Hadoop是不现实的,因为您要考虑移动或复制数据的频率、时间成本、管理成本等等。这样,利用Federation技术直接、透明地访问远程RMDBS数据源成为解决问题的有效途径。 阅读详情

相关推荐

详解缓存穿透、缓存雪崩、缓存击穿

在现代软件架构中,缓存的应用已经非常普及。缓存的使用在面试和实践中都是避不开的硬技能、硬知识,如果你说还不太熟悉缓存的使用,可能都不好意思说自己是程序员。 当我们使用缓存时,目标通常有两个:第一,提升响应效率和并发量;第二,减轻数据库的压力。...

琅枫的博客 5万+

Redis的数据穿透、数据击穿与数据雪崩

什么是Redis的数据穿透、数据击穿与数据雪崩

Weber's blog 1402

数学建模常用模型10 :数据包络(DEA)分析法(投入产出法)

数据包络分析是评价多输入指标和多输出指标的较为有效的方法,将投入与产出进行比较。它的结果包含的意思有: ①θ=1,DEA有效,表示投入与产出比达到最优 ②θ&lt;1,非DEA有效,表示投入与产出比没有达到最优,一般来说,θ越大说明效果越好。 数据包络分析是通过对投入的指标和产出的指标做了一个线性规划,并且进行变换后,然后根据其线性规划的对偶问题(线性规划对偶问题具有经济学意义),求解这个对...

HaLosec_Wei 9万+

Redis入门讲解(五种数据类型和穿透、击穿、雪崩及四种模式)

Redis的安装与使用及4种模式一、什么是Redis Redis的作用是什么?1.安装二、五种类型的简单使用:String类型String 类型lit 类型hash 类型set 类型zset 类型三、redis的穿透、击穿、雪崩3.1穿透3.2击穿3.3雪崩四、Redis的持久化方式 RDB和AOF4.1RDB(默认持久化方式)4.2AOF五、单机模式、主从模式、哨兵模式、集群模式5.1单机模式5.2主从模式5.3哨兵模式5.4集群模式 撒啊实打实的 一、什么是Redis Redis的作用是什么? Re

li836779537的博客 1609

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 552

卡诺图化简法注意事项+竞争冒险知识点总结

今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。

weixin_42415266的博客 1万+

雪崩、击穿、穿透

雪崩就是同一时间缓存同时失效导致大量数据同时访问数据库导致数据库崩溃。 解决方案:随机时效值、定时刷新,不设置失效值。 穿透就是值数据在缓存中没有,而直接访问数据库,黑客使用id=-1跳过缓存直接访问数据库。 解决方案:数据库无论查询出什么值都写入redis,拉黑IP,布隆过滤器。 击穿:双十一,某个key特别火爆,但是突然失效了,会导致大量访问打到数据库上。 解决方案:加锁数据库查询之后再返回redis、永不过期。 ...

HyzKey2U的博客 613

pip——【Fatal error in launcher: Unable to create process】的深度排查与修复指南

本文深度解析了Python包管理工具pip报错【Fatal error in launcher: Unable to create process】的根本原因与解决方案。该错误通常由Python解释器路径变更、虚拟环境损坏或多版本冲突导致。文章提供了从快速排查到彻底修复的完整指南,包括使用`python -m pip`命令绕过启动器、修复或重装pip、重建虚拟环境等核心方法,并给出了预防此错误的最佳实践。

weixin_29306261的博客 598

mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?

对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣​​redis缓存穿透​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据库查询为null。每次请求落在数据库、并且高并发。数据库扛不住会挂掉。解决方案可以将查到的null设成该key的缓存对象。当然,也可以根据明显错误的key在逻辑层就就行验证。同时,你也可以分析用户行为,是否为...

weixin_31026805的博客 1245

openwrt之luci通信原理(一)

从模板中分离,每个LuCI2子页面也需要一个定义并存放在/www/luci2/view/目录下的一个视图,视图是使用了子页面特定对象的L.ui.view扩展的JavaScript文件。有一点需要注意的是需要提供execute方法,创建视图失败有几种原因,特别是当它需要ubus加载额外的数据使用的时候。所以在execute方法中提供成功或者失败的信息是有意义的。不幸的是在异步方法加载特定数据的时候,不能简单的返回true或false,解决的方法是返回一个Promise对象来运行推迟提供是否成功的信息。

1150

vue3 - 实现WebRTC播放实时rtsp视频流+NVR录像机回放,web前端浏览器网页播放RTSP推流,支持海康威视大华等摄像头/监控设备对接(监控摄像头录像及回放,拿到rtsp视频流如何处理)

vue3,webrtc-streamer,rtsp视频流,监控画面,nvr录像机,回放功能,监控摄像头设备,vue3播放Rtsp推流示例代码,前端如何在vue3项目中播放rtsp视频流,VUE中播放RTSP实时推流播放解决方案,vue3 webrtc播放rtsp视频流,vue3实现rtsp视频流浏览器实时播放,海康摄像机、NVR、流媒体服务器、回放取流RTSP地址,vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频,播放海康rtsp监控视频,海康摄像机/录像机预览+回放RT

✅ 精选推荐文章 1万+

缓存雪崩、缓存击穿、缓存穿透详解

缓存雪崩指的是由于缓存服务器在同一时间大面积失效或宕机,导致大量请求直接访问数据库,瞬间引发数据库压力激增,甚至导致数据库崩溃。缓存击穿是指某个热点数据在缓存中失效的瞬间大量的并发请求同时访问该数据,由于该数据在缓存中失效,大量请求同时访问数据库,造成数据库压力骤增。这种情况通常发生在热点数据或访问频繁的数据上。缓存穿透是指客户端频繁访问一些根本不存在的缓存数据,由于缓存中没有这些数据的记录,每次请求都直接访问数据库,导致数据库压力增大,但是数据库中也不存在。

Archer(久遇)的博客 3109

软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)

多语言版本解决方案是应对全球化趋势的关键策略,它通过构建灵活且可扩展的架构,支持软件产品在不同语言和文化环境下的顺畅运行与展示。此方案涵盖了前端多语言界面实现、后端多语言数据处理及大数据环境下的多语言支持等多个层面,确保公司能够高效地推出适应全球用户多样化需求的软件产品。在前端多语言界面实现方面,解决方案采用了国际化与本地化的结合方法。国际化过程确保软件的功能和代码设计能够处理多种语言和文化习惯,而本地化则针对特定地区进行界面和内容的调整。

大模型大数据攻城狮的专栏 2754

Redis的击穿、雪崩、穿透

本文简单解释了使用redis经常出现的问题:击穿、雪崩、穿透。也是经典的面试题。

weixin_63771437的博客 1566

14 | TensorFlow2对阿拉伯语手写字符数据集进行识别

该数据集由 60 名参与者书写的16,800 个字符组成,年龄范围在 19 至 40 岁之间,90% 的参与者是右手。每个参与者在两种形式上写下每个字符(从“alef”到“yeh”)十次,如图 7(a)和 7(b)所示。表格以 300 dpi 的分辨率扫描。使用 Matlab 2016a 自动分割每个块以确定每个块的坐标。该数据库分为两组:训练集(每类 13,440 个字符到 480 个图像)和测试集(每类 3,360 个字符到 120 个图像)。数据标签为1到28个类别。

微信号:RunsenLiu 2876

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最全面的Redis缓存雪崩、击穿、穿透问题解决方案

先把我们数据库的数据都加载到我们的过滤器中,在缓存之前在加一层BloomFilter,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存,然后查DB。缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id

weixin_44330810的博客 846

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

redis缓存雪崩、击穿、穿透

Redis 雪崩 是在缓存失效后,大量请求直接打到数据库,导致数据库压力骤增甚至崩溃的问题。在高并发场景下,Redis 雪崩可能会带来严重后果。为了避免 Redis 雪崩,可以采取多种措施,如 缓存预热、设置不同过期时间、使用互斥锁防止缓存击穿、缓存降级、限流与熔断机制 等。持久化与集群 是提升 Redis 可用性的关键,确保即便在单个节点失效的情况下,服务依然能够正常工作。缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。

weixin_43539296的博客 2263

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

缓存穿透、缓存击穿、缓存雪崩的区别?

缓存穿透:缓存穿透是指客户端请求的,这样缓存永远不会生效,这些。

GreenAmanda的博客 1226

redis解决缓存穿透/击穿/雪崩

缓存雪崩指的是同一时段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力也称为热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会瞬间给数据库带来极大冲击。

aloha 2317

一篇文章带你完全理解Redis缓存穿透、击穿和雪崩

上面的内容中若是不小心,很容易就会搞混淆。比如名字上很难区分穿透和击穿,概念上击穿和雪崩又有点相似。首先是穿透和击穿,我们从直觉上来说,击穿是不是比穿透跟尖锐一点没错,你的感觉是对的。我很喜欢举个例子:你走在路上,遇到一个人对你突然无理取闹。你只是会觉得这人神经病吧?!但是你对于他这种”无理的语言“,左耳朵进,右耳朵出,他的话只是穿过你的耳朵。结合上述穿透的例子,有感觉没?但是如果你走在路上,有人对你的眼睛扔了个小石头。如果你平时戴眼镜,用的力气大一点就会击穿你的眼镜玻璃...

weixin_66129233的博客 928

什么是Redis缓存穿透、缓存雪崩和缓存击穿

Redis缓存 极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。 另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案。本篇文章,并不是要更加完美的解决这三个问题,也不是要颠覆业界流行的解决方案。而是,从实际代...

LWHuai的博客 725

缓存击穿、穿透、雪崩分别是什么意思?怎么解决?

指某个热点 key 在某一瞬间失效,而此时有大量并发请求访问这个 key,由于缓存失效,请求会同时打到数据库,可能造成数据库压力骤增,甚至崩溃。指请求的数据在缓存和数据库中都不存在,用户请求会每次都打到数据库,形成大量无效访问。指大量缓存集中在某一时间失效,导致请求全部落到数据库,产生“雪崩”效应。问题类型定义影响典型原因常见解决缓存击穿热点 key 失效被高并发请求打穿数据库被冲垮缓存 TTL 到期加锁互斥、永不过期、异步更新缓存穿透查询数据不存在,缓存和数据库都无数据库压力。

weixin_46072507的博客 1350

Redis的穿透, 雪崩与击穿

Redis的穿透, 雪崩与击穿 文章目录Redis的穿透, 雪崩与击穿redis穿透什么是redis穿透?发生场景:解决方案redis雪崩:什么是redis雪崩?发生场景解决方案redis击穿什么是redis的击穿发生场景解决方案 redis穿透 什么是redis穿透? 查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存 这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义 在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻

weixin_47073925的博客 180

缓存穿透和缓存击穿及缓存雪崩有什么区别

缓存穿透和缓存击穿及缓存雪崩有什么区别

峰爸的博客 928

redis 的雪崩、穿透和击穿

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

phcgld1314的博客 614
上一篇: Spring常用注解 - 可能会不断更新-- 边学边记
下一篇: 每日算法 - 多线程 交替输出1A2B3C4D...26Z
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值