分布式緩存:緩存設計中的 7 大經典問題_緩存失效、緩存穿透、緩存雪崩

文章目錄

  • 緩存全景圖
  • Pre
  • 緩存設計中的 7 大經典問題
  • 一、緩存失效
    • 1. 問題描述
    • 2. 原因分析
    • 3. 業務場景
    • 4. 解決方案
  • 二、緩存穿透
    • 1. 問題描述
    • 2. 原因分析
    • 3. 業務場景
    • 4. 解決方案
      • 緩存空結果
      • BloomFilter 過濾
        • BloomFilter 原理簡述
  • 三、緩存雪崩
    • 1. 問題描述
    • 2. 原因分析
    • 3. 業務場景
    • 4. 解決方案
  • 四、結語

在這里插入圖片描述


緩存全景圖

在這里插入圖片描述


Pre

分布式緩存:緩存設計三大核心思想

分布式緩存:緩存的三種讀寫模式及分類

分布式緩存:緩存架構設計的“四步走”方法

實際上,在緩存系統的設計架構中,還有很多坑, 如果設計不當會導致很多嚴重的后果。設計不當,輕則請求變慢、性能降低,重則會數據不一致、系統可用性降低,甚至會導致緩存雪崩,整個系統無法對外提供服務。


緩存設計中的 7 大經典問題

接下來將對緩存設計中的 7 大經典問題,

在這里插入圖片描述

首先我們先梳理一下緩存失效、緩存穿透與緩存雪崩。

  1. 緩存失效:描述、原因、場景、解決方案
  2. 緩存穿透:描述、原因、場景、解決方案(含 BloomFilter 原理)
  3. 緩存雪崩:描述、原因、場景、解決方案

一、緩存失效

1. 問題描述

緩存第一個經典問題是緩存失效。上一課時講到,服務系統查數據,首先會查緩存,如果緩存數據不存在,就進一步查 DB,最后查到數據后回種到緩存并返回。緩存的性能比 DB 高 50~100 倍以上,所以我們希望數據查詢盡可能命中緩存,這樣系統負荷最小,性能最佳。緩存里的數據存儲基本上都是以 key 為索引進行存儲和獲取的。業務訪問時,如果大量的 key 同時過期,很多緩存數據訪問都會 miss,進而穿透到 DB,DB 的壓力就會明顯上升,由于 DB 的性能較差,只在緩存的 1%~2% 以下,這樣請求的慢查率會明顯上升。這就是緩存失效的問題。

當大量緩存 key 在同一時刻過期,被同時淘汰后,打到 DB 的請求驟增,數據庫壓力急劇上升,導致請求變慢甚至服務不可用。

2. 原因分析

  • 緩存在寫入時通常帶上固定過期時間。
  • 一批數據一次性加載到緩存,且使用相同的過期時間,必然在該時間點集中失效。

3. 業務場景

  • 火車票、機票開售時批量預加載緩存。
  • 微博后臺離線計算完熱門 Feed,一次性回寫緩存。
  • 新業務上線或多IDC部署時的緩存預熱。

4. 解決方案

在這里插入圖片描述

  • 過期時間隨機化實際過期 = 基礎過期 + 隨機值,讓同類數據分散在一個窗口內逐步過期,避免雪崩式淘汰。
基礎過期:3600s  
隨機范圍:0–300s  
最終過期:3600s + rand(0,300s)

二、緩存穿透

1. 問題描述

請求一個不存在的 key,每次都會 Miss 并打到 DB,若惡意或大量無效請求持續觸發,DB 壓力陡增,影響正常服務。

2. 原因分析

設計時只考慮了正常訪問流程(Cache → DB → 回種),未對“查詢空”場景做保護:對 DB 查詢到的空結果不回寫緩存,導致每次都要訪問 DB。

3. 業務場景

  • 通過不存在的用戶 ID、車次 ID 訪問系統。
  • 惡意或誤操作客戶端批量請求非法 key。

4. 解決方案

在這里插入圖片描述

緩存空結果

  • 第一次查詢 DB 未命中時,回寫一個特殊空值到緩存,并設置短過期時間;
  • 若后續仍查詢該 key,則直接命中空值緩存,避免再次穿透。

BloomFilter 過濾

  • 預先用 BloomFilter 記錄所有合法 key;
  • 查詢時先檢查 BloomFilter,不存在則直接返回,無需查 Cache/DB。
BloomFilter 原理簡述

在這里插入圖片描述

  1. 數據結構:一個位數組和 k 個獨立 Hash 函數。

  2. 添加元素:對 key 做 k 次 Hash,設置對應 bit 位為 1。

  3. 檢查存在:若 k 個位置都為 1,則“可能存在”;任一位置為 0,則“必定不存在”。

  4. 特性

    • 空否定 100% 準確;
    • 存在判斷有一定誤判率(可通過增加位數組和 Hash 函數數量降至可接受范圍,如 1%→0.1%)。
    • 空值緩存與 BloomFilter 可結合使用,兼顧空間與準確率。

三、緩存雪崩

1. 問題描述

部分或大量緩存節點不可用,導致請求集中打到 DB 或重分布時過載,最終引發系統不可用。

  • 不支持 Rehash:節點故障后,客戶端訪問失敗→穿透到 DB,DB 過載。
  • 支持 Rehash:節點故障后,流量重分發到健康節點,瞬間過載 → 多節點連鎖宕機。

2. 原因分析

  • 單點或少量節點故障:未做好副本或限流保護。
  • 流量洪峰:熱點 key 在少數節點集中,導致節點崩潰并連鎖擴散。

3. 業務場景

  • 部分節點宕機并波及全池。
  • 機架斷電引發大量節點脫機,瞬間請求涌向 DB。

4. 解決方案

在這里插入圖片描述

  1. DB 讀寫降級開關

    • 監控到 DB 慢查詢率或阻塞率過高時,Failfast 部分/全部讀請求,保護 DB 可用;
    • 寫請求保證優先處理,讀請求可根據業務容忍度返回舊值或降級信息。
  2. 多副本部署

    • 同一數據在多副本(機架隔離)上緩存,任一副本失效可從其他副本讀取;
    • 副本數根據熱點程度,熱點可配 6–10+ 副本,冷數據可少量雙副本。
  3. 實時監控與自動故障轉移

    • 緩存節點健康、命中率、慢請求比等指標告警;
    • 自動剔除異常節點、啟動備用節點、限流降級,確保核心請求穩定處理。

四、結語

緩存系統的 穩定與高效 離不開對這些經典問題的深入理解與預防設計。

  • 失效雪崩:隨機化過期、分散淘汰
  • 穿透攻防:空值回寫、BloomFilter 過濾
  • 雪崩防護:限流降級、多副本、監控與自動化運維

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84404.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql差異備份與恢復

1.練習差異備份 差異備份:備份完全備份后,新產生的數據。 在192.168.88.50主機完成差異備份 步驟一:練習差異備份//周一完全備份 mysql> select * from test.one; --------------------- | name | age | sex | ------------------…

【Fargo】razor框架調用mediasoup的發送和接收能力

功能進行拆分,創建獨立的發送和接收線程,并實現跨線程的數據傳遞。創建一個簡化的主函數,展示如何使用這些新的接口線程隔離是通過包隊列實現的,實際上可以用webrtc的post 跨線程機制? 需求 主要有兩個需求:啟動接收線程接收數據的接口 啟動發送線程,但是數據來自于sim_…

C++——volatile

Cvolatile關鍵字 volatile是C中的一個關鍵字,用于修飾變量,表示該變量的值可能會在程序的控制之外被改變。它主要告訴編譯器不要對這個變量進行優化,確保每次訪問變量時都從實際存儲位置讀取最新值,而不是依賴寄存器中的緩存值。…

搭建自己的語音對話系統:開源 S2S 流水線深度解析與實戰

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

qt瀏覽文件支持慣性

#include <QApplication> #include <QListWidget> #include <QScroller> #include <QScrollerProperties>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 創建列表控件并添加示例項QListWidget listWidget;for (int i 0; i <…

路徑規劃算法BFS/Astar/HybridAstar簡單實現

借鑒本文所述代碼簡單實現一下BFS&#xff0c;Astar和HybridAstar路徑規劃算法&#xff0c;用于輔助理解算法原理。 代碼在這里&#xff0c;畫圖用到了matplotlibcpp庫&#xff0c;需要先裝一下&#xff0c;然后直接在文件目錄下執行如下代碼即可運行&#xff1a; mkdir build…

get_the_category() 和 get_the_terms() 的區別

get_the_category() 和 get_the_terms() 是WordPress中用于獲取文章分類的兩個函數&#xff0c;但它們之間存在一些關鍵差異&#xff1a; get_the_category() 特定于分類&#xff1a;get_the_category() 函數專門用于獲取文章的分類(category)。它返回一個包含所有分類對象的…

RocketMq的消息類型及代碼案例

RocketMQ 提供了多種消息類型&#xff0c;以滿足不同業務場景對 順序性、事務性、時效性 的要求。其核心設計思想是通過解耦 “消息傳遞模式” 與 “業務邏輯”&#xff0c;實現高性能、高可靠的分布式通信。 一、主要類型包括 普通消息&#xff08;基礎類型&#xff09;順序…

maxkey單點登錄系統

github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方鏡像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 參考地址&#xff1a; Docker部署 | MaxKey單點登錄認證系統 拉取docker腳本MaxKey: Dromara &#x1f5dd;?MaxK…

基于AI生成測試用例的處理過程

基于AI生成測試用例的處理過程是一個結合機器學習、自然語言處理&#xff08;NLP&#xff09;和領域知識的系統性流程。以下是其核心步驟和關鍵技術細節&#xff0c;以幫助理解如何利用AI自動化生成高效、覆蓋全面的測試用例。 1. 輸入分析與需求建模 目標 將用戶需求、系統文…

《Java vs Go vs C++ vs C:四門編程語言的深度對比》

引言?? 從底層硬件操作到云端分布式系統&#xff0c;Java、Go、C 和 C 四門語言各自占據不同生態位。本文從??設計哲學??、??語法范式??、??性能特性??、??應用場景??等維度進行對比&#xff0c;為開發者提供技術選型參考。 一、??設計哲學與歷史定位??…

無損提速黑科技:YOLOv8+OREPA卷積優化方案解析(原理推導/代碼實現/調參技巧三合一)

文章目錄 一、OREPA核心思想與創新突破1.1 傳統重參數化的局限性1.2 OREPA的核心創新二、OREPA實現原理與數學推導2.1 卷積核分解策略2.2 動態融合公式三、YOLOv8集成實戰(完整代碼實現)3.1 OREPA卷積模塊定義3.2 YOLOv8模型集成3.3 訓練與推理配置四、性能對比與實驗分析4.1…

RestTemplate 發送的字段第二個大寫字母變成小寫的問題探究

在使用RestTemplate 發送http 請求的時候&#xff0c;發現nDecisonVar 轉換成了ndecisonVar ,但是打印日志用fastjson 打印的沒有問題&#xff0c;換成jackson 打印就有問題。因為RestTemplate 默認使用的jackson 作為json 序列化方式&#xff0c;導致的問題&#xff0c;但是為…

C#核心概念解析:析構函數、readonly與this關鍵字

&#x1f50d; 析構函數&#xff1a;資源清理的最后防線 核心作用 析構函數&#xff08;~ClassName&#xff09;在對象銷毀前執行&#xff0c;專用于釋放非托管資源&#xff08;如文件句柄、非托管內存&#xff09;。托管資源&#xff08;如.NET對象&#xff09;由GC自動回收…

FFmpeg中使用Android Content協議打開文件設備

引言 隨著Android 10引入的Scoped Storage&#xff08;分區存儲&#xff09;機制&#xff0c;傳統的文件訪問方式發生了重大變化。FFmpeg作為強大的多媒體處理工具&#xff0c;也在不斷適應Android平臺的演進。本文將介紹如何在FFmpeg 7.0版本中使用Android content協議直接訪…

vue——v-pre的使用

&#x1f530; 基礎理解 ? 什么是 v-pre&#xff1f; v-pre 是一個跳過編譯的 Vue 指令。 它告訴 Vue&#xff1a;“這個元素和其子元素中的內容不要被編譯處理&#xff0c;按原樣輸出。” ? 使用場景&#xff1a; 展示原始的 Mustache 插值語法&#xff08;{{ xxx }}&a…

PyTorch中TensorBoardX模塊與torch.utils.tensorboard模塊的對比分析

文章目錄 說明1. 模塊起源與開發背景2. 功能特性對比3. 安裝與依賴關系4. 性能與使用體驗5. 遷移與兼容性策略6. 最佳實踐與建議7. 未來展望8. 結論實際相關信息推薦資源 說明 TensorBoard&#xff1a;獨立工具&#xff0c;只需安裝tensorboard。TensorFlow&#xff1a;非必需…

單片機中斷系統工作原理及定時器中斷應用

文件目錄 main.c #include <REGX52.H> #include "TIMER0.H" #include "KEY.H" #include "DELAY.H"//void Timer0_Init() { // TMOD 0x01; // TL0 64536 % 256; // TH0 64536 / 256; // ET0 1; // EA 1; // TR0 1; //}unsigned char…

Python爬蟲實戰:研究Portia框架相關技術

1. 引言 1.1 研究背景與意義 在大數據時代,網絡數據已成為企業決策、學術研究和社會分析的重要資源。據 Statista 統計,2025 年全球數據總量將達到 175ZB,其中 80% 以上來自非結構化網絡內容。如何高效獲取并結構化這些數據,成為數據科學領域的關鍵挑戰。 傳統爬蟲開發需…

【機器學習基礎】機器學習與深度學習概述 算法入門指南

機器學習與深度學習概述 算法入門指南 一、引言&#xff1a;機器學習與深度學習&#xff08;一&#xff09;定義與區別&#xff08;二&#xff09;發展歷程&#xff08;三&#xff09;應用場景 二、機器學習基礎&#xff08;一&#xff09;監督學習&#xff08;二&#xff09;無…