当前位置: 首页 > news >正文

Redis 如何解决缓存雪崩、缓存击穿、缓存穿透难题

前言

Redis 作为一门热门的缓存技术,引入了缓存层,就会有缓存异常的三个问题,分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决!

缓存击穿

缓存击穿: 指的是缓存中的某个热点数据过期了,但是此时大量的并发请求访问这个key的值,此时因为缓存过期无法从缓存中获取,直接访问数据库,数据库很容易就会被这些高并发的请求冲垮,这就是缓存击穿。

解决方案

  1. 热点数据不要设置过期时间,或者在热点数据即将要过期前,提前通过后台线程更新缓存以及重新设置过期时间;
  2. 互斥锁方案,如果该key的数据更新了,那么就通过互斥锁的方式将其更新。

缓存穿透

缓存穿透:假如用户访问的数据,既不在缓存中,也不在数据库。于是请求在访问缓存时,发现缓存没有命中,继续访问数据库,发现数据库中也没有对应的key值。当有大量这样的并发请求到来时,数据库的压力激增,这就是缓存穿透。
在这里插入图片描述
如上图红框所示,一般缓存穿透是遭遇了恶意请求,或者业务误删缓存跟数据库,导致缓存和数据库中都没有数据。

应对缓存穿透,一般是下面两种方案。

1. 缓存空值或者默认值

出现缓存穿透的现象时,我们可以针对查询的数据,在缓存中设置一个空值或者默认值,这样后续请求就可以从缓存中读取到空值或者默认值,从而不会继续查询数据库。

2. 使用布隆过滤器(推荐)

布隆过滤器是一种数据结构,更准确的说是一种概率型的数据结构,因为它能判断某个元素一定不存在或者是可能存在。

在写入数据库数据时,使用布隆过滤器做个标记,然后在用户请求到来时,业务线程确认缓存失效后,可以通过查询布隆过滤器快速判断数据是否存在,如果不存在,就不用通过查询数据库来判断数据是否存在。

缓存雪崩

通常为了保证缓存中的数据与数据库中的数据一致性,我们会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据无法命中缓存,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里。
缓存雪崩: 就是指在大量的应用请求无法在 Redis 缓存中进行处理,然后应用将大量请求发送到数据库层,导致数据库层的压力骤增。
一般是以下两种情况导致的:

  • 缓存中的大量数据在同一时间过期,导致大量请求无法得到处理。
  • Redis 缓存实例发生故障宕机了,无法处理请求,导致大量请求一下子积压到数据库层面

大量数据同时过期

解决方案

  • 过期时间添加随机数
    首先,我们要避免给大量的数据设置相同的过期时间。如果业务真的有这个需求,我们可以在用 EXPIRE 命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数,既能避免了大量数据同时过期,又保证了这些数据基本在相近的时间失效,依然能满足业务需求。

  • 互斥锁
    当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存,当缓存构建完毕后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

Redis 故障宕机

解决方案

  • 服务熔断或请求限流
    发生缓存雪崩时,为了防止引发连锁的数据库雪崩,甚至是整个系统的崩溃,我们暂停业务应用对缓存系统的接口访问。具体点说,就是业务应用调用缓存接口时,缓存客户端并不把请求发给 Redis 缓存实例,而是直接返回,等到 Redis 缓存实例重新恢复服务后,再允许应用请求发送到缓存系统。

为了减少对业务的影响,我们可以启用请求限流机制,只将少部分请求发送到数据库进行处理,再多的请求就在入口直接拒绝服务,等到 Redis 恢复正常并把缓存预热完后,再解除请求限流的机制。

  • 构建 Redis 缓存高可靠集群
    如果 Redis 缓存的主节点故障宕机了,从节点可以切换成为主节点,继续提供缓存服务,避免了由于缓存实例宕机而导致的缓存雪崩问题。

总结

关于缓存中常见的三个线上问题,我们总结了原因以及解决方案,希望能够帮助可能在线上使用缓存的开发工程师们未雨绸缪!

相关文章:

Redis 如何解决缓存雪崩、缓存击穿、缓存穿透难题

前言 Redis 作为一门热门的缓存技术,引入了缓存层,就会有缓存异常的三个问题,分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决! 缓存击穿 缓存击穿: 指的是缓存中的某个热点数据过期了,但是此…...

SSRF(服务器端请求伪造)漏洞

CSRF漏洞与SSRF漏洞的主要区别在于伪造目标的不同。 一、SSRF是什么 SSRF漏洞:(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从…...

【Axure动态面板】利用动态面板实现树形菜单的制作

利用动态面板,简单制作高保真的树形菜单。 一、先看效果 https://1poppu.axshare.com 二、实现思路 1、菜单无非就是收缩和展开,动态面板有个非常好的属性:fit to content,这个属性的含义是:面板的大小可以根据内容多少…...

Android 实现 RecyclerView下拉刷新,SwipeRefreshLayout上拉加载

上拉、下拉的效果图如下&#xff1a; 使用步骤 1、在清单文件中添加依赖 implementation ‘com.android.support:recyclerview-v7:27.1.1’ implementation “androidx.swiperefreshlayout:swiperefreshlayout:1.0.0” 2、main布局 <LinearLayout xmlns:android"http…...

使用MethodInterceptor和ResponseBodyAdvice做分页处理

目录 一、需求 二、代码实现 父pom文件 pom文件 配置文件 手动注册SqlSessionFactory&#xff08;MyBatisConfig &#xff09; 对象 实体类Users 抽象类AbstractQuery 查询参数类UsersQuery 三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.…...

WEB集群——LVS-DR 群集、nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 2、配置nginx负载均衡。 一、 LVS-DR 群集 1、LVS-DR工作原理 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09; 名称缩写说明 虚拟IP地址(Virtual IP Address) VIPDirector用于向客户端计算机提供服务的IP地址真实…...

倒计时87天!软考初级信息处理技术员2023下半年报名考试攻略

软考初级信息处理技术员2023下半年报名条件&#xff1a; 1、凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术应用能力的人员&#xff0c;均可根据情况报名参加相应专业类别、级别的考试。 2、获准在中华人民共和国境内就业的外籍…...

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建SpringSecurity权限框架

1.Cloud Studio&#xff08;云端 IDE&#xff09;简介 Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 Clou…...

c语言每日一练(4)

五道选择题 1、有以下代码&#xff0c;程序的输出结果是( ) #include <stdio.h> int main() {int a 0, b 0;for (a 1, b 1; a < 100; a){if (b > 20) break;//1if (b % 3 1)//2{b b 3;continue;}b b-5;//3}printf("%d\n", a);return 0; } A.1…...

VB字符转换

都是类型转换&#xff0c;转换成数值类型 VAL是根据情况来系统自动决定转换成什么类型&#xff0c; CDbl是转换成双精度浮点数据类型 VB中C带头的强制转换函数有&#xff1a; CBool(expression) ---- 转换成布尔型 CByte(expression) ---- 转换成字节型 CCur(expression) --…...

【C++进阶之路】map与set的基本使用

文章目录 一、set系列1.set①insert②find③erase④lower_bound与upper_bound 2.multiset①count②equal_range 二、map系列1.map①insert1.插入pair的四种方式2.常用两种方式 ②[]2.multimap①count②equal_range 一、set系列 1.set ①insert 函数分析&#xff08;C98&…...

代码随想录算法训练营day56

文章目录 Day56两个字符串的删除操作题目思路代码 编辑距离题目思路代码 Day56 两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 题目 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#…...

通话降噪算法在手机和IOT设备上的应用和挑战

随着电子产品的升级换代&#xff0c;用户对通话质量的要求也越来越高。通话降噪算法对通话质量起到了关键核心的作用。计算资源的提升使得深度学习模型在便携式的低功耗芯片上面跑起来了&#xff0c;器件成本降低让IoT设备开始使用骨导传感器&#xff0c;&#xff0c;那怎么样才…...

Pet Detection System (PDS)

宠物医院检验设备物联系统...

【OpenCV常用函数:颜色空间转换、阈值化】cv2.cvtColor()+cv2.threshold()

1、cv2.cvtColor() 对图像进行颜色空间的转换 cv2.cvtColor(src, code[, dst[, dstCn]])1) src: 输入图像 2) code: 颜色空间转换编码&#xff0c;常使用的GRAY和RGB之间的转换 cv2.COLOR_BGR2GRAY, cv2.COLOR_RGB2GRAY, cv2.COLOR_GRAY2BGR, cv2.COLOR_GRAY2RGB 3) dst: 输出…...

一键登录和短信验证登录,到底有什么区别?

一键登录是什么&#xff1f; 本机号码一键登录验证是一种登录认证方式&#xff0c;通过获取用户手机上的本机号码来验证用户身份&#xff0c;从而实现快捷登录和简化登录流程的目的。 在使用一键登录时&#xff0c;首先需要用户在登录页面选择使用本机号码一键登录&#xff0…...

史上最精简Android RecyclerView实现拖拽排序改变位置代码

要实现RecyclerView的长按拖动改变位置&#xff0c;可以使用ItemTouchHelper类来处理拖动和滑动的操作。下面演示如何实现长按拖动改变位置&#xff1a; 首先&#xff0c;在你的Activity或Fragment中&#xff0c;初始化RecyclerView和ItemTouchHelper&#xff1a; RecyclerVi…...

centos 7 系统上重启 mysql 时报错 Failed to restart mysqld.service: Unit not found.

在 centos 7 系统上&#xff0c;使用常规命令&#xff1a;systemctl restart mysql 或 service mysqld restart 重启 mysql 时都会报如下错误&#xff1a; Failed to start mysqld.service: Unit not found. 根据所报错误&#xff0c;在网上搜罗了一圈&#xff0c;未果&#x…...

时间复杂度空间复杂度相关练习题

1.消失的数字 【题目】&#xff1a;题目链接 思路1&#xff1a;排序——》qsort快排——》时间复杂度O&#xff08;n*log2n&#xff09; 不符合要求 思路2&#xff1a;&#xff08;0123...n)-(a[0]a[1][2]...a[n-2]) ——》 时间复杂度O&#xff08;N&#xff09;空间复杂度…...

Linux | Ubuntu18.04安装RTX 4060显卡驱动完整教程

文章目录 概述一、定义介绍二、操作教程(一)、前期准备1.进入终端界面2.关闭界面显示器3.禁用其他显卡驱动4.卸载残余显卡驱动5.下载驱动(二)、安装驱动1.给驱动程序赋予权限2.安装驱动3.检查结果(三)、后续问题1.黑屏问题概述 本节详细介绍了如何在ubuntu18系统安装4060显卡的…...

随着AI和电商重塑消费者购买行为,全球美妆市场增长10%

随着数字优先和AI影响下的全球电商加速发展&#xff0c;线上销售额增速达到线下门店的6倍 全球消费者情报领军企业NielsenIQ (NYSE:NIQ)今日发布《2026年美妆行业现状报告》。报告显示&#xff0c;全球美妆市场同比增长10%&#xff0c;电商销售额增速达到线下门店的6倍。该结果…...

TFLint Docker终极指南:在容器中轻松运行Terraform代码检查

TFLint Docker终极指南&#xff1a;在容器中轻松运行Terraform代码检查 【免费下载链接】tflint A Pluggable Terraform Linter 项目地址: https://gitcode.com/gh_mirrors/tf/tflint TFLint是一个可插拔的Terraform代码检查工具&#xff0c;帮助开发者发现Terraform配置…...

从混乱到有序:大数据规范性分析的转型之路

从混乱到有序:大数据规范性分析的转型之路 关键词:大数据分析、数据治理、规范性分析、数据质量、ETL流程、数据仓库、数据可视化 摘要:本文深入探讨了大数据分析从混乱无序状态向规范性分析转型的关键路径。文章首先分析了大数据环境下面临的典型数据质量问题,然后系统性地…...

Python 使用 `raise` 报错抛出异常显示 Unicode 码如何解决

在 Python 开发中&#xff0c;我们经常使用 raise 抛出异常来处理错误情况。但有时候&#xff0c;异常信息中的中文或其他非 ASCII 字符会被显示为 Unicode 转义序列&#xff08;如 \u6b63\u6587&#xff09;&#xff0c;而不是直接显示中文&#xff08;如“正文”&#xff09;…...

从‘歪图’到精准底图:ENVI几何校正实战避坑与精度提升指南

从‘歪图’到精准底图&#xff1a;ENVI几何校正实战避坑与精度提升指南 当你在山区项目中打开刚获取的遥感影像时&#xff0c;那些本该笔直的道路却像蛇形般扭曲&#xff0c;原本规整的农田边界变成了抽象画作——这就是未经几何校正的"歪图"给科研工作者带来的日常困…...

乙巳马年春联生成终端效果展示:扫码下载功能在微信生态中的无缝流转

乙巳马年春联生成终端效果展示&#xff1a;扫码下载功能在微信生态中的无缝流转 1. 引言&#xff1a;当传统年俗遇见现代科技 春节贴春联&#xff0c;是刻在我们文化基因里的仪式感。但你想过吗&#xff0c;这个传承千年的习俗&#xff0c;也能和今天最前沿的AI技术碰撞出火花…...

PCB开窗技术:提升电流承载能力的关键工艺

1. PCB开窗技术解析&#xff1a;从概念到应用在PCB设计领域&#xff0c;"开窗"这个术语经常被经验丰富的工程师挂在嘴边&#xff0c;但对于刚入行的新手来说&#xff0c;这个看似简单的操作背后却蕴含着不少设计门道。作为一名有十年硬件设计经验的工程师&#xff0c…...

Anthropic员工失误导致Claude Code源代码泄露

事件概述&#xff1a;npm源映射文件暴露专有代码Anthropic公司一名员工在npm公开注册账户发布的AI编程工具Claude Code版本中意外包含源映射&#xff08;source map&#xff09;文件&#xff0c;导致该工具的完整专有源代码暴露。AI专家指出&#xff0c;这种失误存在重大安全风…...

Omni-Vision Sanctuary助力后端开发:设计高并发API接口的最佳实践

Omni-Vision Sanctuary助力后端开发&#xff1a;设计高并发API接口的最佳实践 1. 高并发API接口设计的挑战与机遇 想象一下这样的场景&#xff1a;你的电商平台刚刚上线了一个基于Omni-Vision Sanctuary的智能商品描述生成功能&#xff0c;突然涌入的用户请求让你的服务器不堪…...

G-Helper:轻量级华硕硬件控制的性能优化解决方案

G-Helper&#xff1a;轻量级华硕硬件控制的性能优化解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, a…...