Redis篇章3:Redis 企業級緩存難題全解--預熱、雪崩、擊穿、穿透一網打盡

在企業級應用場景中,Redis 作為高性能緩存利器,極大提升了系統響應速度,但隨著業務復雜度和并發量的攀升,緩存相關的各類挑戰也接踵而至。比如系統啟動時緩存缺失導致的數據庫壓力、大量緩存同時失效引發的連鎖故障、熱點數據過期引發的集中查詢風暴,以及惡意請求穿透緩存直擊數據庫等問題,都可能成為系統穩定運行的隱患。接下來,我們將深入剖析緩存預熱、緩存雪崩、緩存擊穿、緩存穿透這四大企業級緩存難題,并詳解對應的解決方案。

企業級解決方案

緩存預熱

緩存預熱是在系統上線或重啟后,提前將一些熱點數據加載到緩存中的操作,主要目的是避免用戶首次訪問相關數據時,因緩存中無對應數據,都去查詢數據庫等后端數據源 ,從而產生較高延遲或給后端帶來巨大壓力。

解決方案

準備工作:

  1. 日常例行統計數據訪問記錄,統計訪問頻度較高的熱點數據
  2. 將統計結果中的數據分類,根據級別,redis優先加載級別較高的熱點數據

實施:

  1. 使用腳本程序固定觸發數據預熱過程
  2. 如果條件允許,使用了CDN(內容分發網絡),效果會更好

總結

緩存預熱就是系統啟動前,提前將相關的緩存數據直接加載到緩存系統。避免在用戶請求的時候,先查 詢數據庫,然后再將數據緩存的問題!用戶直接查詢事先被預熱的緩存數據

緩存雪崩

緩存雪崩是指在某一時間段內,緩存中大量熱點數據同時過期失效,或緩存服務因故障(如宕機、網絡中斷)突然不可用,導致所有原本應訪問緩存的請求全部轉向后端數據庫等數據源,引發數據庫壓力驟增、響應延遲甚至宕機,最終導致整個系統服務不可用的連鎖故障。

解決方案:

  • 給不同的Key的TTL添加隨機值
  • 利用Redis集群提高服務的可用性
  • 給緩存業務添加降級限流策略
  • 給業務添加多級緩存

緩存擊穿

緩存擊穿指的是在緩存中,某個熱點數據(訪問頻率極高的數據 )的緩存過期,大量并發請求同時到達,由于緩存已失效,導致所有原本應訪問緩存的請求全部轉向后端數據庫等數據源,進而可能導致數據庫負載過高甚至服務崩潰?。

    常見的解決方案有兩種

    • 互斥鎖
    • 邏輯過期

    邏輯分析:假設線程1在查詢緩存之后,本來應該去查詢數據庫,然后把這個數據重新加載到緩存的, 此時只要線程1走完這個邏輯,其他線程就都能從緩存中加載這些數據了,但是假設在線程1沒有走完的 時候,后續的線程2,線程3,線程4同時過來訪問當前這個方法, 那么這些線程都不能從緩存中查詢到 數據,那么他們就會同一時刻來訪問查詢緩存,都沒查到,接著同一時間去訪問數據庫,同時的去執行 數據庫代碼,對數據庫訪問壓力過大

    解決方案一,使用鎖來解決:

    因為鎖能實現互斥性。假設線程過來,只能一個人一個人的來訪問數據庫,從而避免對于數據庫訪問壓 力過大,但這也會影響查詢的性能,因為此時會讓查詢的性能從并行變成了串行,我們可以采用 tryLock方法 + double check來解決這樣的問題。

    假設現在線程1過來訪問,他查詢緩存沒有命中,但是此時他獲得到了鎖的資源,那么線程1就會一個人 去執行邏輯,假設現在線程2過來,線程2在執行過程中,并沒有獲得到鎖,那么線程2就可以進行到休 眠,直到線程1把鎖釋放后,線程2獲得到鎖,然后再來執行邏輯,此時就能夠從緩存中拿到數據了。?

    解決方案二,邏輯過期方案?

    方案分析:我們之所以會出現這個緩存擊穿問題,主要原因是在于我們對key設置了過期時間,假設我 們不設置過期時間,其實就不會有緩存擊穿的問題,但是不設置過期時間,這樣數據不就一直占用我們 內存了嗎,我們可以采用邏輯過期方案。

    我們把過期時間設置在 redis的value中,注意:這個過期時間并不會直接作用于redis,而是我們后續 通過邏輯去處理。假設線程1去查詢緩存,然后從value中判斷出來當前的數據已經過期了,此時線程1 去獲得互斥鎖,那么其他線程會進行阻塞,獲得了鎖的線程他會開啟一個 線程去進行 以前的重構數據 的邏輯,直到新開的線程完成這個邏輯后,才釋放鎖, 而線程1直接進行返回,假設現在線程3過來訪 問,由于線程線程2持有著鎖,所以線程3無法獲得鎖,線程3也直接返回數據,只有等到新開的線程2把 重建數據構建完后,其他線程才能走返回正確的數據。

    這種方案巧妙在于,異步的構建緩存,缺點在于在構建完緩存之前,返回的都是臟數據。?

    進行對比:
    互斥鎖方案:由于保證了互斥性,所以數據一致,且實現簡單,因為僅僅只需要加一把鎖而已,也沒其他的事情需要操心,所以沒有額外的內存消耗,缺點在于有鎖就有死鎖問題的發生,且只能串行執行性能肯定受到影響
    邏輯過期方案:線程讀取過程中不需要等待,性能好,有一個額外的線程持有鎖去進行重構數據,但是在重構數據完成前,其他的線程只能返回之前的數據,且實現起來麻煩

    緩存穿透

    緩存穿透是指客戶端請求的是不存在于緩存中,也不存在于后端數據庫(或其他數據源)中的數據,導致每次請求都會 “穿透” 緩存,直接訪問數據庫,若此類請求大量并發,會造成數據庫資源浪費、壓力驟增,甚至引發服務不可用的問題。

    常見的解決方案有兩種:

    緩存空對象

    優點:實現簡單,維護方便

    缺點:

    • 額外的內存消耗
    • 可能造成短期的不一致

    布隆過濾

    優點:內存占用較少,沒有多余key

    缺點:

    • 實現復雜
    • 存在誤判可能

    緩存空對象思路分析:當我們客戶端訪問不存在的數據時,先請求redis,但是此時redis中沒有數據, 此時會訪問到數據庫,但是數據庫中也沒有數據,這個數據穿透了緩存,直擊數據庫,我們都知道數據 庫能夠承載的并發不如redis這么高,如果大量的請求同時過來訪問這種不存在的數據,這些請求就都會 訪問到數據庫,簡單的解決方案就是哪怕這個數據在數據庫中也不存在,我們也把這個數據存入到redis 中去,這樣,下次用戶過來訪問這個不存在的數據,那么在redis中也能找到這個數據就不會進入到緩存 了

    布隆過濾:布隆過濾器其實采用的是哈希思想來解決這個問題,通過一個龐大的二進制數組,走哈希思 想去判斷當前這個要查詢的這個數據是否存在,如果布隆過濾器判斷存在,則放行,這個請求會去訪問 redis,哪怕此時redis中的數據過期了,但是數據庫中一定存在這個數據,在數據庫中查詢出來這個數 據后,再將其放入到redis中, 假設布隆過濾器判斷這個數據不存在,則直接返回 這種方式優點在于節約內存空間,存在誤判,誤判原因在于:布隆過濾器走的是哈希思想,只要哈希思 想,就可能存在哈希沖突

    緩存預熱、雪崩、擊穿、穿透,是企業級應用中 Redis 緩存面臨的典型挑戰。通過提前加載熱點數據的緩存預熱,能避免系統啟動初期的數據庫壓力;采用多樣化策略應對的緩存雪崩方案,保障了緩存大規模失效時系統的穩定;互斥鎖與邏輯過期兩種思路解決的緩存擊穿問題,平衡了數據一致性與訪問性能;緩存空對象和布隆過濾應對的緩存穿透方案,攔截了無效請求對數據庫的沖擊。掌握這些解決方案,能讓 Redis 在企業級場景中更穩定、高效地發揮緩存價值,為系統性能保駕護航。

    有問題歡迎留言!!!😗

    肥嘟嘟左衛門就講到這里啦,記得一鍵三連!!!😗

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

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

    相關文章

    【數值分析】02-緒論-誤差

    參考資料: 書籍: 數值分析簡明教程/王兵團,張作泉,張平福編著. --北京:清華大學出版社;北京交通大學出版社,2012.8 視頻:學堂在線APP中北京交通大學“數值分析I” 前期回顧 【數值分…

    P3918 [國家集訓隊] 特技飛行

    P3918 [國家集訓隊] 特技飛行 - 洛谷 思路: 因為如果連續進行相同的動作,乘客會感到厭倦,所以定義某次動作的價值為(距上次該動作的時間) ci?,若為第一次進行該動作,價值為 0。同一個動作,價值為ci*(最后一…

    Python爬蟲實戰:研究Pandas,構建期貨數據采集和分析系統

    1. 引言 1.1 研究背景 期貨市場作為金融市場的重要組成部分,具有價格發現、風險管理和資源配置的重要功能。上海期貨交易所(Shanghai Futures Exchange, SHFE)作為中國四大期貨交易所之一,上市交易的品種包括銅、鋁、鋅、黃金、白銀等多種大宗商品期貨,其交易數據反映了…

    Linux第十七講:應用層自定義協議與序列化

    Linux第十七講:應用層自定義協議與序列化1.什么是序列化和反序列化2.重新理解read、write為什么支持全雙工3.網絡版計算器的實現3.1socket的封裝 -- 模板方法模式引入3.2序列化和反序列化 && json3.3協議的實現3.4 服務端整體看 -- 所有代碼3.5七層協議&…

    附錄:Tomcat下載及啟動

    一、打開Tomcat官網windows下載第四個壓縮包,下載完成后解壓縮。(安裝路徑不要帶有中文和特殊符號)二、啟動Tomcat進入bin文件夾:\Tomcat\apache-tomcat-11.0.11\bin,找到startup.bat文件點擊,黑窗口常駐即…

    【CTF-WEB】表單提交(特殊參數:?url=%80和?url=@)(通過GBK編碼繞過實現文件包含讀取flag)

    題目 尋找這個單純的網站的flag 前端代碼&#xff1a; <!DOCTYPE html> <head><title>CAT</title> </head><body> <h1>Cloud Automated Testing</h1> <p>輸入你的域名&#xff0c;例如&#xff1a;loli.club</p>…

    (k8s)Kubernetes 資源控制器關系圖

    Kubernetes 資源控制器關系圖 #mermaid-svg-da6tzgmJn70StNQM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-da6tzgmJn70StNQM .error-icon{fill:#552222;}#mermaid-svg-da6tzgmJn70StNQM .error-text{fill:#55222…

    模電基礎:場效應管

    目錄 一、場效應管概述 二、結型場效應管&#xff1a;基礎場效應管 &#xff08;1&#xff09;基本結構&#xff1a;PN結導電溝道 &#xff08;2&#xff09;工作原理&#xff1a;耗盡區擠壓溝道從而控制電流 &#xff08;3&#xff09;特性曲線 1.轉移特性 2.輸出特性 …

    開發安全利器:detect-secrets 敏感信息掃描工具實戰指南

    在現代軟件開發流程中&#xff0c;代碼安全已成為不可忽視的重要環節。尤其是在 DevSecOps 的理念逐漸普及的今天&#xff0c;如何在開發早期就發現并消除潛在的安全隱患&#xff0c;成為每一個開發者和安全工程師必須面對的問題。其中&#xff0c;敏感信息泄露&#xff08;Sec…

    數字經濟專業核心課程解析與職業發展指南

    在數字經濟高速發展的時代&#xff0c;選擇一門與未來趨勢緊密關聯的專業至關重要。數字經濟專業作為新興交叉學科&#xff0c;既涵蓋傳統經濟理論&#xff0c;又融合了大數據、人工智能等前沿技術。想要在這一領域脫穎而出&#xff0c;考取權威證書是提升競爭力的有效途徑。其…

    使用yolo11訓練航拍圖片微小目標AI-TOD檢測數據集無損壓縮版YOLO格式14018張8類別已劃分好訓練驗證集步驟和流程

    【數據集介紹】我們基于公開的大規模航空圖像數據集構建了AI-TOD&#xff0c;這些數據集包括&#xff1a;DOTA-v1.5的訓練驗證集[1]、xView的訓練集[19]、VisDrone2018-Det的訓練驗證集[20]、Airbus Ship的訓練驗證集1以及DIOR的訓練驗證測試集[3]。這些數據集的詳細信息如下&a…

    sward V2.0.6版本發布,支持OnlyOffice集成、文檔權限控制及歸檔等功能

    1、版本更新日志新增新增目錄文檔權限控制新增新增知識庫、文檔歸檔功能集成OnlyOffice支持word文檔預覽、編輯新增MarkDown代碼塊根據語言展示不同樣式優化優化富文本在小屏幕操作調整優化部分界面展示效果優化知識庫圖片展示效果2、目錄與文檔權限控制默認情況下&#xff0c;…

    多因子AI回歸揭示通脹-就業背離,黃金價格穩態區間的時序建模

    摘要&#xff1a;本文通過構建包含通脹韌性、就業疲軟、貨幣政策預期及跨市場聯動的多因子量化模型&#xff0c;結合美國8月CPI超預期上行與初請失業金人數激增的動態數據&#xff0c;分析黃金價格的高位持穩機制&#xff0c;揭示就業市場對美聯儲降息預期的協同支撐效應。一、…

    Java--多線程基礎知識(2)

    一.多線程的中斷1.通過自定義的變量來作為標志位import java.util.Scanner;public class Demo1 {public static boolean flg false;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{while (!flg){System.out.println(&qu…

    Qit_計網筆記

    第1章 概述1.1 計算機網絡在信息時代中的作用一、計算機網絡基礎概念&#xff08;一&#xff09;計算機網絡的定義定義&#xff1a;計算機網絡在信息時代中起到核心作用&#xff0c;實現了萬物聯網和人人用網的目標。&#xff08;二&#xff09;計算機網絡的特點信息時代特征&a…

    【C++11】initializer_list列表初始化、右值引用和移動語義、可變參數模版等

    目錄 前言 一、簡介一下C11 二、{}列表初始化 三、右值引用和移動語義 四、右值引用和移動語義的使用場景 五、右值引用和移動語義在傳參中的提效 六、引用折疊和完美轉發 七、可變參數模板 前言 本文主要介紹C11中新增的一些重要語法&#xff1a;包括initializer_list列表初…

    MP3 ID3標簽中的數字流派代碼和文本值翻譯成的中文列表

    將MP3 ID3標簽中的數字流派代碼和文本值翻譯成的中文列表&#xff1a;■ 數字代碼流派:0 布魯斯 (Blues)1 古典搖滾 (Classic Rock)2 鄉村音樂 (Country)3 舞曲 (Dance)4 迪斯科 (Disco)5 放克 (Funk)6 垃圾搖滾 (Grunge)7 嘻哈 (Hip-Hop)8 爵士樂 (Jazz)9 金屬樂 (M…

    U8g2庫為XFP1116-07AY(128x64 OLED)實現菜單功能[ep:esp8266]

    使用U8g2庫為XFP1116-07AY&#xff08;128x64 OLED&#xff09;實現菜單功能&#xff0c;核心是通過按鍵控制菜單切換、光標移動和選項選中&#xff0c;結合U8g2的繪圖/文本函數實現交互邏輯支持多級菜單&#xff08;主菜單→子菜單→功能執行&#xff09;&#xff0c;并兼容ES…

    easy-dataset 框架綜合技術分析:面向領域特定 LLM 指令數據的合成

    摘要 本報告對 easy-dataset 框架 進行全面技術剖析&#xff0c;該框架旨在解決大型語言模型&#xff08;LLM&#xff09;在特定領域應用中的核心瓶頸——高質量指令微調數據的稀缺性。隨著 LLM 技術發展&#xff0c;其應用能力不再僅依賴模型參數規模&#xff0c;而是更依賴通…

    【開題答辯全過程】以 4s店汽車銷售系統為例,包含答辯的問題和答案

    個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…