Redis篇章3:Redis 企业级缓存难题全解--预热、雪崩、击穿、穿透一网打尽

在企业级应用场景中,Redis 作为高性能缓存利器,极大提升了系统响应速度,但随着业务复杂度和并发量的攀升,缓存相关的各类挑战也接踵而至。比如系统启动时缓存缺失导致的数据库压力、大量缓存同时失效引发的连锁故障、热点数据过期引发的集中查询风暴,以及恶意请求穿透缓存直击数据库等问题,都可能成为系统稳定运行的隐患。接下来,我们将深入剖析缓存预热、缓存雪崩、缓存击穿、缓存穿透这四大企业级缓存难题,并详解对应的解决方案。

企业级解决方案

缓存预热

缓存预热是在系统上线或重启后,提前将一些热点数据加载到缓存中的操作,主要目的是避免用户首次访问相关数据时,因缓存中无对应数据,都去查询数据库等后端数据源 ,从而产生较高延迟或给后端带来巨大压力。

解决方案

准备工作:

  1. 日常例行统计数据访问记录,统计访问频度较高的热点数据
  2. 将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据

实施:

  1. 使用脚本程序固定触发数据预热过程
  2. 如果条件允许,使用了CDN(内容分发网络),效果会更好

总结

缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查 询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据

缓存雪崩

缓存雪崩是指在某一时间段内,缓存中大量热点数据同时过期失效,或缓存服务因故障(如宕机、网络中断)突然不可用,导致所有原本应访问缓存的请求全部转向后端数据库等数据源,引发数据库压力骤增、响应延迟甚至宕机,最终导致整个系统服务不可用的连锁故障。

解决方案:

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

缓存击穿

缓存击穿指的是在缓存中,某个热点数据(访问频率极高的数据 )的缓存过期,大量并发请求同时到达,由于缓存已失效,导致所有原本应访问缓存的请求全部转向后端数据库等数据源,进而可能导致数据库负载过高甚至服务崩溃 。

    常见的解决方案有两种

    • 互斥锁
    • 逻辑过期

    逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的, 此时只要线程1走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程1没有走完的 时候,后续的线程2,线程3,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到 数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行 数据库代码,对数据库访问压力过大

    解决方案一,使用锁来解决:

    因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压 力过大,但这也会影响查询的性能,因为此时会让查询的性能从并行变成了串行,我们可以采用 tryLock方法 + double check来解决这样的问题。

    假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人 去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休 眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。 

    解决方案二,逻辑过期方案 

    方案分析:我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我 们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据不就一直占用我们 内存了吗,我们可以采用逻辑过期方案。

    我们把过期时间设置在 redis的value中,注意:这个过期时间并不会直接作用于redis,而是我们后续 通过逻辑去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1 去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程他会开启一个 线程去进行 以前的重构数据 的逻辑,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访 问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把 重建数据构建完后,其他线程才能走返回正确的数据。

    这种方案巧妙在于,异步的构建缓存,缺点在于在构建完缓存之前,返回的都是脏数据。 

    进行对比:
    互斥锁方案:由于保证了互斥性,所以数据一致,且实现简单,因为仅仅只需要加一把锁而已,也没其他的事情需要操心,所以没有额外的内存消耗,缺点在于有锁就有死锁问题的发生,且只能串行执行性能肯定受到影响
    逻辑过期方案:线程读取过程中不需要等待,性能好,有一个额外的线程持有锁去进行重构数据,但是在重构数据完成前,其他的线程只能返回之前的数据,且实现起来麻烦

    缓存穿透

    缓存穿透是指客户端请求的是不存在于缓存中,也不存在于后端数据库(或其他数据源)中的数据,导致每次请求都会 “穿透” 缓存,直接访问数据库,若此类请求大量并发,会造成数据库资源浪费、压力骤增,甚至引发服务不可用的问题。

    常见的解决方案有两种:

    缓存空对象

    优点:实现简单,维护方便

    缺点:

    • 额外的内存消耗
    • 可能造成短期的不一致

    布隆过滤

    优点:内存占用较少,没有多余key

    缺点:

    • 实现复杂
    • 存在误判可能

    缓存空对象思路分析:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据, 此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据 库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会 访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis 中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存 了

    布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思 想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问 redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数 据后,再将其放入到redis中, 假设布隆过滤器判断这个数据不存在,则直接返回 这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思 想,就可能存在哈希冲突

    缓存预热、雪崩、击穿、穿透,是企业级应用中 Redis 缓存面临的典型挑战。通过提前加载热点数据的缓存预热,能避免系统启动初期的数据库压力;采用多样化策略应对的缓存雪崩方案,保障了缓存大规模失效时系统的稳定;互斥锁与逻辑过期两种思路解决的缓存击穿问题,平衡了数据一致性与访问性能;缓存空对象和布隆过滤应对的缓存穿透方案,拦截了无效请求对数据库的冲击。掌握这些解决方案,能让 Redis 在企业级场景中更稳定、高效地发挥缓存价值,为系统性能保驾护航。

    有问题欢迎留言!!!😗

    肥嘟嘟左卫门就讲到这里啦,记得一键三连!!!😗

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

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

    相关文章

    【数值分析】02-绪论-误差

    参考资料: 书籍: 数值分析简明教程/王兵团,张作泉,张平福编著. --北京:清华大学出版社;北京交通大学出版社,2012.8 视频:学堂在线APP中北京交通大学“数值分析I” 前期回顾 【数值分…

    P3918 [国家集训队] 特技飞行

    P3918 [国家集训队] 特技飞行 - 洛谷 思路: 因为如果连续进行相同的动作,乘客会感到厌倦,所以定义某次动作的价值为(距上次该动作的时间) ci​,若为第一次进行该动作,价值为 0。同一个动作,价值为ci*(最后一…

    Python爬虫实战:研究Pandas,构建期货数据采集和分析系统

    1. 引言 1.1 研究背景 期货市场作为金融市场的重要组成部分,具有价格发现、风险管理和资源配置的重要功能。上海期货交易所(Shanghai Futures Exchange, SHFE)作为中国四大期货交易所之一,上市交易的品种包括铜、铝、锌、黄金、白银等多种大宗商品期货,其交易数据反映了…

    Linux第十七讲:应用层自定义协议与序列化

    Linux第十七讲:应用层自定义协议与序列化1.什么是序列化和反序列化2.重新理解read、write为什么支持全双工3.网络版计算器的实现3.1socket的封装 -- 模板方法模式引入3.2序列化和反序列化 && json3.3协议的实现3.4 服务端整体看 -- 所有代码3.5七层协议&…

    附录:Tomcat下载及启动

    一、打开Tomcat官网windows下载第四个压缩包,下载完成后解压缩。(安装路径不要带有中文和特殊符号)二、启动Tomcat进入bin文件夹:\Tomcat\apache-tomcat-11.0.11\bin,找到startup.bat文件点击,黑窗口常驻即…

    【CTF-WEB】表单提交(特殊参数:?url=%80和?url=@)(通过GBK编码绕过实现文件包含读取flag)

    题目 寻找这个单纯的网站的flag 前端代码&#xff1a; <!DOCTYPE html> <head><title>CAT</title> </head><body> <h1>Cloud Automated Testing</h1> <p>输入你的域名&#xff0c;例如&#xff1a;loli.club</p>…

    (k8s)Kubernetes 资源控制器关系图

    Kubernetes 资源控制器关系图 #mermaid-svg-da6tzgmJn70StNQM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-da6tzgmJn70StNQM .error-icon{fill:#552222;}#mermaid-svg-da6tzgmJn70StNQM .error-text{fill:#55222…

    模电基础:场效应管

    目录 一、场效应管概述 二、结型场效应管&#xff1a;基础场效应管 &#xff08;1&#xff09;基本结构&#xff1a;PN结导电沟道 &#xff08;2&#xff09;工作原理&#xff1a;耗尽区挤压沟道从而控制电流 &#xff08;3&#xff09;特性曲线 1.转移特性 2.输出特性 …

    开发安全利器:detect-secrets 敏感信息扫描工具实战指南

    在现代软件开发流程中&#xff0c;代码安全已成为不可忽视的重要环节。尤其是在 DevSecOps 的理念逐渐普及的今天&#xff0c;如何在开发早期就发现并消除潜在的安全隐患&#xff0c;成为每一个开发者和安全工程师必须面对的问题。其中&#xff0c;敏感信息泄露&#xff08;Sec…

    数字经济专业核心课程解析与职业发展指南

    在数字经济高速发展的时代&#xff0c;选择一门与未来趋势紧密关联的专业至关重要。数字经济专业作为新兴交叉学科&#xff0c;既涵盖传统经济理论&#xff0c;又融合了大数据、人工智能等前沿技术。想要在这一领域脱颖而出&#xff0c;考取权威证书是提升竞争力的有效途径。其…

    使用yolo11训练航拍图片微小目标AI-TOD检测数据集无损压缩版YOLO格式14018张8类别已划分好训练验证集步骤和流程

    【数据集介绍】我们基于公开的大规模航空图像数据集构建了AI-TOD&#xff0c;这些数据集包括&#xff1a;DOTA-v1.5的训练验证集[1]、xView的训练集[19]、VisDrone2018-Det的训练验证集[20]、Airbus Ship的训练验证集1以及DIOR的训练验证测试集[3]。这些数据集的详细信息如下&a…

    sward V2.0.6版本发布,支持OnlyOffice集成、文档权限控制及归档等功能

    1、版本更新日志新增新增目录文档权限控制新增新增知识库、文档归档功能集成OnlyOffice支持word文档预览、编辑新增MarkDown代码块根据语言展示不同样式优化优化富文本在小屏幕操作调整优化部分界面展示效果优化知识库图片展示效果2、目录与文档权限控制默认情况下&#xff0c;…

    多因子AI回归揭示通胀-就业背离,黄金价格稳态区间的时序建模

    摘要&#xff1a;本文通过构建包含通胀韧性、就业疲软、货币政策预期及跨市场联动的多因子量化模型&#xff0c;结合美国8月CPI超预期上行与初请失业金人数激增的动态数据&#xff0c;分析黄金价格的高位持稳机制&#xff0c;揭示就业市场对美联储降息预期的协同支撑效应。一、…

    Java--多线程基础知识(2)

    一.多线程的中断1.通过自定义的变量来作为标志位import java.util.Scanner;public class Demo1 {public static boolean flg false;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{while (!flg){System.out.println(&qu…

    Qit_计网笔记

    第1章 概述1.1 计算机网络在信息时代中的作用一、计算机网络基础概念&#xff08;一&#xff09;计算机网络的定义定义&#xff1a;计算机网络在信息时代中起到核心作用&#xff0c;实现了万物联网和人人用网的目标。&#xff08;二&#xff09;计算机网络的特点信息时代特征&a…

    【C++11】initializer_list列表初始化、右值引用和移动语义、可变参数模版等

    目录 前言 一、简介一下C11 二、{}列表初始化 三、右值引用和移动语义 四、右值引用和移动语义的使用场景 五、右值引用和移动语义在传参中的提效 六、引用折叠和完美转发 七、可变参数模板 前言 本文主要介绍C11中新增的一些重要语法&#xff1a;包括initializer_list列表初…

    MP3 ID3标签中的数字流派代码和文本值翻译成的中文列表

    将MP3 ID3标签中的数字流派代码和文本值翻译成的中文列表&#xff1a;■ 数字代码流派:0 布鲁斯 (Blues)1 古典摇滚 (Classic Rock)2 乡村音乐 (Country)3 舞曲 (Dance)4 迪斯科 (Disco)5 放克 (Funk)6 垃圾摇滚 (Grunge)7 嘻哈 (Hip-Hop)8 爵士乐 (Jazz)9 金属乐 (M…

    U8g2库为XFP1116-07AY(128x64 OLED)实现菜单功能[ep:esp8266]

    使用U8g2库为XFP1116-07AY&#xff08;128x64 OLED&#xff09;实现菜单功能&#xff0c;核心是通过按键控制菜单切换、光标移动和选项选中&#xff0c;结合U8g2的绘图/文本函数实现交互逻辑支持多级菜单&#xff08;主菜单→子菜单→功能执行&#xff09;&#xff0c;并兼容ES…

    easy-dataset 框架综合技术分析:面向领域特定 LLM 指令数据的合成

    摘要 本报告对 easy-dataset 框架 进行全面技术剖析&#xff0c;该框架旨在解决大型语言模型&#xff08;LLM&#xff09;在特定领域应用中的核心瓶颈——高质量指令微调数据的稀缺性。随着 LLM 技术发展&#xff0c;其应用能力不再仅依赖模型参数规模&#xff0c;而是更依赖通…

    【开题答辩全过程】以 4s店汽车销售系统为例,包含答辩的问题和答案

    个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…