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

【JAVA面试】缓存穿透、缓存击穿、缓存雪崩 提示:文章先作为初版,等后续时间充足后,补充更深的内容。 阅读详情

背景
在现代软件架构中,缓存的应用已经非常普及。缓存的使用在面试和实践中都是避不开的硬技能、硬知识,如果你说还不太熟悉缓存的使用,可能都不好意思说自己是程序员。

这篇文章,带大家进一步学习在缓存使用中不得不考虑三个特殊场景:缓存穿透、缓存雪崩、缓存击穿。

为什么说不得不考虑?因为如果不考虑这些特殊的场景,在高并发的情况可能直接导致系统崩溃。下面以常见的Redis缓存组件为例来讲解这三种场景及解决方案。

大前提
当我们使用缓存时,目标通常有两个:第一,提升响应效率和并发量;第二,减轻数据库的压力。

而本文中所提到的这三种场景:缓存穿透、缓存雪崩和缓存击穿的发生,都是因为在某些特殊情况下,缓存失去了预期的功能所致。

当缓存失效或没有抵挡住流量,流量直接涌入到数据库,在高并发的情况下,可能直接击垮数据库,导致整个系统崩溃。

这就是我们需要知道的大前提,而缓存穿透、缓存雪崩和缓存击穿,只不过是在这个大前提下的不同场景的细分场景而已。

缓存穿透
大多数情况,缓存可以减少数据库的查询,提升系统性能。

通常流程是:一个请求过来,先查询是否在缓存当中,如果缓存中存在,则直接返回。如果缓存中不存在对应的数据,则检索数据库,如果数据库中存在对应的数据,则更新缓存并返回结果。如果数据库中也不存在对应的数据,则返回空或错误。

缓存穿透(cache penetration)是用户访问的数据既不在缓存当中,也不在数据库中。出于容错的考虑,如果从底层数据库查询不到数据,则不写入缓存。这就导致每次请求都会到底层数据库进行查询,缓存也失去了意义。当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤增,甚至崩溃,这就是缓存穿透问题。

缓存穿透

 

缓存穿透发生的场景一般有两类:

原来数据是存在的,但由于某些原因(误删除、主动清理等)在缓存和数据库层面被删除了,但前端或前置的应用程序依旧保有这些数据;

恶意攻击行为,利用不存在的Key或者恶意尝试导致产生大量不存在的业务数据请求。

缓存穿透通常有四种解决方案,我们逐一介绍分析。

方案一:缓存空值(null)或默认值

分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。需要注意的是,针对空值的缓存失效时间不宜过长,一般设置为5分钟之内。当数据库被写入或更新该key的新数据时,缓存必须同时被刷新,避免数据不一致。

方案二:业务逻辑前置校验

在业务请求的入口处进行数据合法性校验,检查请求参数是否合理、是否包含非法值、是否恶意请求等,提前有效阻断非法请求。比如,根据年龄查询时,请求的年龄为-10岁,这显然是不合法的请求参数,直接在参数校验时进行判断返回。

方案三:使用布隆过滤器请求白名单

在写入数据时,使用布隆过滤器进行标记(相当于设置白名单),业务请求发现缓存中无对应数据时,可先通过查询布隆过滤器判断数据是否在白名单内,如果不在白名单内,则直接返回空或失败。

方案四:用户黑名单限制

当发生异常情况时,实时监控访问的对象和数据,分析用户行为,针对故意请求、爬虫或攻击者,进行特定用户的限制;

当然,可能针对缓存穿透的情况,也有可能是其他的原因引起,可以针对具体情况,采用对应的措施。

缓存雪崩


在使用缓存时,通常会对缓存设置过期时间,一方面目的是保持缓存与数据库数据的一致性,另一方面是减少冷缓存占用过多的内存空间。

 

但当缓存中大量热点缓存采用了相同的实效时间,就会导致缓存在某一个时刻同时实效,请求全部转发到数据库,从而导致数据库压力骤增,甚至宕机。从而形成一系列的连锁反应,造成系统崩溃等情况,这就是缓存雪崩(Cache Avalanche)。

缓存雪崩

上面讲到的是热点key同时失效的场景,另外就是由于某些原因导致缓存服务宕机、挂掉或不响应,也同样会导致流量直接转移到数据库。

所以,缓存雪崩的场景通常有两个:

大量热点key同时过期;

缓存服务故障;

缓存雪崩的解决方案:

通常的解决方案是将key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的失效。

考虑用队列或者锁的方式,保证缓存单线程写,但这种方案可能会影响并发量。

热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景。

双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。

构建缓存高可用集群(针对缓存服务故障情况)。

当缓存雪崩发生时,服务熔断、限流、降级等措施保障。

缓存击穿
缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。这种情况就是缓存击穿(Cache Breakdown)。

缓存击穿

 

从定义上可以看出,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。因此,可以将缓存击穿看作是缓存雪崩的一个子集。

缓存击穿的解决方案:

使用互斥锁(Mutex Key),只让一个线程构建缓存,其他线程等待构建缓存执行完毕,重新从缓存中获取数据。单机通过synchronized或lock来处理,分布式环境采用分布式锁。

热点数据不设置过期时间,后台异步更新缓存,适用于不严格要求缓存一致性的场景。

”提前“使用互斥锁(Mutex Key):在value内部设置一个比缓存(Redis)过期时间短的过期时间标识,当异步线程发现该值快过期时,马上延长内置的这个时间,并重新从数据库加载数据,设置到缓存中去。

小结
本文介绍了在使用缓存时经常会遇到的三种异常情况:缓存穿透、缓存雪崩和缓存击穿。

三种异常情况从根本上来说都是因为本应该访问缓存的,但是缓存不存在或服务异常,导致流量直接进入了数据库层面。

其中缓存雪崩和缓存击穿是因为数据不存在(或服务异常获取不到),导致大量请求访问数据库,从而导致数据库压力骤增,甚至崩溃。

而缓存穿透则是由于数据本身就不存在,导致缓存没有进行数据缓存,流量进入数据库层。

针对不同的缓存异常场景,可选择不同的方案来进行处理。当然,除了上述方案,我们还可以限流、降级、熔断等服务层的措施,也可以考虑数据库层是否可以进行横向扩展,当缓存异常发生时,确保数据库能够抗住流量,不至于让整个系统崩溃。
————————————————
版权声明:本文为优快云博主「梦远星帆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_45637260/article/details/125866738

Redis-缓存穿透、缓存雪崩、缓存击穿详解 redis有关缓存穿透、缓存雪崩、缓存击穿的详解 阅读详情

相关推荐

详解缓存雪崩,缓存穿透,缓存击穿及其解决方案

目录如下:一、正常情况二、缓存雪崩1、解决方法三、缓存击穿1、解决方法四、缓存穿透1、解决方法 一、正常情况 正常情况下的流程是这样的,先查缓存,缓存无就查数据库。 二、缓存雪崩 缓存雪崩是指缓存中的数据大批量的过期 ,而查询量巨大,造成数据库压力过大而崩溃。 1、解决方法 尽量保证redis集群的高可用性,当发现机器坠机时尽快补上。 选择合适的缓存淘汰策略。 缓存的过期设置随机时间,防止大量数据同时过期。 利用redis持久化机制保存的数据尽快恢复缓存。 三、缓存击穿 缓存击穿是指缓存中没有数据,而

小白菜的博客 972

Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。也就是有请求一请求到后端就一定会打到数据库(redis和MySQL都没有该数据),打一次不要紧,但要是有无数个请求同时打过来,那数据库大概率会崩溃,所以预防缓存穿透问题还是十分重要的。缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

csdn3043663729的博客 3417

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:)

从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed....

qq_40417648的博客 6228

关于缓存异常:缓存雪崩、击穿、穿透的解决方案

关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。 这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机。为了避免异常带来的损失,我们需要了解每种异常的原因以及解决方案,提高系统的可靠性。缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,从而使得大量请求发送到数据库层,导致数据库压力过大甚至宕机。第一个原因:同一时间缓存中的数据大面积过期。具体来说,把热点数据保存在缓存中,并且设置了过期时间,如果在某一个时刻,大量的K

Admans的专栏 517

别再死磕MuJoCo了!用PyBullet+Stable-Baselines3搞定机械臂强化学习(保姆级环境配置)

本文详细介绍了如何使用PyBullet和Stable-Baselines3构建机械臂强化学习系统,绕过昂贵的MuJoCo许可壁垒。通过实战指南,包括环境配置、机械臂Gym环境构建、训练策略与调优技巧,帮助开发者快速掌握机器人强化学习技术,提升智能控制效率。

weixin_42667269的博客 264

SolidWorks有限元分析流程

对于很多专业,在进行设计完成后,为了缩短开发周期,往往需要配合仿真结果进行,机械行业更是如此。平时大家多采用专业有限元仿真软件进行仿真分析,如ANSYS;不过SolidWorks软件因为制图简单,同时存在专用的有限元仿真模块Simulation,对于初学者往往更加适用,下面简单介绍下SolidWorks Simulation仿真流程。 1. 分析流程 关键步骤如下: **(1)创建算例;**对模型的每次分析都是一个算例,一个模型可以包含多个算例。 **(2)应用材料;**指定模型的材料属性,如铝合金、钢材等

DYH_BK的博客 3万+

缓存穿透、缓存击穿、缓存雪崩,及解决方案

缓存穿透,缓存击穿,缓存雪崩,以及解决方案

qq_45626589的博客 3153

DFX从芯片到系统:可制造性、可测试性与可靠性设计实战指南

DFX(Design for eXcellence)是一套面向产品全生命周期的设计方法论,涵盖可制造性(DFM)、可测试性(DFT)、可靠性(DFR)等维度。其核心原理是将制造、测试、维护等环节的约束前置到设计阶段,从而降低流片与量产风险。在芯片与系统硬件领域,DFX不仅是提升良率与测试效率的关键手段,更是保障车规、工控等严苛场景下长期稳定运行的基础。从芯片物理实现到PCB布局,再到系统级散热与维护设计,DFX的落地需要工具链、流程闸门与跨部门协作的体系化支撑。本文基于实际项目经验,分享DFX从设计决策到工

weixin_32349093的博客 350

【缓存雪崩,缓存击穿,缓存穿透面试题】

如果业务曾的确要求有数据同时失效,你可以用 EXPIRE命令给每个数据设置过期时间时,给这些数据的过期时间,给这些数据过期时间增加一些较小的随机数 不同数据的过期时间有差别,但是差别又不大,避免大量数据同时过期。缓存穿透:要访问的数据既不是Redis缓存中也不再数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。数据保存在缓存中,并设置了过期时间时,如果某一时刻,大量数据同时过期,此时,应用程序再访问这些数据的话,就会发生缓存缺失。

野蛮女孩的博客 726

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 357

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》

摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。

Celine的博客 4554

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

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

Archer(久遇)的博客 3108

告别OpenAI API调用:手把手在本地CPU/GPU上部署fast-whisper中文语音识别模型

本文详细指导如何在本地CPU/GPU上部署fast-whisper中文语音识别模型,摆脱对OpenAI API的依赖。从环境准备、模型获取与优化,到CPU/GPU环境的具体部署步骤和性能优化技巧,全面覆盖本地化语音识别的实现方案,帮助开发者提升效率并保障数据隐私。

weixin_29988907的博客 307

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

若可能存在,再查缓存和数据库。:结合本地缓存(Caffeine)与分布式缓存(Redis),减少穿透风险。第一个请求未命中缓存时,加锁查库并回填缓存,其他请求等待或重试。使用 Hystrix 等工具,当数据库压力过大时,拒绝部分请求。:如缓存集群宕机、促销活动结束时大量商品缓存同时失效。:实时监控缓存命中率、数据库 QPS,及时发现问题。非法请求(如无效 ID)绕过缓存,直接访问数据库。:模拟极端场景(如瞬间高并发),验证系统容灾能力。缓存永不过期,但存储逻辑过期时间,异步刷新缓存。

looken1024的博客 819

Unity 工具 之 SoftMask软遮罩 实现 UI 边缘渐变过渡的简单使用介绍

目录Unity 工具 之 SoftMask软遮罩 实现 UI 边缘渐变过渡的简单使用介绍一、简单介绍二、Mask 实现的遮罩效果三、Soft Mask 实现遮罩效果四、 Soft Mask 的一些设置五、插件下载Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

仙魁XAN 8575

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Redis【缓存雪崩,缓存穿透,缓存击穿】详解

redis缓存雪崩,缓存穿透,缓存击穿问题

日常学习总结 3543

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

m0_66220639的博客 1019

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

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

Redis发生的缓存穿透,缓存雪崩,缓存击穿详解

什么是缓存:举个例子:越野车,山地自行车,都拥有"避震器",车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的,像个弹簧一样;同样,实际开发中,系统也需要"避震器",防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪;Cache),就是数据交换的,俗称的缓存就是由于其被修饰,所以随着类的加载而被加载到,作为本地缓存,由于其又被修饰,所以其引用(例3:map)和对象(例3:new HashMap())之间的关系是固定的,不能改变,因此不用担心赋值(=)导致缓存失效;

2301_81012448的博客 908

Redis 缓存穿透、缓存击穿与缓存雪崩详解:问题、解决方案与最佳实践

缓存穿透是指查询一个不存在的数据,导致请求直接穿透缓存层,直接访问数据库。由于数据库中也不存在该数据,因此每次请求都会绕过缓存,直接访问数据库,从而导致数据库压力过大。缓存击穿是指某个热点数据在缓存中过期,同时有大量并发请求访问该数据,导致所有请求直接访问数据库,从而导致数据库压力激增。缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求直接访问数据库,从而导致数据库压力激增甚至崩溃。缓存穿透、缓存击穿和缓存雪崩是 Redis 使用过程中常见的问题,它们会导致数据库压力过大甚至系统崩溃。缓存穿透。

秃头之旅 4841

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

缓存穿透:缓存穿透是指当查询的数据在缓存中不存在时,大量的请求会直接访问数据库,导致数据库压力增大。网友回答:简述:查询一个一定不存在的数据,由于缓存不命中,每次都会去查询数据库,导致缓存失去意义,一般是被攻击时详解:缓存穿透指在高并发场景下,如果某一个 key 被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求到达数据库,而当该 key 对应的数据库本身value就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

m0_64422133的博客 1103

缓存穿透,缓存雪崩,缓存击穿的超详解

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

Qgchun. 4490

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

问题核心原因影响范围典型解决方案缓存穿透查询不存在的数据单个不存在的 Key空值缓存、布隆过滤器缓存雪崩大量 Key 集中过期或缓存宕机大量 Key,全局影响过期时间随机化、集群化、限流缓存击穿热点 Key 过期瞬间的高并发单个热点 Key互斥锁、热点 Key 永不过期实际开发中,需结合业务场景选择合适的方案,通常多种策略组合使用(如空值缓存 + 布隆过滤器解决穿透,随机过期 + 集群解决雪崩),以提高系统的稳定性和性能。

qq_51250589的博客 997

Redis篇之缓存雪崩、击穿、穿透详解

Redis篇之缓存雪崩、击穿、穿透详解

一名编程小白的Java学习日志 1986

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

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

Hanko的专栏 1万+
上一篇: mycat 自动生成ID策略配置
下一篇: mysql 优化配置
javaee1234
博客等级 码龄10年 49粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值