缓存相关问题:雪崩、穿透、预热、更新、降级的深度解析

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右✨✨
🎈🎈作者主页: 喔的嘛呀🎈🎈

目录

引言

1. 缓存雪崩

1.1 问题描述

1.2 解决方案

1.2.1 加锁防止并发重建缓存

2. 缓存穿透

2.1 问题描述

2.2 解决方案

2.2.1 布隆过滤器防止无效请求

3. 缓存预热

3.1 问题描述

3.2 分析与解决方案

3.2.1 定时任务预热缓存

4. 缓存更新

4.1 问题描述

4.2 分析与解决方案

4.2.1 主动更新缓存

5. 缓存降级

5.1 问题描述

5.2 分析与解决方案

5.2.1 降级机制提供默认值

总结


引言

在系统开发中,缓存是提升性能和降低数据库负载的重要手段。然而,缓存并非没有问题,常见的问题包括缓存雪崩、缓存穿透、缓存预热、缓存更新和缓存降级等。本文将详细分析这些缓存相关的问题,并提供解决方案。

1. 缓存雪崩

1.1 问题描述

       缓存雪崩是指在缓存中的大量数据同时过期或失效,导致大量请求直接落到数据库,压力剧增,可能导致系统崩溃。我们可以简单的理解为:由于原有缓存失效,新缓存未到期间 (例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

1.2 解决方案

1.2.1 加锁防止并发重建缓存

public class CacheService {private final Object lock = new Object();public Object getData(String key) {Object data = getFromCache(key);if (data == null) {synchronized (lock) {data = getFromCache(key);if (data == null) {data = getFromDatabase(key);putIntoCache(key, data);}}}return data;}// 其他业务逻辑...
}

2. 缓存穿透

2.1 问题描述

        缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。

2.2 解决方案

2.2.1 布隆过滤器防止无效请求

public class CacheService {private final BloomFilter<String> bloomFilter = new BloomFilter<>();public Object getData(String key) {if (!bloomFilter.mightContain(key)) {return null;}Object data = getFromCache(key);if (data == null) {data = getFromDatabase(key);putIntoCache(key, data);}return data;}// 其他业务逻辑...
}

3. 缓存预热

3.1 问题描述

      缓存预热是指在系统上线或重启后,将部分或全部数据预先加载到缓存中,防止大量请求直接访问数据库。

3.2 分析与解决方案

3.2.1 定时任务预热缓存

通过定时任务,在系统启动或每天凌晨1点等时机,将需要预热的数据加载到缓存中:

@Component
public class CacheWarmUpTask {@Autowiredprivate CacheService cacheService;@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行public void warmUpCache() {List<String> keysToWarmUp = getKeysToWarmUp();for (String key : keysToWarmUp) {cacheService.getData(key);}}private List<String> getKeysToWarmUp() {// 根据业务逻辑获取需要预热的缓存键列表// ...}
}

4. 缓存更新

4.1 问题描述

缓存更新是指数据库中的数据更新后,及时将缓存中的数据进行同步。

4.2 分析与解决方案

4.2.1 主动更新缓存

        除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: (1)定时去清理过期的缓存; (2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。

public class CacheService {public void updateCache(String key, Object newData) {// 更新缓存putIntoCache(key, newData);}// 其他业务逻辑...
}

5. 缓存降级

5.1 问题描述

       缓存降级是指在系统遇到异常或缓存失效的情况下,通过某种方式提供默认值或兜底数据,保证系统正常运行。

       当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。 降级的最终目的是保证核心服务可用,即使是有损的而且有些服务是无法降级的(如加入购物车、结算)。 以参考日志级别设置预案: (1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级; (2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警; (3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级; (4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是Redis出现问题,不去数据库查询,而是直接返回默认值给用户。

5.2 分析与解决方案

5.2.1 降级机制提供默认值

在缓存失效或异常时,提供默认值或兜底数据,确保系统正常运行:

public class CacheService {public Object getData(String key) {Object data = getFromCache(key);if (data == null) {data = getFromDatabase(key);if (data != null) {putIntoCache(key, data);} else {data = getDefaultData();}}return data;}private Object getDefaultData() {// 提供默认值或兜底数据// ...}// 其他业务逻辑...
}

总结

       通过深入分析缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题,并提供相应的解决方案,可以有效提高系统的稳定性和性能。在实际应用中,应根据业务场景选择合适的方案,综合考虑多方面因素,以保障系统的高可用性和稳定性。长文分析力求全面,希望能为读者提供深度的理解和实践指导。

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

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

相关文章

【解决方案】ArcGIS Engine二次开发时,运行后出现“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain...”

我们在做ArcGIS Engine二次开发时&#xff0c;特别是新手&#xff0c;安装好了开发环境&#xff0c;满怀信心的准备将按照教程搭建好的框架在Visual Studio中进行运行。点击运行后&#xff0c;却出现了“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化…

【C语言】内存操作篇---动态内存管理----malloc,realloc,calloc和free的用法【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】内存操作篇---动态内存管理----malloc&#xff0c;realloc&#xff0c;calloc和free的用法【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 在学完结构体后&#xff08;…

探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 备忘录模式揭秘-实现时光回溯、一键还原、后悔药和穿越时空隧道 文章目录 一、案例场景&…

数据结构作业复盘1:字符串疑难杂症小汇总(字符串赋值,指针数组...)

学校里开始上数据结构了&#xff0c;一开始是从C语言一些相关的基础开始讲起。第一次作业主要是字符串相关的基础知识以及编程题目。先做了一部分&#xff0c;整理了一下一些字符串隐含的知识和一些易误易混的概念&#xff0c;算是给自己的一个复盘和归纳。 strcpy函数相关 首…

sc-MAVE

Deep-joint-learning analysis model of single cell transcriptome and open chromatin accessibility data单细胞转录组和开放染色质可及性数据的深度联合学习分析模型 在同一个细胞中同时分析转录组和染色质可及性信息为了解细胞状态提供了前所未有的解决方案。然而&#x…

数据结构——基本概念与术语2,抽象数据类型的表示与实现

目录 1.数据类型 2.抽象数据类型 1.抽象数据类型的形式定义 基本操作定义格式说明 2.抽象数据类型定义举例&#xff1a;circle的定义 3.抽象数据类型定义举例&#xff1a;复数的定义 概念小结&#xff1a; 3.抽象数据类型的表示与实现 1.数据类型 2.抽象数据类型 比如一…

游戏框架搭建

使用框架的目标&#xff1a;低耦合&#xff0c;高内聚&#xff0c;表现和数据分离 耦合&#xff1a;对象&#xff0c;类的双向引用&#xff0c;循环引用 内聚&#xff1a;相同类型的代码放在一起 表现和数据分离&#xff1a;需要共享的数据放在Model里 对象之间的交互一般有三…

跨平台指南:在 Windows 和 Linux 上安装 OpenSSL 的完整流程

Windows安装 一&#xff1a;找到安装包&#xff0c;双击即可 https://gitee.com/wake-up-again/installation-package.git 二&#xff1a;按照提示&#xff0c;一步一步来&#xff0c;就可以啦 三&#xff1a;此界面意思是&#xff0c;是否想向创作者捐款&#xff0c;自己视情…

2024最新搭建Mybatis配置教程【超详细】

为什么要学习mybatis 首先要弄清楚什么是mybatis&#xff1f;我们为什么要学mybatis 学习MyBatis可以帮助开发人员更高效地进行数据库操作&#xff0c;提高开发效率&#xff0c;并且可以使得应用程序更具可维护性和性能优势。 我们知道Java程序操作数据库是通过jdbc与数据库进…

蓝桥杯——矩形拼接

矩形拼接 题目分析 对于一个矩形而言&#xff0c;我可以把它横着放&#xff0c;而可以把它竖着放&#xff0c;比如下图&#xff0c; 3个矩形的拼接情况可以通过在纸上画图模拟出来&#xff0c;情况有以下三种 ​ 图1 图3是4条边&#xff0c;即四边形。观察一下什么时候会是四…

IO(Linux)

文件系统 前言1. 回顾关于C文件部分函数2. 一些文件知识的共识3. 相对路径4. fwrite中的\0 一、文件描述符fd1. 概念2. 系统调用① open 和 close② write③ read 和 lseek 3. 缺省打开的fd 二、重定向1. 原理2. 系统调用dup23. stdout和stderr的区别4. 进程替换和原来进程文件…

【计算机考研】408学到什么程度才能考130?

408考130要比考研数学考130难的多 我想大部分考过408的考生都是这么认为的。408的难点在于他涉及的范围太广了&#xff0c;首先如果你要备考408&#xff0c;你要准备四门课程&#xff0c;分别是数据结构&#xff0c;计算机组成原理&#xff0c;操作系统和计算机网络。 这四门…

企业计算机服务器中了360勒索病毒如何解密,360后缀勒索病毒处理流程

对于众多的企业来说&#xff0c;企业的数据是企业发展的核心&#xff0c;越来越多的企业开始注重企业的数据安全问题&#xff0c;但随着网络技术的不断发展与应用&#xff0c;网络黑客的攻击加密手段也在不断升级。近期&#xff0c;云天数据恢复中心接到多家企业的求助&#xf…

设计模式—命令模式:探索【命令模式】的奥秘与应用实践!

命令模式 命令模式是一种行为设计模式&#xff0c;它的主要目的是将请求封装成一个对象&#xff0c;从而使得请求的发送者和接收者之间进行解耦。 在命令模式中&#xff0c;命令被封装为一个对象&#xff0c;包含了需要执行的操作以及执行这些操作所需的所有参数。 命令的发送者…

OpenGuass 之 where 1 = 0 处理流程代码走读

一. 前言 在OpenGuass中&#xff0c;如果where 条件中包含where 1 0 等固定为否条件的查询语句&#xff0c;在生成执行计划的时候&#xff0c;执行计划是BaseResult类型&#xff0c;此类型的执行计划不会进行物理数据扫描&#xff0c;如下所示&#xff1a; 对于非固定为否条件&…

【论文阅读】多传感器SLAM数据集

一、M2DGR 该数据集主要针对的是地面机器人&#xff0c;文章正文提到&#xff0c;现在许多机器人在进行定位时&#xff0c;其视角以及移动速度与车或者无人机有着较大的差异&#xff0c;这一差异导致在地面机器人完成SLAM任务时并不能直接套用类似的数据集。针对这一问题该团队…

latex中\documentclass[preprint,review,12pt]{elsarticle}的详细解释

在LaTeX中&#xff0c;\documentclass 是一个命令&#xff0c;用于指定文档所使用的文档类。文档类定义了文档的总体结构、格式和样式。elsarticle 是一个常用的文档类&#xff0c;它主要用于在Elsevier出版的期刊上提交论文。 详细解释 \documentclass[preprint,review,12pt…

Autosar Appl介绍

AUTOSAR架构中的应用层 AUTOSAR 应用层构成AUTOSAR 架构中的最顶层,被认为对所有车辆应用至关重要。AUTOSAR 标准使用“组件”概念指定应用层实现。 在谈论应用层实现时,应该考虑的三个最重要的部分是: AUTOSAR 应用软件组件这些组件的 AUTOSAR 端口AUTOSAR 端口接口 AUTOS…

浙江大学主办!2024年第7届信息通信与信号处理国际会议( ICICSP2024)征稿开启!

会议官网 IEEE | ICICSP 2024 学术会议查询-学术会议交流服务平台-爱科会易 (uconf.com)​www.uconf.com/

OpenChat:性能高达105.7%,第一个超越ChatGPT的开源模型?

OpenChat&#xff1a;性能高达105.7%&#xff0c;第一个超越ChatGPT的开源模型&#xff1f; 前几天开源模型第一还是是Vicuna-33B、WizardLM&#xff0c;这不又换人了。对于开源模型的风起云涌&#xff0c;大家见怪不怪&#xff0c;不断更新的LLM榜单似乎也没那么吸引人了。 …