缓存穿透、击穿、雪崩

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

一、缓存穿透

缓存穿透是指缓存和数据库中均不存在目标数据,而用户不断发起请求,缓存也得不到更新,由此每次请求该数据都会到数据库。高并发量,就会对后端的 DB 系统造成很大压力。如查询 id 为“-1”或不存在的数据,此时用户很可能是攻击者,攻击会导致数据库压力过大。关键点:缓存 value 为空;并发量很大去访问 DB。通俗理解,直接把缓存穿透了,没有利用到缓存。

1️⃣造成的原因

  1. 业务自身代码或数据出现问题。
  2. 一些恶意攻击、爬虫造成大量空的命中,此时会对数据库造成很大压力。

2️⃣解决方法

  1. 接口层增加校验,如用户鉴权,id 做基础校验,id<=0 的直接拦截。
  2. 如果查询数据为空,不管是数据不存在还是系统故障,直接设置一个默认值存放到缓存,如此就可以防止暴力攻击。设置一个很短的过期时间(太长会导致正常情况也无法使用)或者当有值的时候将缓存中的值更新掉即可。
  3. 设置布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被该 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。
    tip:可以给 key 设置一些格式规则,查询之前先过滤掉不符合规则的 Key。

二、缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),此时由于并发用户过多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

解决方案:

  1. 设置热点数据永远不过期。
  2. 加互斥锁。

三、缓存雪崩

如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,就会造成缓存雪崩。

缓存层承载了大量的请求,有效的保护了存储层。但是如果缓存整体不能够提供服务,所有的请求,就会到达存储层,存储层的调用量就会暴增,造成存储层挂掉的结果。缓存雪崩的英文解释是奔逃的野牛,指的是缓存层宕掉之后,并发流量会像奔腾的野牛一样,大量涌向后端存储。存在这种问题的一个场景是:当缓存服务器重启或者大量缓存集中在某一个时间段失效,大量数据会去直接访问 DB,此时给 DB 很大的压力。
和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

一个雪崩的简单过程:

  1. Redis 集群大面积故障。
  2. 缓存失效,但仍有大量请求访问缓存服务 Redis。
  3. Redis 服务失效后,大量请求转向到 MySQL。
  4. MySQL 的调用量暴增,很快就扛不住了,甚至直接宕机。
  5. 由于大量的应用服务依赖 MySQL 和 Redis 的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。

1️⃣解决方法

  1. 缓存数据的过期时间随机设置,防止同一时间大量数据过期。
  2. 设置热点数据永远不过期。保证不会出现热点问题,也就是物理上不过期。
  3. 资源保护。使用 netflix 的 hystrix,可以做各种资源的线程池隔离,从而保护主线程池。
  4. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
  5. 缓存的高可用性
    缓存层设计成高可用,防止缓存大面积故障。即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,例如 Redis Sentinel 和 Redis Cluster 都实现了高可用。
  6. 缓存降级
    可以利用 ehcache 等本地缓存(暂时支持),但主要还是对源服务访问进行限流、资源隔离(熔断)、降级等。当访问量剧增、服务出现问题仍然需要保证服务还是可用的。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级,这里会涉及到运维的配合。降级的最终目的是保证核心服务可用,即使是有损的。比如推荐服务中,很多都是个性化的需求,假如个性化需求不能提供服务了,可以降级补充热点数据,不至于造成前端页面是个大空白。在进行降级之前要对系统进行梳理,比如:哪些业务是核心(必须保证),哪些业务可以允许暂时不提供服务(利用静态页面替换)等,以及配合服务器核心指标,来后设置整体预案,比如:
    ①一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
    ②警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
    ③错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
    ④严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。
  7. Redis 备份和快速预热
    ①Redis 数据备份和恢复
    ②快速缓存预热
  8. 使用互斥锁。在缓存失效后,通过加锁或者队列来控制读和写数据库的线程数量。比如:对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。单机可以使用 synchronized或者lock来解决;分布式环境可以用Redis 的 setnx 命令来解决。
  9. 提前演练
    建议还是在项目上线前,演练缓存层宕掉后,应用以及后端的负载情况以及可能出现的问题,对高可用提前预演,提前发现问题。

四、缓存并发

这里的并发指的是多个 Redis 的 client 同时 set key 引起的并发问题。其实Redis 自身就是单线程操作,多个 client 并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。当然,另外的解决方案是把 redis.set 操作放在队列中使其串行化,必须得一个一个执行。

五、缓存预热

缓存预热目的就是在系统上线前,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!

解决思路:

  1. 直接写个缓存刷新页面,上线时手工操作下。
  2. 数据量不大,可以在项目启动的时候自动进行加载。
缓存击穿、缓存穿透和缓存雪崩 缓存击穿  定义: 缓存中的key一般设有过期时间,如果某个key过期了,恰在这个时候,有大量的并发请求访问这个key,则这些请求都会到达DB,导致DB瞬间压力过大,压垮DB。  解决方案: 1.设置互斥锁,mutex。当缓存失效时不时立即去访问数据库,而是使用缓存工具的操作成功带返回值的操作,比如redis的setnx(set if not exit),memcache的add,利用setnx实现 阅读详情

相关推荐

FPGA新手避坑指南:手把手教你搞定RTL8211千兆网PHY的时序配置(附Verilog代码)

本文详细解析了FPGA与RTL8211千兆网PHY芯片的时序配置问题,重点介绍了TXDLY/RXDLY引脚设置、FPGA发送端和接收端的Verilog实现,以及调试与验证的完整流程。通过硬件电路设计和代码示例,帮助开发者解决网络连接不稳定、丢包等常见问题,提升千兆网通信的稳定性。

weixin_28732953的博客 542

缓存失效的三大祸害:穿透、击穿、雪崩及应对策略详解

缓存穿透、缓存击穿和缓存雪崩都是常见的缓存问题,下面分别介绍它们的定义和解决方法:1)缓存穿透缓存穿透指的是恶意用户或攻击者通过请求不存在于缓存和后端存储中的数据来使得所有请求都落到后端存储上,导致系统瘫痪。解决方案通常包括使用布隆过滤器或者黑白名单等方式来过滤掉无效请求,以及在应用程序中加入缓存预热等机制。2)缓存击穿缓存击穿指的是在高并发访问下,某个热点数据失效后,大量请求同时涌入后端存储,导致后端存储负载增大、响应时间变慢,甚至瘫痪。

Hanko的专栏 1万+

【驱动适配】高通sa522平台tac5x1x驱动适配全指南

本手册详细介绍了TAC5301-Q1音频编解码器在高通sa525平台Linux系统下的驱动适配流程。主要内容包括:1)TAC5301-Q1核心特性(车载级音频Codec、关键接口和功能);2)驱动适配依赖(高通声卡驱动、ALSA SoC框架等);3)I2S协议原理及主从模式说明;4)硬件准备与检查要点;5)完整的驱动移植步骤(代码移植、Kconfig/Makefile修改、设备树配置)。该手册适用于嵌入式音频开发工程师快速完成TAC5301-Q1芯片的驱动移植与验证工作。

嵌入式博哥的博客 303

一文彻底分清缓存穿透、缓存击穿、缓存雪崩问题(含记忆技巧)

缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。那么,我们该怎么记忆缓存穿透呢?我们可以这么想,缓存穿透其实就是恶意攻击,就是有人想“穿”过你的防护网(缓存)来“偷”你的家(数据库),这也就是穿透。或者你这样想,有人想恶意攻击你的数据库,这是不是不好的行为,是不是小偷的行为!

胜人者有力,自胜者强! 1万+

从数学到机床:RTCP背后的几何变换与工业实现

本文深入解析RTCP(Rotary Tool Center Point)技术在五轴数控加工中的核心作用,通过几何变换与运动学原理实现刀尖点跟随,确保加工精度。从数学基础到工业实现,详细探讨了算法架构、机床结构适配及精度保障方法,为数控系统开发和高效加工提供关键技术支撑。

jump7的博客 258

bert-ini:一种基于bert的实体对齐交互模型

本次分享一项来自IJCAI-20的实体对齐工作,该工作提出了一种不同于以往的采用图结构信息进行实体对齐的技术方案,该方案取得了当时的最好效果;不仅如此,模型本身的对齐效率在该项工作中也被考虑,实际工作中非常具备借鉴意义。

qq_33331424的博客 3151

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

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

weixin_44479862的博客 2155

现控报告-- 分析倒立摆系统稳定性、能控性及能观性分析,设计PID控制方案(附matlab)

建立直线一级倒立摆系统的动力学模型,推导该系统的运动方程,求出直线一级倒立摆系统传递函数模型及空间状态方程模型。接着描述了PID控制系统设计原理及PID控制器各校正环节的作用,简要叙述了参数的整定方法。设计了直线一级倒立摆摆杆摆角及小车位置常规单回路控制器,通过Simulink仿真知道常规单回路控制器能控制摆杆摆角,不能控制小车位置。于是设计出了直线一级倒立摆双闭环控制器及基于倒立摆系统的状态空间方程控制器,利用软件进行仿真,仿真结果表明,常规双闭环控制方案和基于状态空间方程加控制方案均能对摆杆摆角及小车位

mengshenglo的博客 4万+

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

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

Archer(久遇)的博客 3108

移动端HDR

移动HDR是近年来移动设备最大的技术进步之一。自2017年起,它就开始出现在旗舰手机上,包括苹果(Apple)和三星(Samsung)在内的大多数制造商都加入了这一行列。这一趋势在过去几年里席卷了整个电视行业,但在最近几年才真正深入人心。而且,最近,将更多的HDR内容放到移动设备上的趋势已经加快。对于这种新兴技术来说,它还处于相对早期的阶段,但它也非常有趣,值得关注。 HDR是什么? HDR是...

ISP行业的忠实粉丝 1340

【中项第三版】系统集成项目管理工程师 | 第 1 章 信息化发展

【中项第三版】系统集成项目管理工程师 | 第 1 章 信息化发展

静谧、淡雅 6576

Redis缓存穿透、缓存击穿和雪崩

一、缓存穿透 在讨论缓存穿透之前,我们先来看下从缓存中读取数据时的流程,如图: 缓存穿透是什么? 如果每次都去查一个“缓存和数据库中都必不存在的数据(如id=-1的数据)”,因为缓存中不存在,那么每次请求都会打到DB上,从而导致缓存失去意义,在高并发的情况下就可能导致数据库崩溃,这就是缓存穿透。 缓存穿透的解决方案 1、规范key过滤 规范key的命名,并且统一缓存查询的入...

Felix 6189

项目管理 Agent:进度追踪与风险预警 Harness

我们先从LangChain的Agent定义说起:Agent是一个能感知环境、自主决策、调用工具、执行动作、迭代反思的智能实体。而「项目管理全自主Agent」,就是把Agent的核心能力和项目管理的五大过程组(启动、规划、执行、监控、收尾)深度结合,聚焦执行监控阶段的两个核心痛点:进度偏差自动化计算、风险信号自动化识别与预警的专门化Agent。全感知(Omnisensing):能从。

AI架构师小马 516

【Redis】-缓存穿透、缓存雪崩、缓存击穿

【Redis】-缓存穿透、缓存雪崩、缓存击穿

weixin_36531037的博客 3854

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

缓存雪崩 什么是缓存雪崩 当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。 分析: 造成缓存雪崩的关键在于在同一时间大规模的key失效。为什么会出现这个问题呢,有几种可能,第一种可能是Redis宕机,第二种可能是采用了相同的过期时间。搞清楚原因之后,那么有什么解决方案呢? 解决方案: 1、在原有的失效时间上加上一个随机值,比

keyboard专栏 2808

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Redis的缓存穿透、缓存击穿、缓存雪崩

缓存击穿和缓存雪崩都是与缓存相关的常见问题,它们有一些共同点,并可以采用类似的解决方法。

qq_48595067的博客 7097

Redis缓存穿透、击穿、雪崩

Redis缓存穿透 缓存击穿 缓存雪崩

weixin_42889176的博客 2万+

Redis——缓存穿透、击穿、雪崩

缓存击穿是指在缓存系统中,某个被大量访问的热点数据在缓存中的有效期刚好到期,而此时大量并发请求同时过来访问该数据,由于缓存中已无此数据,这些请求就会同时绕过缓存直接去访问数据库,从而导致数据库瞬间承受巨大的查询压力,可能会影响数据库甚至整个系统的正常运行。缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。这就好比雪崩一样,摧枯拉朽之势,数据库的压力可想而知,可能直接就被这么多请求弄宕机了。举个例子:系统的缓存模块出了问题比如宕机导致不可用。

xxxmine的博客 2074

缓存雪崩、击穿、穿透

我们都知道,用户数据一般都是存储在数据库中,而数据库的数据是落地于磁盘的,如果我们读取数据库的数据那是很慢的。一旦,用户访问量上来,就很容易引起数据库崩溃。所以,我们一般会加入一层缓存避免直接访问数据库,而redis就是不错的缓存层。因为redis是内存数据库,所以存放redis中的数据跟存放在内存中的数据差不多。这也是我们今天要解决的问题,要知道它们怎么发生的,然后该怎么解决。

sanylove的博客 5540

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

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

m0_74312445的博客 1336

缓存穿透、缓存击穿、缓存雪崩如何应对

参考连接:redis避免缓存穿透为什么缓存空对象而不是null? - 知乎 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。 缓存雪崩:当.

WangYouJin321的博客 2175

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

当然,可能针对缓存穿透的情况,也有可能是其他的原因引起,可以针对具体情况,采用对应的措施。缓存击穿,就是说某个 key 非常热点,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。undefined 缓存失效:缓存中的某些数据过期或者被淘汰,在数据重新加载到缓存之前,大量请求会直接穿透到存储系统中查询,导致存储系统负载剧增。2缓存失效:缓存中的某些数据过期或者被淘汰,在数据重新加载到缓存之前,大量请求会直接穿透到存储系统中查询,导致存储系统负载剧增。

刘皇叔说Java的博客 1665

redis缓存雪崩、击穿、穿透

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、redis缓存雪崩二、redis缓存击穿三、redis缓存穿透 前言 主要是介绍一下redis缓存雪崩、击穿、穿透,以及他们的解决方式。 一、redis缓存雪崩 所谓的redis缓存雪崩指的是:redis中大量key集中过期或者redis服务器宕机,从而导致大量请求从数据库获取数据,导致数据库服务器访问压力过大。 解决方式: ① 若是由于大量key过期所造成的,可以给key的ttl设置一个过期时间 ② 若是因为redis.

weixin_45414913的博客 8629
上一篇: Redis生产环境安全加固条规
下一篇: Spring 事务的隔离级别和传播行为
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值