緩存相關問題:雪崩、穿透、預熱、更新、降級的深度解析

??祝屏幕前的小伙伴們每天都有好運相伴左右??
🎈🎈作者主頁: 喔的嘛呀🎈🎈

目錄

引言

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.pswp.cn/news/717082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717082.shtml
英文地址,請注明出處:http://en.pswp.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;…

代碼隨想錄算法訓練營|day46

第九章 動態規劃 139.單詞拆分代碼隨想錄文章詳解總結 139.單詞拆分 dp[i]表示字符串的前i個字符能被拆分為字典中的單詞 排列問題&#xff1a;外循環背包&#xff0c;內循環物品 字符串能被字典拆分&#xff0c;將當前字符串s[:i]拆分為s[:j]和s[j:i]&#xff0c;意味著s[:j]…

2174. 費用流(費用流,模板題)

活動 - AcWing 給定一個包含 n 個點 m 條邊的有向圖&#xff0c;并給定每條邊的容量和費用&#xff0c;邊的容量非負。 圖中可能存在重邊和自環&#xff0c;保證費用不會存在負環。 求從 S 到 T 的最大流&#xff0c;以及在流量最大時的最小費用。 輸入格式 第一行包含四個…

探索設計模式的魅力:備忘錄模式揭秘-實現時光回溯、一鍵還原、后悔藥、歷史的守護者和穿越時空隧道

?&#x1f308; 個人主頁&#xff1a;danci_ &#x1f525; 系列專欄&#xff1a;《設計模式》 &#x1f4aa;&#x1f3fb; 制定明確可量化的目標&#xff0c;并且堅持默默的做事。 備忘錄模式揭秘-實現時光回溯、一鍵還原、后悔藥和穿越時空隧道 文章目錄 一、案例場景&…

數據結構作業復盤1:字符串疑難雜癥小匯總(字符串賦值,指針數組...)

學校里開始上數據結構了&#xff0c;一開始是從C語言一些相關的基礎開始講起。第一次作業主要是字符串相關的基礎知識以及編程題目。先做了一部分&#xff0c;整理了一下一些字符串隱含的知識和一些易誤易混的概念&#xff0c;算是給自己的一個復盤和歸納。 strcpy函數相關 首…

System Verilog學習筆記(十五)——包的使用

System Verilog學習筆記&#xff08;十五&#xff09;——包的使用 為了使得可以在多個模塊或者類之間共享用戶定義類型&#xff0c;SV添加了包&#xff08;package&#xff09;。用戶自定義的類型例如類、方法、變量、結構體、枚舉類型等都可以在package…endpackage中定義。…

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.抽象數據類型 比如一…

Stable Diffusion webui 常用啟動參數

automatic1111 &#xff08;stable diffusion webui開源項目&#xff09; --listen 開啟遠程訪問&#xff0c;局域網內主機可通過ip地址訪問SD webui主機 --share 開啟互聯網訪問&#xff0c;任何主機都可訪問主機&#xff0c;啟動后會在啟動文本上顯示訪問鏈接 --port 通常…

游戲框架搭建

使用框架的目標&#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;操作系統和計算機網絡。 這四門…

kafka學習筆記四(面試題)

[Kafka 常見面試題]如何保證消息的不重復不丟失-阿里云開發者社區 (aliyun.com) 18道kafka高頻面試題哪些你還不會&#xff1f;&#xff08;含答案和思維導圖&#xff09;-阿里云開發者社區 (aliyun.com) Leader Epoch機制解決的是數據丟失或不一致的問題&#xff0c;見下文&…

報錯解決:av.codec.codec.UnknownCodecError: libx264

1. 錯誤信息 今天在使用Pytorch.io和PyAV包的時候出現了這個錯誤&#xff0c;完整的錯誤信息如下所示&#xff1a; ...envs\tf2_py38\lib\site-packages\torchvision\io\video.py", line 92, in write_videostream container.add_stream(video_codec, ratefps)File &qu…

企業計算機服務器中了360勒索病毒如何解密,360后綴勒索病毒處理流程

對于眾多的企業來說&#xff0c;企業的數據是企業發展的核心&#xff0c;越來越多的企業開始注重企業的數據安全問題&#xff0c;但隨著網絡技術的不斷發展與應用&#xff0c;網絡黑客的攻擊加密手段也在不斷升級。近期&#xff0c;云天數據恢復中心接到多家企業的求助&#xf…

設計模式—命令模式:探索【命令模式】的奧秘與應用實踐!

命令模式 命令模式是一種行為設計模式&#xff0c;它的主要目的是將請求封裝成一個對象&#xff0c;從而使得請求的發送者和接收者之間進行解耦。 在命令模式中&#xff0c;命令被封裝為一個對象&#xff0c;包含了需要執行的操作以及執行這些操作所需的所有參數。 命令的發送者…