redis緩存三大問題分析與解決方案

什么是緩存?

緩存(Cache)是一種將熱點數據緩存在內存中(如 Redis)以加快訪問速度、減輕數據庫壓力的技術。

但引入緩存后可能出現 三大核心問題

  • 緩存穿透(Cache Penetration)
  • 緩存擊穿(Cache Breakdown)
  • 緩存雪崩(Cache Avalanche)

一、緩存穿透(Cache Penetration)

問題描述

緩存穿透指:請求的數據既不在緩存中,也不在數據庫中,導致請求每次都打到數據庫

常見場景

  • 惡意攻擊:傳入大量隨機 ID,繞過緩存層直擊數據庫
  • 用戶訪問非法 ID,如 /user?id=-1

舉例

用戶頻繁訪問一個 不存在的商品 ID:99999999

  • Redis 無此數據 → 查詢數據庫
  • 數據庫無 → 返回 null
  • 下次再次請求 ID=99999999,又重復上述過程 → DB 被壓垮

解決方案

1. 緩存空值
if (dbData == null) {redis.set("shop:99999999", "", 2分鐘);
}
  • 空值也緩存,避免重復查數據庫
  • 設較短 TTL(避免緩存過期數據太久)
2. 參數校驗攔截非法請求
  • 如:ID 不能為負數或超過最大值
  • 在請求層面做過濾,不進 DB 或 Redis
3. 布隆過濾器(適用于大數據量)
  • 將所有合法 ID 加入布隆過濾器
  • 請求前先判斷是否命中布隆過濾器,不在則直接拒絕

二、緩存擊穿(Cache Breakdown)

問題描述

緩存擊穿指:某個熱點 Key 剛好失效時,大量并發請求打到數據庫,導致數據庫瞬時壓力激增。

常見場景

  • 熱點數據正好在高峰期過期
  • 比如:商品詳情頁、秒殺商品、搶購庫存

舉例

商品 ID=1 每天百萬訪問量,緩存過期瞬間,大量用戶同時訪問導致:

  • Redis 查不到 → 并發查詢 DB → 數據庫壓力飆升

解決方案

1. 互斥鎖方式:單線程緩存重建
if (redis.get("shop:1") == null) {if (tryLock("lock:shop:1")) {// 從 DB 讀取 → 緩存寫回 Redisunlock();} else {// 其他線程等待或返回默認值}
}
  • 緩存重建交給首個拿到鎖的線程,其它線程等待或快速失敗
2. 邏輯過期 + 異步重建(推薦)
{"data": {...},"expireTime": "2025-06-30 12:00:00"
}
  • 緩存提前設置一個邏輯過期時間(保存在 value 中)
  • 判斷已過期 → 異步線程后臺刷新 → 返回舊數據不中斷用戶體驗

適合熱點數據緩存更新


三、緩存雪崩(Cache Avalanche)

問題描述

大量緩存同時過期,導致所有請求同時訪問數據庫,引發系統雪崩。

常見場景

  • 設置了相同 TTL 的大量緩存同時過期
  • Redis 重啟或崩潰,緩存瞬間全部丟失

舉例

  • 秒殺系統中 10 萬商品都設置 TTL=24小時
  • 恰好第二天凌晨失效 → 所有請求打到數據庫

解決方案

1. 緩存過期時間加隨機
int ttl = 3600 + RandomUtil.randomInt(0, 600);
redis.set("shop:" + id, value, ttl, TimeUnit.SECONDS);
  • 避免所有 key 同一時間過期,均勻錯開時間點
2. 熱點數據永不過期 + 后臺異步刷新
  • 邏輯過期方案 + 后臺定時更新
  • 熱點數據維持高可用
3. 多級緩存(本地 + 分布式)
  • 如:Caffeine + Redis + MySQL 三層緩存
  • Redis 崩潰時,先從本地緩存兜底
4. 限流+降級
  • 接口層加限流、熔斷、降級返回默認值,避免雪崩擴大化

項目中 Redis 緩存策略總結

問題定義解決方案
緩存穿透請求數據既不在緩存也不在數據庫緩存空值、參數校驗、布隆過濾器
緩存擊穿熱點 key 在高并發下剛好失效加鎖互斥、邏輯過期 + 異步刷新
緩存雪崩大量 key 同時過期、或 Redis 故障加 TTL 隨機值、熱點永不過期、多級緩存、限流降級

實戰建議

  • 所有緩存數據 務必設置 TTL,默認不要永久存在
  • 區分冷數據(短 TTL)與熱點數據(長 TTL 或邏輯過期)
  • 高并發業務使用異步線程池或消息隊列緩沖請求
  • 建立統一的緩存封裝組件(CacheClient),集中處理這些問題

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

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

相關文章

李宏毅機器學習筆記——梯度下降法

深度學習介紹 基于仿生學的一種自成體系的機器學習算法,包括但不限于圖像識別、語音、文本領域。 梯度下降法 作為深度學習算法種常用的優化算法 梯度下降法,是一種基于搜索的最優化方法,最用是最小化一個損失函數。梯度下降是迭代法的一…

day50/60

浙大疏錦行 DAY 50 預訓練模型CBAM模塊 知識點回顧: resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 ps:今日的代碼訓練時長較長,3080ti大概需要40min的訓練時長 作業: 好好理解下resnet18的…

Vue3 之vite.config.js配置

一、示例 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],base: ./,build: {assetsDir: static, //指定靜態資源目錄rollupOptions: {input: {mai…

利用Gpu訓練

方法一: 分別對網絡模型,數據(輸入,標注),損失函數調用.cuda() 網絡模型: if torch.cuda.is_available():netnet.cuda() 數據(訓練和測試): if torch.cud…

使用excel中的MATCH函數進行匹配數據

一、背景 在平日處理數據時,經常需要將給定數據按照制定的數據進行排序,數量比較大時,逐個處理有點費事費力且容易出錯,這時可借助excel表格中match函數進行精確匹配。 二、使用match函數–精確排序操作步驟 主要工作步驟&#xf…

SpringCloud系列(41)--SpringCloud Config分布式配置中心簡介

前言:微服務意味著要將單體應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,因此系統中會出現大量的服務,但由于每個服務都需要必要的配置信息才能運行,所以—套集中式的、動態的配置管理設施是必不可少的&…

wireshark介紹和使用

Wireshark 介紹 Wireshark 是一款開源的 網絡協議分析工具(Packet Sniffer),用于捕獲和分析網絡數據包。它支持多種協議解析,適用于網絡調試、安全分析、網絡教學等場景。 官網:https://www.wireshark.org/ 特點&#…

【甲方安全建設】敏感數據檢測工具 Earlybird 安裝使用詳細教程

文章目錄 背景工具介紹安裝方法一、Linux 與 macOS 安裝流程二、Windows 系統安裝流程(一)三、Windows 系統安裝流程(二)四、錯誤處理使用說明模塊與規則機制集成與運維建議結語背景 隨著源代碼泄露、配置誤提交、密碼硬編碼等風險頻發,企業源代碼庫中潛在的敏感信息泄漏…

異步Websocket構建聊天室

目錄 Websocket技術背景 Websockec簡介 實現websocket通信程序 實驗環境: 服務端(阿里云ESC,VPC網絡): 客戶端1(本機): 通信模型: 實現功能邏輯: 源代碼: 服務…

OpenCV CUDA模塊設備層-----反向二值化閾值處理函數thresh_binary_inv_func()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 OpenCV CUDA 模塊(cudev) 中的一個仿函數(functor)生成器,用于創建一個反向二值化閾值…

【實現一個時間MCP完整技術解析】

🕒 MCP Time Server 完整技術解析:從核心實現到文件架構的深度剖析 目前已上傳npm庫,chan-mcp-time-server,有興趣的可以下載試試 創建時間: 2025年7月2日 🎯 項目概述與架構設計 核心問題定義 AI助手在處理時間相關…

類成員方法命名風格解析:動賓、純動詞與純名詞的選擇之道

在軟件開發的浩瀚代碼海洋中,類成員方法的命名猶如指引開發者的燈塔,其重要性不言而喻。合理的命名不僅能讓代碼 “自我言說”,降低理解成本,還能提升開發效率,促進團隊協作。常見的類成員方法命名風格可歸納為動賓結構…

自己電腦搭建本地服務器并實現公網訪問,內網也能提供互聯網連接使用

如何在本地自己計算機上自建服務器并開啟公網地址提供互聯網服務的詳細教學,一步步操作流程,從本地部署到配置公網IP,最后并附無公網IP內網穿透公網訪問的nat123方案。 要在自用的電腦上搭建本地服務器并實現公網地址的訪問,需要…

如何使用AI改進論文寫作 ---- 引言篇(2)

寫在前面 本篇作為1.0版本的補充優化,記錄本人的研究過程。 在分析了多本論文寫作的相關的書籍之后,我明白了一點,關于論文寫作,永遠是一個熟能生巧的過程,對于人來說,必須多寫才能夠變得熟練,對…

【Java21】在spring boot中使用ScopedValue

文章目錄 0.環境說明1.基礎知識1.1 ScopedValue的特點 2.應用場景2.1 spring web項目中,使用ScopedValue傳遞上下文(全局不可變量)2.2 spring grpc項目中,使用ScopedValue傳遞上下文(全局不可變量) 3.Scope…

第10篇 圖像語義分割和目標檢測介紹

語義分割(Semantic Segmentation)是圖像處理和機器視覺一個重要分支,其目標是精確理解圖像場景與內容。語義分割是在像素級別上的分類,屬于同一類的像素都要被歸為一類,因此語義分割是從像素級別來理解圖像的。如下如所示的照片,屬…

微算法科技(NASDAQ MLGO)基于量子圖像處理的邊緣檢測算法:開拓圖像分析新視野

在當今數字化時代,圖像數據海量增長,邊緣檢測作為圖像處理的關鍵環節,在機器視覺、醫學成像、安防監控等眾多領域有著至關重要的作用。傳統邊緣檢測算法在處理復雜圖像時,面臨計算效率低、精度不足等問題。量子計算的興起&#xf…

SM4密碼算法的C語言實現(帶測試)

一、SM4算法原理 SM4是中國國家密碼管理局于2012年發布的國家商用密碼算法標準,也稱為GB/T 32907-2016。它是一種分組對稱加密算法,采用32輪非線性迭代結構,分組長度和密鑰長度均為128位。SM4算法的設計充分考慮了安全性、高效性和實現簡便性…

【React Native原生項目不能運行npx react-native run-android項目】

運行命令報錯,幫我修復X:\jetbrains-workspace\theme-wallpaper>npx react-native run-android error Android project not found. Are you sure this is a React Native project? If your Android files are located in a non-standard location (e.g. not inside ‘andro…

SPLADE 在稀疏向量搜索中的原理與應用詳解

今天看到Sentence Transformers v5.0 集成了許多稀疏嵌入模型。為了搞清楚什么稀疏嵌入模型以及應用,查到了SPLADE,比較巧合的是在paper reading分享的時候看到有同學分享了一片ACL 2025的工作也是基于SPLADE去做的。下面結合一些資料分享關于SPLADE 在稀…