草庐IT

Redis核心技术与实战-学习笔记(二十六):缓存雪崩、击穿、穿透

孔汤姆 2023-09-02 原文

一.缓存雪崩

缓存雪崩:大量应用请求无法在Redis缓存中进行处理,应用请求频繁访问数据库,导致数据库压力激增。

产生原因:

缓存中有大量数据同时过期,导致大量请求无法得到处理

  • 数据保存在缓存中,并设置了过期时间时,如果某一时刻,大量数据同时过期,此时,应用程序再访问这些数据的话,就会发生缓存缺失。
  • 应用就会把请求发送给数据库,从数据库中读取数据。
  • 如果应用的并发请求量很大,那么数据库的压力也就很大,这回进一步影响到数据库的其他业务请求处理,进而导致数据库崩溃。

大量数据同时失效带来的缓存雪崩问题,两种解决方案:

  • 我们可以避免给大量数据设置相同的过期时间。 如果业务曾的确要求有数据同时失效,你可以用 EXPIRE命令给每个数据设置过期时间时,给这些数据的过期时间,给这些数据过期时间增加一些较小的随机数 不同数据的过期时间有差别,但是差别又不大,避免大量数据同时过期。 同时保证数据基本在相近时间失效,仍能满足业务需求。
  • 除了微调过期时间,我们通过服务降级来应对缓存雪崩。                                            

服务降级:是指发生缓存雪崩,针对不同的数据采用不同的处理方式:

  • 当业务应用访问的是非核数据时候,暂时停止从缓存中查询这些数据,而是直接返回预定义信息或者空数据。
  • 当业务应用访问的是核心数据,仍然允许查询缓存,如果缓存缺失也可以继续通过数据库读取。

产生雪崩的两种情况:

  • 大量数据同时失效
  • Redis实例故障宕机

一个Redis实例可以支持数万级别的请求处理吞吐量,而单个数据库只能支持数千级别的请求处理吞吐量,他们两个的处理能力可能相差了近乎十倍。一旦缓存雪崩,Redis缓存失效,那么数据库直接承受十倍请求压力,导致崩溃。

二.Redis实例发生宕机产生缓存雪崩

     1. 业务系统中实现服务熔断或者请求限流机制

       服务熔断:发生缓存雪崩时,为了防止发生连锁的数据库雪崩,甚至整个系统崩溃,我们暂停业务应用对缓存系统的接口访问。

      具体实现:业务调用缓存接口时,缓存客户端不再请求Redis,而是直接返回,等到Redis缓存实例重新恢复服务以后,在允许应用请求发送到缓存系统。

      优点:避免了大量请求因缓存缺失,而积压到数据库系统,保证了数据库系统的正常运行。

   2.事先预防

  • 主从节点构建Redis缓存高可用集群
  • 当Redis缓存的主节点故障宕机了,从节点切换为主节点,继续提供缓存服务避免缓存实例宕机造成的缓存雪崩问题。


三.缓存击穿

     缓存击穿:针对某个访问非常频繁的热点数据请求,无法在缓存中进行处理,紧接着访问该数据的大量请求,一下子都发送到后端数据库,导致数据库压力激增影响数据库处理其他请求。

     缓存击穿发生在热点数据过期失效时。

解决方案:

  • 对于访问特别频繁的热点数据,我们不再设置过期时间。
  • 对于热点数据的请求访问,都可以在缓存中进行处理。

四.缓存穿透

  • 缓存穿透:要访问的数据既不是Redis缓存中也不再数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。
  • 如果应用持续有大量请求访问数据,就会同时给缓存和数据库带来巨大压力 

产生缓存穿透的原因:

  • 业务层误操作:缓存中的数据和数据库中的数据都被误删除,所以缓存和数据库中都没有数据;    
  • 恶意攻击:专门访问数据库中没有的数据

三种解决方案:

1.缓存空值或者缺省值

  •  一旦发生缓存穿透,针对查询数据在Redis缓存一个空值或者业务层协商确定的缺省值。应用发生后续请求在进行查询时,可以直接从Redis读取空值或者缺省值返回给业务应用,避免大量请求发送给数据库处理,保持数据库的正常运行。

2.使用布隆过滤器快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。

3.前端对非法请求校验,避免请求进入缓存或者数据库。

五.总结

问题原因应对方案
缓存雪崩

大量数据同时过期

缓存实例宕机

给缓存数据的过期时间加上小的随机数避免同时过期

缓存降级熔断

请求限流

Redis缓存主从集群

缓存击穿热点数据过期热点数据不设过期时间
缓存穿透数据在缓存和数据库中不存在

缓存空值

布隆过滤器

请求入口校验

     

有关Redis核心技术与实战-学习笔记(二十六):缓存雪崩、击穿、穿透的更多相关文章

  1. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  2. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐