【Redis】Redis缓存穿透、缓存雪崩、缓存击穿详解与解决办法(Redis专栏启动)

news2024/11/25 15:48:35

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 CSDN博客专家/后端领域优质创作者/内容合伙人、InfoQ签约作者、阿里云专家/签约博主、51CTO专家 🏆

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

金融公司的防资损方法论、代码与实践。

本文目录

本文目录

本文导读

一、Redis缓存穿透

二、Redis缓存雪崩

1、 大量(热点)数据同时过期

1.1、均匀设置过期时间

1.2、互斥锁

1.3、双 key 策略

1.4、后台更新缓存策略

2、Redis 故障宕机(服务挂掉)

2.1、服务熔断或请求限流机制

2.2、构建高可靠集群

三、Redis缓存击穿

总结


本文导读

由于读写速度快,Redis通常被广泛用作开发中最常用的缓存方案,然而,在实际应用过程中,会出现缓存雪崩、 缓存击穿和缓存穿透等异常,本文主要分析和总结这些缓存异常和常见的处理方案。

一、Redis缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

缓存穿透通常发生在以下两种情况下:缓存中的数据和数据库中的数据被错误删除,导致缓存和数据库中没有数据;黑客恶意攻击并故意访问大量读取不存在数据的企业;

解决方案:

1、非法请求的限制:在接收参数时过滤业务接口中的非法值、空值、负值和空值

2、布隆过滤器:一种类似于哈希表的算法。它使用所有可能的查询条件来生成位图,该位图将用于在数据库查询之前进行过滤。如果没有,它将被直接过滤,以减轻数据库级别的压力;

3、缓存空值:一个相对简单的解决方案。在第一次查询不存在的数据后,密钥和相应的空值也被放入缓存,但设置为较短的过期时间

二、Redis缓存雪崩

缓存服务挂掉或者热点缓存失效,所有请求都去查数据库,导致数据库连接不够或者数据库处理不过来,从而导致整个系统不可用。

发生缓存雪崩主要有两个原因:

大量(热点)数据同时过期,导致本应请求缓存的数据,需要从数据库中检索;

Redis故障宕机(服务挂掉),无法处理请求,再次请求数据库。

1、 大量(热点)数据同时过期

针对大量缓存数据同时过期,常见的解决方案如下:

1.1、均匀设置过期时间

在实际设置过期时间时,应尽量避免出现大量 key 同时过期的情况。如果有,您可以通过随机、微调甚至设置来设置过期时间,以避免同一时间过期;

1.2、互斥锁

添加互斥锁,这样缓存构建就不会同时执行;当业务线程处理用户请求时,如果发现访问的数据不在Redis中,它将添加互斥锁,以确保同时只有一个请求来构建缓存(从数据库中读取数据,然后将数据更新到Redis)。构建缓存后,释放锁。请求未能获取互斥锁。要么等待锁释放并重新读取缓存,要么返回空值或默认值。

在实现互斥锁时,最好设置一个超时,否则第一个请求会获得锁,然后这个请求会被阻止,并且由于某些意外而不会释放锁。此时,其他请求无法获得锁,整个系统将不会响应。

每个时刻只有一个线程在执行请求,减轻了db的压力,但缺点也很明显,降低了系统的qps

1.3、双 key 策略

主key 是原始缓存, 备key 是副本缓存。当主key 失败时,可以访问备份key 。主键缓存过期时间设置为短期, 备key 设置为长期(即使没有过期);它们只有不同的键,但值是相同的,这相当于创建缓存数据的副本。

当业务线程无法访问“主键”的缓存数据时,它直接返回“备用键”的缓存信息,然后在更新缓存时同时更新“主键”和“备用键”的数据。

双key 策略的优点是,当主键过期并且有大量请求获取缓存数据时,备份key 的数据会被直接返回,这样可以快速响应请求。

1.4、后台更新缓存策略

使用定时任务或者消息队列更新或删除Redis缓存。

业务线程不再负责更新缓存,缓存也不会设置有效期。相反,缓存是“永久有效的”,并且后台线程被分配来定期更新缓存。

缓存数据没有有效期,这并不意味着数据可以一直在内存中,因为当系统内存紧张时,一些缓存数据将被“消除”。在从缓存被“消除”到下一次后台常规缓存更新的这段时间内,如果业务线程未能读取缓存,那么它将返回一个空值,业务角度将认为数据丢失。

当业务刚刚上线时,我们最好提前缓冲数据,而不是等待用户访问来触发缓存构建。这称为缓存预热。后台缓存更新机制正适合于此。

2、Redis 故障宕机(服务挂掉)

2.1、服务熔断或请求限流机制

当Redis崩溃并导致缓存雪崩时,我们可以启动服务融合机制,暂停业务应用程序对缓存服务的访问,直接返回错误,不需要继续访问数据库。

请求限流机制相对温和。启用请求限流机制,仅将少量请求发送到数据库进行处理。任何更多的请求将被直接拒绝在入口处提供服务。然而,适当的处理方案取决于具体的业务情况。

2.2、构建高可靠集群

在预防级别,可以通过使用主从节点来构建高度可用的集群。也就是说,在主Redis实例挂断后,其他从数据库可以快速切换到主数据库并继续提供服务,避免了Redis宕机带来的缓存雪崩问题。 

三、Redis缓存击穿

事实上,缓存击穿是缓存雪崩的一种特殊情况。缓存击穿是指缓存中没有数据,但数据库中有数据(通常缓存时间到期)。此时,由于并发用户太多,读取缓存并不能读取数据,同时又去数据库检索数据,数据库压力瞬间增加,导致压力过大。击穿和雪崩的区别在于,击穿是针对特定的热点数据,而雪崩是所有数据。 

解决方案:

1、缓存设置不过期:没有过期时间,并且后台异步更新缓存,或者在热数据准备过期之前提前通知后台线程更新缓存并重置过期时间;

2、使用锁工具(分布式锁/互斥锁方案):确保只有一个业务线程同时更新缓存,并且无法获得互斥锁请求。要么等待锁释放并重新读取缓存,要么返回空值或默认值。

总结

由于读写速度快,Redis通常被广泛用作开发中最常用的缓存方案,然而,在实际应用过程中,会出现缓存雪崩、 缓存击穿和缓存穿透等异常,本文主要分析和总结这些缓存异常和常见的处理方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目:springboot大学生实习管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本系统的用户可以分为三种:管理员、教师、学生。三种角色登录后会有不同菜单界面; 管理员主要功能: 信息管…

graalvm 拯救生命,速速入手

graalvm 拯救生命,速速入手 标题很夸张,graalvm怎么就拯救生命了?把一个启动5-6秒的项目加速到3秒启动,不就是在拯救生命,拯救发际线吗? 我在上一篇博客"SpringBoot3.0工程建立"末尾启动了工程…

高级网络应用复习——三层热备生成树速端口OSPF实验(带命令)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.知识点总结 路由器热备份技术HSRP (思科私有 HS…

学web前端开发和学习其他编程语言一样吗?

前言: web前端是编程中门槛较低,较易入门的,对年龄和学历要求也不是特别高,但如果学历过低,年龄比较大,又完全没有基础,会在学习时感到吃力,另外也会因为用人公司对学历和年龄的限制…

电巢:半导体投资锐减库存调整消费者需求疲软,半导体下行周期何时结束?

前言 投行PitchBook的资料显示截止到本月5日,2022 年全球半导体初创企业的风险投资达到 78 亿美元。与去年创纪录的 145 亿美元投资者注入硅公司的资金相比下降了 46%,与 2020年的103 亿美元相比下降了 24%。 高盛(Goldman sachs)…

【LSTM回归预测】基于灰狼算法优化长短时记忆GWO-LSTM时序时间序列数据预测(含前后对比)附Matlab代码

​✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法…

Mycat(8):分片详解之取模

1 找到conf/schema.xml修改 2 取模的路由规则 和轮询一样,取模有什么好处,有什么坏处? 优点:利用的写的负载均衡效果,写入速度很快 缺点:批量写入,失败后事务的回滚有难度!代表写…

Svelte 带来哪些新思想?赶紧学起来!

本文介绍 点赞 关注 收藏 学会了 Svelte 是我用过最爽的框架,就算 Vue 和 React 再强大,生态再好,我还是更喜欢 Svelte,因为它开发起来真的很爽。 其实在很久之前我就注意到 Svelte ,但一直没把这个框架放在心上。…

【Python百日进阶-数据分析】Day133 - plotly饼图:px.pie()实例

文章目录四、实例4.1 带有 plotly express 的饼图4.1.1 欧洲大陆的人口4.1.2 带有重复标签的饼图4.1.3 使用 px.pie 设置饼图扇区的颜色4.1.4 对离散颜色使用显式映射4.1.5 自定义使用 px.pie 创建的饼图4.1.13 Dash 中的饼图四、实例 饼图是一种圆形统计图表,它被…

微服务框架 SpringCloud微服务架构 服务异步通讯 50 消息可靠性 50.2 消息持久化

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯50 消息可靠性50.2 消息持久化50.2.1 消息持久化50 消息可靠性 50.2 消息持久化 50.2.1 消息…

深入解析CSS (3)Flexbox

Flexbox,全称弹性盒子布局 给元素添加display: flex,该元素变成了一个弹性容器(flex container),它的直接子元素变成了弹性子元素(flex item)。 弹性子元素默认是在同一行按照从左到右的顺序并…

[附源码]计算机毕业设计Python的黄河文化科普网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

2022年全球IB百强名校出炉,19所香港学校上榜

教育界有句话:“得教育者得天下,得IB者得教育。” 作为目前国际上认可度最高、真正无国界全球通用的、且旨在培养最全面人才的国际课程,IB课程正在为越来越多的学校和家长所青睐。 近日,Best Schools 最新公布了2022年全球最佳IB学…

卷积神经网络-高级篇Advanced-CNN

卷积神经网络-高级篇Advanced-CNN 在基础篇中我们学习了一个简单的CNN 下面介绍其他几个网络结构 GoogLeNet 蓝色为卷积,红色是池化,黄色是softmax输出,绿色是一些拼接层。 在这个大型的网络结构中我们需要做到的是减少代码冗余&#xff0…

为什么Python是2023最值得学的编程语言?

对于那些从来没有学习编程小伙伴,Python 是最好的选择之一, Python 是一种清晰的语言,用缩进来表示程序的嵌套关系可谓是一种创举,把过去软性的编程风格升级为硬性的语法规定。再不需要在不同的风格间选择、再不需要为不同的风格…

阿里工作7年被裁,3个月逆袭字节跳动测试开发,有些心里话想对大家说...

被裁之路 先简单交代一下背景吧,某不知名 985 的本硕,17 年毕业加入阿里,以“人员优化”的名义无情被裁员,我失去了在阿里5年的工作。虽然有事先通风,但是我没有想到这一天会来的那么快。今天中午收到消息说我们这个组…

网络入门基础

目录 一.预备知识 1.1网络背景 1.2协议 二.网络协议 2.1协议分层 2.2OSI 7层 2.3TCP/IP五层(或四层) 三.网络传输基本流程 3.1局域网通信 3.2 跨网络通信 3.3IP地址与MAC地址 一.预备知识 1.1网络背景 独立模式:计算机之间相互独立 网络互联: 计…

[附源码]计算机毕业设计Python的网上点餐系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

[附源码]计算机毕业设计Python的汽车租赁系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

为什么要学Python编程 到底Python值不值得学

为什么要学Python编程?到底Python值不值得学​?Python在软件质量控制、提升开发效率、可移植性、组件集成、丰富库支持等各个方面均处于先进地位。同样学习编程语言,当然要选择学习业内目前先进、热门、将来应用广泛、有前途和前景的编程语言…