如何区分与解决Redis的缓存雪崩、击穿与穿透问题

[自动化工具] 解放双手的利器:「自动邮件平台」工具助你高效搞定重复通知任务 摘要:自动邮件平台是一款零门槛自动化工具,帮助用户高效处理重复性邮件任务。该平台支持两种调度模式(指定日期和间隔天数),无需编码即可快速设置账单提醒、活动通知等任务。提供免费托管版(小时级调度)和自主部署版(分钟级调度),满足不同精度需求。典型应用场景包括客户跟进、系统监控等周期性任务。用户只需三步即可完成设置,还能扩展定制化功能。该工具让非技术人员也能轻松实现邮件自动化,释放时间专注更重要的工作。 阅读详情

Redis最常用使用的场景就是作为业务系统的缓存,既然是作为缓存,那么就不免会碰到缓存常见的问题,即雪崩、击穿与穿透,什么是缓存雪崩、击穿与穿透以及如何解决这几个问题呢?今天我们一起来探讨一下!

一、缓存雪崩

1. 什么是缓存雪崩?

缓存雪崩是指大量的请求无法命中Redis中的缓存数据,也就是在Redis找不到数据了,那业务系统只能到数据库中查询,进而导致所有的请求都发送到了数据库。如下图所示:

​数据库并不像Redis能处理大量请求,由缓存雪崩导致的请求激增必须会导致数据库所在宕机,这样势必会影响业务系统,所以如果发生缓存雪崩,对于业务系统肯定是致命的。

2. 为什么发会生缓存雪崩?

什么情况下出现缓存雪崩呢?总结起来有以下两个方面的原因:

  • 大量Redis缓存数据同时过期,导致所有的发送到Redis请求都无法命中数据,只能到数据库中进行查询。

  • Redis服务器宕机,所有请求都无法经Redis来处理,只能转向数据库查询数据。

3. 如何避免缓存雪崩?

针对导致缓存雪崩的原因,有不同的解决方法:

  • 针对大量缓存随机过期时间,解决方法就是在原始过期时间的基础上,再加一个随机过期时间,比如1到5分钟之间的随机过期时间,这样可以避免大量的缓存数据在同一时间过期。

  • 而针对Redis解决宕机的导致的缓存雪崩,可以提前搭建好Redis的主从服务器进行数据同步,并配置哨兵机制,这样在Redis服务器因为宕机而无法提供服务时,可以由哨兵将Redis从服务器设置为主服务器,继续提供服务。

二、缓存击穿

1. 什么是缓存击穿

缓存击穿与缓存雪崩的情况相似,雪崩是因为大量的数据过期,而缓存击穿则是指热点数据过期,所有针对热点数据的请求都需要到数据库中进行处理,如下图所示:

​

2. 怎么避免缓存击穿?

解决缓存击穿的三种方式:

  • 不设置过期时间

如果我们能提前知道某个数据是热点数据,那么就可以不设置这些数据的过期,从而避免缓存击穿问题,比如一些秒杀活动的商品,在秒杀时会大量用户访问,这时候我们就可以将这些用于秒杀的商品数据提前写入缓存并且不设置过期时间。

  • 互斥锁

提前知道某些数据会有大量访问,我们当然可以设置不过期,但更多时候,我们并不能提前预知,这种情况要怎么处理呢?

我们来分析一下缓存击穿的情况:

正常情况下,当某个Redis缓存数据过期时,如果有对该数据的请求,则重新到数据库中查询并再写入缓存,让后续的请求可以命中该缓存而无须再去数据库中查询。

而热点数据过期时,由于大量请求,当某个请求无法命中缓存时,会去查询数据库并重新把数据写入Redis,也就是在写入Redis之前,其他请求进来,也会去查询数据库。

好了,我们知道热点数据过期后,很多请求会去查询数据库,那么我们可以给去查询数据库的业务逻辑加个互斥锁,只有获得锁的请求才能去查询数据库并把数据写回Redis,而其他没有获得锁的请求只能等待数据就绪。

上述步骤的如下图所示:

​

  • 设置逻辑过期时间

使用互斥锁虽然可以非常简单地解决缓存击穿问题,但没有获得锁的请求虽然排队等待,这样影响了系统的性能,还有另一种解决缓存击穿的方法就是在业务数据冗余一个过期时间,比如下面的数据中我们增加了expire_at字段用于表示数据过期时间。

{"name":"test","expire_at":"1599999999"} 复制代码

这种方式的实现过程如下图所示:

​缓存中的热点数据中冗余一个逻辑过期时间,但数据在Redis不设置过期时间

当一个请求拿到Redis中的数据时,判断逻辑过期时间是否到期,如果没有到期,直接返回,如果到期则开启另一个线程获得锁后去查询数据库并将查询的最新数据写回Redis,而当前请求返回已经查询的数据。

三、缓存穿透

1. 什么是缓存穿透

缓存穿透是指要查找的数据既不在缓存当中,也不在数据库中,因为不在缓存中,所以请求一定会到达数据库,Redis缓存形同虚设,如下图所示:

​

2. 为什么会发生缓存穿透

什么条件下会发生缓存穿透呢?主要有以下三种情况:

  • 用户恶意攻击请求

  • 误操作把Redis和数据库里的数据删除了

  • 用户还未产生内容时,比如用户的文章列表,用户还未写文章,所以缓存和数据库都没有数据

3. 如何避免缓存穿透?

a. 缓存空值或缺省值

当在Redis缓存中查询不到数据时,再从数据库查询,如果同样没有数据,就直接缓存一个空间或缺省值,这样可以避免下次再去查询数据库;不过为了防止之后已经数据库已经相应数据库,再返回空值问题,应该为缓存设置过期时间,或者在产生数据时直接清除对应的缓存空值。

b. 布隆过滤器

虽然缓存空值可以解决缓存穿透问题,但仍然需要查询一次数据库才能确定是否有数据,如果有用户恶意攻击,高并发地使用系统不存在的数据id进行查询,所有的查询都要经过数据库,这样仍然会给数据库带来很大的压力。

所以,有没有不用查询数据库就能确定数据是否存在的办法呢?有的,用布隆过滤器。

布隆过滤器主要是两个部分:bit数组+N个哈希函数,其原理为:

  • 使用N个哈希函数对所要标记的数据进行哈希值计算。

  • 将计算到的哈希值对bit数组的长度取模,这样可以得到每个哈希值在bit数组的位置。

  • 把bit数组中对应的位置标记为1。

下面是布隆过滤器原理示意图:

​当要进行数据写入时,执行述述步骤,计算对应bit数组位置并标识为1,那么在执行查询时,就能查询该数据是否存在了。

另外,由于哈希碰撞问题导致的误差,所以不存在的数据经过布隆过滤器后,会被判定为存在,再去查数据库,不过哈希碰到的概率很小,用布隆过滤器已经能帮我们拦截大部分的穿透请求了。

Redis本身就支持布隆过滤器,所以我们可以直接使用Redis布隆过滤器,而不用自己去实现,非常方便。

四、小结

缓存的雪崩、击穿、穿透是在业务应用缓存时经常会碰到的缓存异常问题,其原因与解决方法如以下表示所示:

问题

原因

解决方法

缓存雪崩

大量数据过期或Redis服务器宕机

1. 随机过期时间 2. 主从+哨兵的集群

缓存击穿

热点数据过期

1. 不设置过期时间 2. 加互斥锁 3. 冗余逻辑过期时间

缓存穿透

请求数据库和Redis都没有的数据

1. 缓存空值或缺省值 2. 布隆过滤器

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践 本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。 阅读详情

相关推荐

手把手教你用mitmproxy抓包抖音数据流(附Python脚本模板)

本文详细介绍了如何使用mitmproxy抓包抖音数据流,包括环境搭建、证书安装和Python脚本模板。从mitmproxy配置到抖音API解析,提供完整的移动端数据流分析方案,帮助开发者快速掌握数据抓取技术,适用于应用优化、竞品分析和安全审计等场景。

weixin_33670786的博客 307

Redis作为数据库和缓存的区别

Redis作为数据库和缓存的区别

Lucky boy的博客 1569

Windows环境下Elasticsearch与JDK版本兼容性实战指南

本文详细解析了Windows环境下Elasticsearch与JDK版本的兼容性问题,提供了从版本匹配检查到安装部署的完整实战指南。重点介绍了Elasticsearch 8.x需JDK 17+等关键版本对应关系,并分享多版本JDK共存方案及性能优化技巧,帮助开发者高效避坑。

weixin_29250403的博客 421

牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩!

前言 如何有效的理解并且区分 Reids 穿透、击穿和雪崩之间的区别,一直以来都挺困扰我的。特别是穿透和击穿,过一段时间就稀里糊涂的分不清了。 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三种场景。笔者总结了一些关键词,希望大家可以和我一样通过联想的方式来区分并理解这三种场景的区别! 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了。下面这段逻辑大家用的会比较多:先去 Redis 中查找某资源,Redis 中查不到

weixin_47531845的博客 3851

Switch游戏安装新思路:抛弃Commander One,试试这款免费的Mac神器OpenMTP

本文介绍了Mac用户安装Switch游戏的新选择——免费工具OpenMTP,对比收费软件Commander One,OpenMTP在MTP连接稳定性和文件管理上更具优势。详细解析了OpenMTP的安装配置、核心功能及实战操作,帮助用户高效完成游戏安装,特别适合已破解并安装DBI的Switch用户。

weixin_30664051的博客 582

ArcGIS遥感影像分类技术在植被覆盖度计算中的应用

本文详细介绍了如何利用ArcGIS遥感影像分类技术高效计算植被覆盖度。通过数据准备、监督与非监督分类方法详解,并结合制表分析与栅格计算器进行面积统计,最终实现从分类图到覆盖度百分比的全流程自动化与可视化,为生态评估与规划提供精准数据支持。

weixin_29091445的博客 420

redis 判断key是否失效_Redis缓存雪崩、击穿、穿透

什么是redis雪崩? 目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。举个例子:如果所有首页的key失效时间都是12小时,中午12点刷新的,我零点有个秒杀 活动大量用户涌入,假设当时每秒6000个请求,本来缓存在可以抗住每秒5000个请求,但是缓存当时所有的key都失效了。此时1秒6000个请求全部落数据库。数据库此时必然挂掉...

weixin_29061821的博客 1059

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8828

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

关于缓存雪崩、击穿、穿透的解决方案前言缓存雪崩缓存雪崩的原因解决方案缓存击穿解决方案缓存穿透解决方案布隆过滤器布隆过滤器原理布隆过滤器如何使用在Java中使用布隆过滤器 前言 关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。 这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机。 为了避免异常带来的损失,我们需要了解每种异常的原因以及解决方案,提高系统的可靠性。 缓存雪崩 缓存雪崩是指大量的应用请求无法在Redis缓存中进行

xujunson的博客 1万+

【温室气体数据集】全球总碳柱观测网络 TCCON

【温室气体数据集】全球总碳柱观测网络 TCCON

WW、forever的博客 437

ACS运动控制器编程 怎么学习

本文介绍了ACS运动控制器编程的完整学习路线,从零基础到实战应用。ACS是以色列高端多轴运动控制平台,适用于自动化设备、精密平台等项目。学习路径包括:1)安装官方软件SPiiPlusControlSuite;2)掌握轴、运动模式和指令三个核心概念;3)学习10个基础指令;4)编写首个运动程序;5)结合C#进行联合编程。进阶内容包括多轴同步、电子凸轮等工业应用,并推荐官方手册作为主要学习资源。通过7天的系统学习,即可掌握单轴运动控制,结合C#实现工业级设备开发。

StevenChen的博客 1312

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

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

weixin_66129233的博客 928

addBumpConnectTargetConstraint 命令详解

本文介绍了Cadence Innovus中用于倒装芯片设计的addBumpConnectTargetConstraint命令的核心功能和使用方法。该命令主要用于为凸点(Bump)添加连接目标约束,通过绑定实例、引脚/网络和端口号等属性,实现凸点与电源/信号网络的精准映射。文章详细解析了命令语法结构、参数说明及使用场景,包括必选参数(指定凸点方式)、分支选择(实例连接或电源连接类型)以及互斥参数(引脚名与网络名)等重要注意事项,并提供了典型应用示例。该命令特别适用于倒装芯片设计中凸点与PG网络、IO实例的连接

u013620135的博客 394

Redis(九) 关于缓存在高并发下的一些问题

一、缓存击穿 定义: 缓存中的key一般设有过期时间,如果某个key过期了,恰在这个时候,有大量的并发请求访问这个key,则这些请求都会到达DB,导致DB瞬间压力过大,压垮DB。 解决方案: 1.设置互斥锁,mutex。当缓存失效时不时立即去访问数据库,而是使用缓存工具的操作成功带返回值的操作,比如redis的setnx(set if not exit),memcache的add,利用setnx实现锁的效果。 缺点:可能造成死锁,或线程池阻塞 2.提前使用互斥锁 redist的超时时间是timeout1,v

HX_2021 322

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis击穿、穿透、雪崩产生原因以及解决思路

大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是, 无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下 ,当缓存中某一个热点key失效,有两个主要原因:Key过期Key被页面置换淘汰对于第一个原因是因为在Redis中,Key有过期时间,如果某一个时刻(假如商城做活动,零点开始)key失效,那么零点之后对某一个商品查询请求将全都压到数据库上,导致数据库崩。对于第二个原因,因为内

m0_72214980的博客 275

数学建模模型总结

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

spring redis 永不过期_【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩

前言如何有效的理解并且区分 Reids 穿透、击穿和雪崩之间的区别,一直以来都挺困扰我的。特别是穿透和击穿,过一段时间就稀里糊涂的分不清了。 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三种场景。笔者总结了一些关键词,希望大家可以和我一样通过联想的方式来区分并理解这三种场景的区别!最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程...

weixin_39649965的博客 310

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

一站式解决Redis缓存三问题

如今互联网开发,多用Redis作为缓存,为数据库分担访问压力。使用缓存也是设计一个高并发,高可用的系统的必备选项。 但是使用缓存也带来了一系列问题,增加了系统的复杂度和维护难度,给后端开发人员带来了不少的挑战。常见的问题有如何保证缓存与数据库数据的一致性,缓存三问题等。我们今天就来聊聊如何解决Redis的缓存三问题。

欢迎大家指正与批评,还有掘金同名博客欢迎大家关注 881

Redis缓存

记忆口诀:穿透查无数据、击穿热点过期、雪崩批量失效;缓存雪崩崩数据库,服务雪崩崩微服务。根源:Redis 缓存大批量 key 同时失效 / Redis 故障。解决:依靠 Sentinel 做熔断、降级、超时控制、线程隔离。影响:调用方线程被耗尽,自身服务瘫痪,故障逐级向上传递,解决:打散过期时间、Redis 集群、多级缓存。根源:下游服务响应慢、超时、报错。影响:流量击穿缓存,

weixin_43590392的博客 223

redis异常测试

在使用redis组件时,一般测试KEY是否新增成功,KEY是否更新成功,KEY是否删除成功,KEY是否设置过期时间 除此之外还需要考虑一些异常场景 比如KEY是否丢失,KEY存失败如何处理,KEY丢失和删除如何区别出来,如果KEY无过期时间,是否数据是否需要做RDB和AOF持久化,redis重启或者故障时数据是否需要保持。 业务上调redis异常,是否有实时接口或者数据库查询 KEY丢失和删除区分 很多时候开发设计时,删除某个KEY时,直接就把KEY删掉,而KEY丢失时也是找不到KEY,其实设计时,可以删除

weixin_36852563的博客 618

「建议收藏」高频Redis面试题,记住他们,吊打面试官

1.Redis雪崩了解吗? 1、我了解,目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者查不到之后去更新缓存的,定时任务刷新就有一个问题。 2、举个例子:如果首页所有Key的失效时间都是12小时,中午12点刷新的,我零点有个大促活动大量用户涌入,假设每秒6000个请求,本来缓存可以抗住每秒5000个请求,但是缓存中所有Key都失效了。此时6000个/秒的请求全部落在了数据库上,数据库必然扛不住,真实情况可能DBA都没反应过来直接挂了,此时,如果没什么特别的方案来处理,DBA很着急,重启

程序员麦冬的博客(公众号同名) 772

Redis常见问题

Redis常见问题

Moonlight的博客 113

redi缓存使用

紧接着,应用就会把请求发送给数据库,从数据库中读取数据。命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数(例如,随机增加 1~3 分钟),这样一来,不同数据的过期时间有所差别,但差别又不会太大,既避免了大量数据同时过期,同时也保证了这些数据基本在相近的时间失效,仍然能满足业务需求。如果是新增数据,数据会直接写到数据库中,不用对缓存做任何操作,此时,缓存中本身就没有新增数据,而数据库中是最新值,这种情况符合我们刚刚所说的一致性的第 2 种情况,所以,此时,缓存和数据库的数据是一致的。

wbo 1060

【Mysql】主从复制、读写分离方案

主从复制 主库更新事件(update、insert、delete)通过io-thread写到binlog; 从库请求读取binlog,通过io-thread写⼊(write)从库本地 relay log(中继⽇志); 从库通过sql-thread读取(read) relay log,并把更新事件在从库中执⾏(replay)⼀遍; 读写分离 mysql与缓冲数据库 前提 读多写少,单个主节点能⽀撑项⽬数据量;数据的主要依据是mysql; mysql缓冲层 mysql有缓冲层,它的作⽤也是⽤来缓存热点

Leoh的博客 691

求职者简历编辑模块

热点缓存:系统中访问频次极高、流量集中、重复查询的数据,放入高速内存数据库(Redis)缓存,减少重复访问 MySQL,降低数据库压力、提升接口响应速度。这类高频访问的数据称为热点数据,针对它做的缓存方案就是热点缓存。

ningmeng0001的博客 216

Redis系列(二十)、缓存穿透、击穿、雪崩、预热、更新、降级

Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级。本篇分别介绍这些概念以及处理方案。

王义凯 的博客 6184

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

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

胜人者有力,自胜者强! 1万+
上一篇: 记录一次线上kafka故障及处理方式
下一篇: 简单聊一聊Redis的缓存是如何做到的
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值