JAVA面試寶典 -《緩存架構:穿透 / 雪崩 / 擊穿解決方案》

💥《緩存架構:穿透 / 雪崩 / 擊穿解決方案》

文章目錄

  • 💥《緩存架構:穿透 / 雪崩 / 擊穿解決方案》
  • 🧭 一、開篇導語:為什么緩存是高并發系統的命脈?
    • ?1.1 緩存的核心價值
      • 緩存帶來的收益??:
    • 💥1.2 緩存不當的災難
    • 🧨1.3 三大問題導火索
  • 🔍 二、緩存三大核心問題解析與解決方案
    • ? 1. 緩存穿透
      • 🛠 解決方案:
    • 💥 2. 緩存擊穿
      • 🛠 解決方案:
    • 🧨 3. 緩存雪崩
      • 🛠 解決方案:
  • 🧠 三、進階架構實踐模塊
    • 3.1 ? 熱點 Key 探測與本地緩存
      • ??實時探測方案??:
      • Caffeine本地緩存實現??:
    • 3.2 ? Redis 分布式鎖的正確實現
      • ??Redisson最佳實踐??:
    • 3.3 ? 多級緩存架構設計
      • ??三級緩存架構??:
      • ??各級緩存配置建議??:
    • 3.4 ? 緩存與數據庫一致性
      • ????最終一致性方案??:
      • Canal + Redis實現??:
  • 📊四、 總結與實戰建議
    • 4.1 不同場景選型建議
    • 4.2 性能優化Checklist
    • 4.3 常見避坑指南
  • 💥 五、互動引導
      • ??討論話題??:

🧭 一、開篇導語:為什么緩存是高并發系統的命脈?

在高并發系統中,緩存是支撐系統性能的關鍵基石。

  • ? 它可減輕數據庫壓力,顯著提升 QPS 和用戶體驗。

  • 🧨 但一旦緩存失效或設計不當,可能造成雪崩式系統故障。

  • 🧠 三大典型問題:緩存穿透、緩存擊穿、緩存雪崩,是系統穩定性的“隱形殺手”。

?1.1 緩存的核心價值

在這里插入圖片描述

緩存帶來的收益??:

  • ??性能提升??:Redis QPS可達10萬+,遠超數據庫的5千
  • ??成本降低??:減少數據庫負載,節省服務器資源
  • ????體驗優化??:響應時間從100ms降至10ms

💥1.2 緩存不當的災難

??真實案例??:某電商大促期間,因緩存雪崩導致:

  • ??數據庫連接池耗盡(1200/1200)
  • ??響應時間從50ms飆升至15秒
  • ??訂單損失超千萬

🧨1.3 三大問題導火索

問題類型觸發場景危害等級
??穿透??惡意請求不存在數據★★☆
??擊穿??熱點key突然失效★★★
??雪崩??大量key同時過期★★★★

🔍 二、緩存三大核心問題解析與解決方案

? 1. 緩存穿透

定義:請求數據數據庫和緩存中都沒有,穿透緩存直接打到數據庫。

場景:惡意請求、參數異常、攻擊行為。

🛠 解決方案:

在這里插入圖片描述

  • 💡 布隆過濾器:初始化時將合法 ID 加入過濾器,攔截非法請求。
// 使用Guava布隆過濾器
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000000, // 預期元素數量0.01     // 誤判率
);// 初始化數據
for (String key : existingKeys) {bloomFilter.put(key);
}// 請求攔截
public Object getData(String key) {if (!bloomFilter.mightContain(key)) {return null; // 直接攔截}// 正常查詢流程...
}
  • 🕳?空值緩存:將無數據查詢結果短暫緩存,防止重復擊打 DB。
if (!bloomFilter.mightContain(id)) {return null; // 攔截非法請求
}
Object data = redis.get(id);
if (data == null) {data = db.query(id);redis.set(id, data == null ? "" : data, 3, TimeUnit.MINUTES); // 空值緩存
}

💥 2. 緩存擊穿

定義:熱點 Key 失效瞬間,海量請求直接擊穿數據庫。

典型場景:秒殺商品詳情、熱點文章頁。

🛠 解決方案:

在這里插入圖片描述

  • 🔥 熱點預加載、緩存永不過期(邏輯失效)
  • 🧱 本地緩存 + 分布式緩存(Caffeine + Redis)組合抗壓
  • 🔐 加分布式鎖防止緩存同時構建

分布式鎖實現??

public Object getData(String key) {// 1. 先查本地緩存Object value = localCache.get(key);if (value != null) return value;// 2. 查Redisvalue = redisTemplate.opsForValue().get(key);if (value != null) {localCache.put(key, value); // 刷新本地緩存return value;}// 3. 獲取分布式鎖String lockKey = "lock:" + key;boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 10, TimeUnit.SECONDS);try {if (locked) {// 4. 再次檢查緩存(雙檢鎖)value = redisTemplate.opsForValue().get(key);if (value == null) {// 5. 查詢數據庫value = dbService.queryData(key);// 6. 寫入RedisredisTemplate.opsForValue().set(key, value, 30, TimeUnit.MINUTES);}return value;} else {// 等待其他線程加載Thread.sleep(100);return getData(key); // 重試}} finally {if (locked) redisTemplate.delete(lockKey);}
}

🧨 3. 緩存雪崩

定義:大量 Key 在同一時間過期,數據庫承壓被擊穿。

場景:批量緩存設置相同 TTL,集中失效。

🛠 解決方案:

在這里插入圖片描述

  • 📊 TTL 加隨機抖動,避免同時過期
// 設置緩存時添加隨機抖動
int baseTtl = 1800; // 30分鐘
int randomTtl = baseTtl + new Random().nextInt(300); // 增加0-5分鐘隨機值
redisTemplate.opsForValue().set(key, value, randomTtl, TimeUnit.SECONDS);
  • 🧊 分批加載 / 緩存預熱
@PostConstruct
public void cacheWarmUp() {List<HotItem> hotItems = dbService.getTop100HotItems();ExecutorService executor = Executors.newFixedThreadPool(4);for (HotItem item : hotItems) {executor.submit(() -> {redisTemplate.opsForValue().set("item:" + item.getId(), item, 30 + new Random().nextInt(10), TimeUnit.MINUTES);});}
}
  • ? 引入熔斷降級機制 + 異步緩存重建

🧠 三、進階架構實踐模塊

3.1 ? 熱點 Key 探測與本地緩存

??實時探測方案??:

在這里插入圖片描述

Caffeine本地緩存實現??:

LoadingCache<String, Object> localCache = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(5, TimeUnit.MINUTES).refreshAfterWrite(1, TimeUnit.MINUTES).build(key -> {// 當本地緩存失效時,從Redis加載return redisTemplate.opsForValue().get(key);});

3.2 ? Redis 分布式鎖的正確實現

??Redisson最佳實踐??:

RLock lock = redissonClient.getLock("product_lock:" + productId);
try {// 嘗試加鎖,最多等待100ms,鎖自動釋放時間30秒if (lock.tryLock(100, 30, TimeUnit.MILLISECONDS)) {// 執行業務邏輯updateStock(productId);}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}
}

避免的坑??:

  1. 非原子操作:setnx + expire 要使用Lua腳本保證原子性
  2. 鎖誤刪:使用唯一value標識鎖持有者
  3. 鎖續期:使用Redisson的watchdog機制

3.3 ? 多級緩存架構設計

??三級緩存架構??:

在這里插入圖片描述

??各級緩存配置建議??:

層級緩存類型TTL特點
L1進程內緩存1-5分鐘超高速,容量有限
L2Redis集群30分鐘分布式,支持高并發
L3數據庫-數據源頭,性能最低

3.4 ? 緩存與數據庫一致性

????最終一致性方案??:

在這里插入圖片描述

Canal + Redis實現??:

// Canal監聽數據庫變更
public class CacheInvalidationHandler implements EntryListener {@Overridepublic void onInsert(RowChange rowChange) {String table = rowChange.getTable();List<Column> columns = rowChange.getRow(0).getColumns();if ("products".equals(table)) {String productId = getColumnValue(columns, "id");redisTemplate.delete("product:" + productId);}}
}

📊四、 總結與實戰建議

4.1 不同場景選型建議

場景推薦方案注意事項
高并發讀多級緩存 + 熱點探測監控本地緩存大小
秒殺系統Redis鎖 + 本地緩存避免鎖競爭過久
數據一致性要求高異步更新 + 重試機制保證最終一致
海量數據布隆過濾器控制誤判率

4.2 性能優化Checklist

  1. ??TTL管理??:基礎值+隨機抖動
  2. 預熱機制??:啟動時加載熱點數據
  3. 監控告警??:緩存命中率低于90%時報警
  4. 容量規劃??:Redis內存使用不超過70%
  5. ??大Key治理??:單Key不超過1MB

4.3 常見避坑指南

在這里插入圖片描述

💥 五、互動引導

??討論話題??:

1.你在項目中遇到過哪種緩存問題?如何解決的?
2.對于金融等高一致性場景,如何保證緩存與數據庫強一致?
3.本地緩存的最大挑戰是什么?

??歡迎評論區分享你的實戰經驗!?? 點贊超過100將更新《Redis深度優化:從大Key治理到集群管理》專題

本文涉及技術棧??

  • Redis 6.x
  • Spring Boot 3.x
  • Redisson 3.17
  • Caffeine 3.0
  • Canal 1.1.6

??性能數據來源??

  • 阿里云Redis性能白皮書
  • 美團緩存架構實踐
  • Redis官方基準測試報告

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

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

相關文章

FPGA創意項目網頁或博客推薦

1. 綜合項目平臺(開源+教程) ① Hackster.io - FPGA專區 ?? https://www.hackster.io/fpga 特點: 大量基于FPGA的創意項目(如Zynq游戲機、視覺處理、機器人控制)。 提供完整教程(Vivado工程文件+代碼)。 推薦項目: FPGA-Based Oscilloscope(低成本示波器) V…

Go 程序無法使用 /etc/resolv.conf 的 DNS 配置排查記錄

在最近的一次部署中&#xff0c;我遇到一個奇怪的問題&#xff1a;Go 程序在運行時不使用 /etc/resolv.conf 中的 DNS 設置&#xff0c;導致服務無法正常訪問域名。這篇文章記錄下完整的排查過程和最終的解決方案。1. 問題現象我有一個部署在 KVM 虛擬機內的 Go 應用&#xff0…

微服務相關問題(2)

1、Spring Cloud相關常用組件注冊中心&#xff08;nacos、Eureka等&#xff09;、負載均衡&#xff08;Ribbon、LoadBalancer&#xff09;、遠程調用&#xff08;feign&#xff09;、服務熔斷&#xff08;Sentinel、Hystrix&#xff09;、網關&#xff08;Gateway&#xff09;2…

安全初級2

一、作業要求 1、xss-labs 1~8關 2、python實現自動化sql布爾育注代碼優化(二分查找) 二、xss-labs 1~8關 1、準備 打開小皮面板&#xff0c;啟動MySQL和apacher 下載 xss-labs&#xff0c;并解壓后放到 phpstudy_pro 的 WWW 目錄下&#xff0c;重命名為 xss-labs 訪問鏈…

基礎算法題

基礎算法題 鏈表 1.1反轉鏈表 描述&#xff1a; 描述 給定一個單鏈表的頭結點pHead(該頭節點是有值的&#xff0c;比如在下圖&#xff0c;它的val是1)&#xff0c;長度為n&#xff0c;反轉該鏈表后&#xff0c;返回新鏈表的表頭。 數據范圍&#xff1a; 0≤&#xfffd;≤…

Android 15 源碼修改:為第三方應用提供截屏接口

概述 在 Android 系統開發中,有時需要為第三方應用提供系統級的截屏功能。本文將詳細介紹如何通過修改 Android 15 源碼中的 PhoneWindowManager 類,實現一個自定義廣播接口來觸發系統截屏功能。 修改方案 核心思路 通過在系統服務 PhoneWindowManager 中注冊自定義廣播監…

20250717 Ubuntu 掛載遠程 Windows 服務器上的硬盤

由 DeepSeek 生成&#xff0c;方法已經驗證可行。 通過網絡掛載Windows共享硬盤&#xff08;SMB/CIFS&#xff09; 確保網絡共享已啟用&#xff1a; 在Windows電腦上&#xff0c;右鍵點擊目標硬盤或文件夾 → 屬性 → 共享 → 啟用共享并設置權限&#xff08;至少賦予讀取權限&…

深度學習圖像增強方法(二)

三、直方圖均衡化 1. 普通直方圖均衡化 直方圖均衡化的原理是將圖像的灰度直方圖展平,使得每個灰度級都有更多的像素分布,從而增強圖像的對比度。具體步驟如下: 計算灰度直方圖:統計圖像中每個灰度級的像素數量。 計算累積分布函數(CDF):計算每個灰度級的累積概率。 映…

QT——信號與槽/自定義信號與槽

1 信號與槽基本介紹 提出疑問&#xff0c;界面上已經有按鍵了&#xff0c;怎么操作才能讓用戶按下按鍵后有操作上的反應呢&#xff1f; 在 Qt 中&#xff0c;信號和槽機制是一種非常強大的事件通信機制。這是一個重要的概念&#xff0c;特別是對于初學者來說&#xff0c;理解它…

Spring原理揭秘--Spring的AOP

在這之前我們已經介紹了AOP的基本功能和概念&#xff0c;那么當AOP集成到spring則會發生改變。Spring AOP 中的Joinpoint&#xff1a;之前提高了很多Joinpoint的類型&#xff0c;但是在spring中則只會有方法級別的Joinpoint&#xff0c;像構造方法&#xff0c;字段的調用都沒適…

C++學習筆記五

C繼承//基類 class Animal{};//派生類 class Dog : public Animal{};#include<iostearm> using namespace std;//基類 class Shape{public:void setwidth(int w){width w;}void setheight(int h){height h;}protected:int width;int height;}//派生類 class Rectangle …

AndroidStudio環境搭建

一、AndroidStudio下載 正常百度出來的站會自動翻譯成中文&#xff0c;導致歷史版本的界面總是顯示不出可下載的地方&#xff0c;點擊成切回英文&#xff0c;就能看出了。 歷史版本&#xff1a;https://developer.android.google.cn/studio/archive

Java大廠面試實錄:從Spring Boot到AI大模型的深度技術拷問

場景&#xff1a;互聯網大廠Java后端面試 面試官&#xff08;嚴肅&#xff09;&#xff1a;小曾&#xff0c;請坐。今天主要考察Java后端技術棧&#xff0c;包括微服務、大數據、AI等。我們先從簡單問題開始。 小曾&#xff08;搓手&#xff09;&#xff1a;好嘞&#xff01;面…

深入解析Hadoop中的HDFS架構設計

HDFS概述與核心設計原則作為Hadoop生態系統的基石&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;是一種專為大規模數據處理而設計的分布式文件系統。它的核心設計理念源于對互聯網時代數據特征的深刻洞察——數據規模呈指數級增長&#xff0c;而硬件…

ota之.加密算法,mcu加密方式

一、ota之.加密算法&#xff0c;mcu加密方式 前面一篇文章&#xff0c;講了soc的加密方式&#xff0c;但是soc資源充足&#xff0c;mcu沒有&#xff0c;所以不會用openss生成公私鑰 切計算哈希用rsa256位。 ECC&#xff08;橢圓曲線加密&#xff09; 是一種非對稱加密算法&…

LangChain面試內容整理-知識點23:實戰案例:檢索增強生成(RAG)系統

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種將LLM與外部知識庫結合的方法,通過實時檢索相關信息來輔助生成答案。這極大緩解了LLM“封閉知識”過期或不足的問題。LangChain非常適合構建RAG系統,因為它提供了文檔加載、向量存儲、檢索接口、LLM組合的一站式方…

探索阿里云ESA:開啟邊緣安全加速新時代

阿里云 ESA 是什么&#xff1f;阿里云 ESA&#xff0c;全稱邊緣安全加速&#xff08;Edge Security Acceleration&#xff09; &#xff0c;其前身為全站加速 DCDN&#xff08;Dynamic Content Delivery Network&#xff09;。在 2024 年 9 月 30 日&#xff0c;阿里云完成了這…

醋酸鈰:賦能科技創新的稀土之力

一、什么是醋酸鈰醋酸鈰是鈰元素與醋酸根離子形成的化合物。鈰作為稀土元素中的重要一員&#xff0c;廣泛應用于材料科學、催化劑、電子產品等領域。醋酸鈰以無色結晶或淺黃色結晶的形式存在&#xff0c;是鈰的有機鹽之一。它不僅具有穩定的化學性質&#xff0c;而且在某些特定…

數據結構之普利姆算法

前言&#xff1a;Prim算法是圖論中的算法&#xff0c;用來生成圖的最小生成樹。本篇文章介紹算法的流程&#xff0c;實現思想&#xff0c;和具體代碼實現&#xff0c;使用c語言。學習需要輸出才能理解的更透徹&#xff0c;所以說堅持寫文章&#xff0c;希望可以用自己的方式把一…

構建強大的物聯網架構所需了解的一切

數據正驅動著當今的商業發展&#xff0c;而物聯網&#xff08;IoT&#xff09;則有助于為企業的增長和創新開辟新的機遇。麥肯錫的研究表明&#xff0c;全球數據在四年內實現了驚人的 7 倍增長。隨著越來越多的物聯網設備進入市場&#xff0c;更多企業開始需要強大的物聯網架構…