緩存雪崩、擊穿、穿透_解決方案

在這里插入圖片描述

文章目錄

  • 緩存雪崩、擊穿、穿透
    • 1.緩存雪崩
      • 造成緩存雪崩
        • 解決緩存雪崩
    • 2. 緩存擊穿
      • 造成緩存擊穿
      • 解決緩存擊穿
    • 3.緩存穿透
      • 造成緩存穿透
      • 解決緩存穿透

緩存雪崩、擊穿、穿透

一般用戶數據存儲于磁盤,讀寫速度慢。

使用redis作為緩存,相當于數據緩存在內存,大大提高系統性能

redis作為緩存,就會有緩存異常的三個問題

1.緩存雪崩

在這里插入圖片描述

緩存都設置了過期時間

造成緩存雪崩

  • 大量緩存數據在同一時間過期

  • redis故障宕機

    若此時有大量用戶請求,無法在redis處理,都直接訪問數據庫 => 數據庫壓力驟增(嚴重造成數據庫宕機) => 形成一系列連鎖反應 => 整個系統崩潰

解決緩存雪崩

=> 大量緩存數據在同一時間過期時:

  1. 均勻設置過期時間(對緩存數據的過期時間加上隨機數,保證數據不會在同一時間過期)

  2. 互斥鎖(當業務線程在處理用戶請求時,如果發現訪問的數據不在redis里,加互斥鎖,保證同一時間內只有一個請求來構建緩存(從數據庫讀取數據,再將數據更新到redis),當緩存構建完成后,再釋放鎖。)
    注:互斥鎖設置超時時間,否則若出現請求發生意外阻塞,導致其他請求也一直拿不到鎖

  3. 后臺更新緩存(讓緩存“永久有效”,將更新緩存的工作交由后臺線程定時更新)
    當系統內存緊張時,有些緩存數據被“淘汰”,在“淘汰”和下次更新時間內,業務線程讀取失敗就以為是數據丟失,解決方法:

    1. 后臺線程負責定時更新緩存,同時頻繁地檢測緩存是否失效,若失效,可進行構建緩存

      ? 檢測時間間隔不能太長,太長導致用戶獲取的數據是空值而不是真正的數據,檢測時間間隔最好是毫秒級,用戶體驗一般

    2. 業務線程發現緩存數據失效后,通過消息隊列發送一條消息通知后臺線程更新緩存。后臺線程收到消息后,更新前判斷緩存是否存在,不存在則進行構建緩存。

      ? 緩存更新及時,用戶體驗好

    **注:**后臺更新緩存機制適合進行緩存預熱(業務剛上線時,提前緩存數據,不是等待用戶訪問才來觸發緩存構建)

=> Redis故障宕機時:

  1. 服務熔斷或請求限流機制

    ? 服務熔斷:暫停業務應用對緩存服務的訪問,直接返回錯誤,不再繼續訪問數據庫,直到redis恢復正常。

    ? 請求限流機制:只將少部分請求發送到數據庫進行處理,再多的請求就在入口直接拒絕服務,等到Redis恢復正常 并把緩存預熱完后。

  2. 構建redis緩存高可靠集群

    ? 通過主從節點的方式構建,若redis緩存的主節點宕機,從節點可以切換成為主節點,繼續提供緩存服務

2. 緩存擊穿

造成緩存擊穿

被頻繁訪問的熱點數據過期,此時大量的請求訪問該熱點數據,直接訪問數據庫,數據庫很容易被高并發的請求沖垮

緩存擊穿可以認為是緩存雪崩的一個子集(對應于大量緩存數據在同一時間過期)

解決緩存擊穿

  1. 互斥鎖
  2. 不給熱點數據設置過期時間,由后臺異步更新緩存 / 在熱點數據準備過期前,提前通知后臺線程更新緩存以及重新設置過期時間

3.緩存穿透

對于緩存雪崩、擊穿,數據仍然在數據庫,一旦緩存恢復相應的數據,就可以減輕數據庫的壓力

而對于緩存穿透:

? 用戶訪問的數據,既不在緩存中,也不在數據庫中,導致請求在訪問緩存時,發現緩存缺失,再去訪問數據庫,發現數據庫也沒有要訪問的數據,沒辦法構建緩存來服務后續請求。當有大量的這樣的請求時,數據庫的壓力驟增

造成緩存穿透

  • 業務誤操作,緩存中數據和數據庫數據都被誤刪除
  • 黑客惡意攻擊,故意大量訪問某些讀取不存在數據的業務

解決緩存穿透

  1. 非法請求的限制

    判斷請求參數是否含有非法值?請求字段是否存在?

  2. 緩存空值或默認值

    當線上業務發現緩存穿透時,針對查詢的數據,在緩存中設置一個空值或默認值,后續請求可以從緩存中讀取到數據,而不會繼續查詢數據庫

  3. 使用布隆過濾器快速判斷數據是否存在,避免通過查詢數據庫來判斷數據是否存在。

    寫入數據庫數據時,使用布隆過濾器做標記,當業務線程確認緩存失效后,可以通過查詢布隆過濾器判斷數據是否存在。(大量請求只會查詢布隆過濾器和redis,而不會查詢數據庫)

注:布隆過濾器的實現

在這里插入圖片描述

設此時有3個哈希函數,位圖數組長度為8,數據庫寫入數據x:

將該數據x得到的三個哈希值 % 位圖數據長度得到三個數組下標,填入1。

當業務線程查詢數據是否存在于數據庫時,查詢 1、4、6下標的值是否為1,若有一個為0,則說明不存在

(存在哈希沖突,故若查詢布隆過濾器說數據存在于數據庫,此時數據不一定在數據庫;但是查詢到數據不存在時,數據一定不存在)

在這里插入圖片描述

小林coding圖解Redis — 七

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

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

相關文章

GZ031 應用軟件系統開發賽題第1套

2023年全國職業院校技能大賽 應用軟件系統開發賽項(高職組) 賽題第1套 工位號: 2023年4月 競賽說明 一、項目背景 黨的二十大報告指出,要加快建設制造強國、數字中國,推動制造業高端化、智能化、綠色化發展。《IDC中國制造企業調研報告,2021》報告指…

SpringBoot學習筆記-實現微服務:匹配系統(上)

筆記內容轉載自 AcWing 的 SpringBoot 框架課講義,課程鏈接:AcWing SpringBoot 框架課。 CONTENTS 1. 配置WebSocket2. 前后端WebSocket通信2.1 WS通信的建立2.2 加入JWT驗證 3. 前后端匹配業務3.1 實現前端頁面3.2 實現前后端交互邏輯3.3 同步游戲地圖 …

年底了,我勸大家真別輕易離職...

年底了,一些不滿現狀,被外界的“高薪”“好福利”吸引的人,一般就在這時候毅然決然地跳槽了。 在此展示一套學習筆記 / 面試手冊,年后跳槽的朋友可以好好刷一刷,還是挺有必要的,它幾乎涵蓋了所有的軟件測試…

銀河麒麟V10-ARM架構-postgresql安裝與部署指南

提示:本人長期接收外包任務。 前言 本文詳細介紹應用源碼進行pgsql的安裝步驟,本文以postgresql-12.0為例。 一、下載并解壓安裝包 ☆下載地址:https://ftp.postgresql.org/pub/source/ 解壓安裝包,創建安裝路徑: …

shopee數據分析軟件:了解市場趨勢,分析競爭對手,優化運營策略

在當今數字化時代,數據已經成為了企業決策的重要依據。對于電商行業來說,數據更是至關重要。如果你想在電商領域中脫穎而出,那么你需要一款強大的數據分析工具來幫助你更好地了解市場、分析競爭對手、優化運營策略。而知蝦數據軟件就是這樣一…

【python學習】中級篇-圖形界面-內置庫Tkinter,用于創建圖形用戶界面(GUI)

Tkinter是Python的一個內置庫,用于創建圖形用戶界面(GUI)。 以下是一個簡單的Tkinter用法示例: import tkinter as tkdef on_click():label.config(text"你好," entry.get())# 創建主窗口 root tk.Tk() root.title("Tkinte…

【python】[subprocess庫] 優雅的并發模板:并發,多進程管理與交互

需求 1> 創建多個進程,并發執行多個終端指令 2> 每個進程的進程號不同(以供記錄,并在異常退出時進行進程清理) 3> 每個子進程的輸出可被python變量記錄 (別問,就是想看) 4> 這些子…

錯題集(c語言)

一、 #include <stdio.h> int main() {int x, y;for (x 30, y 0; x > 10, y<10; x--, y)x / 2, y 2;printf("x%d,y%d\n", x, y);return 0; }思路&#xff1a; 第一次循環開始前&#xff1a;x30&#xff0c;y0&#xff0c;結束&#xff1a;x15&#…

js算法面試題(附答案)

js算法面試題十道 兩數之和 題目&#xff1a;給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那兩個整數&#xff0c;并返回他們的數組下標。 function twoSum(nums, target) {const map new Map();for (let i 0; i < nums.leng…

Java中如何使用雪花算法生成唯一ID

雪花算法&#xff08;Snowflake ID&#xff09;是 Twitter 開源的一種分布式 ID 生成算法&#xff0c;其目的是生成全局唯一的 ID。該算法的核心思想是將一個 64 位的二進制數字分成幾個部分&#xff0c;每個部分表示不同的信息&#xff0c;例如數據中心ID、機器ID、序列號等。…

BUUCTF 梅花香之苦寒來 1

BUUCTF:https://buuoj.cn/challenges 題目描述&#xff1a; 注意&#xff1a;得到的 flag 請包上 flag{} 提交 密文&#xff1a; 下載附件&#xff0c;解壓得到一張.jpg圖片。 解題思路&#xff1a; 1、用010 Editor看了一下&#xff0c;剛開始以為是修改寬高的題&#xff…

羊大師教你如何有效解決工作中的挑戰與壓力?

在現代社會&#xff0c;工作問題一直是許多人頭疼的難題。無論是從工作壓力到職業發展&#xff0c;工作問題不僅會影響個人的心理健康&#xff0c;還可能對整個工作團隊的效率和和諧產生負面影響。因此&#xff0c;如何有效解決工作問題成為了每個職場人士都需要面對的挑戰。 …

Web前端—移動Web第四天(vw適配方案、vw和vh的基本使用、綜合案例-酷我音樂)

版本說明 當前版本號[20231122]。 版本修改說明20231122初版 目錄 文章目錄 版本說明目錄移動 Web 第四天01-vw適配方案vw和vh基本使用vw布局vh布局混用問題 02-綜合案例-酷我音樂準備工作頭部布局頭部內容搜索區域banner 區域標題公共樣式排行榜內容推薦歌單布局推薦歌單內…

Cuda out of memory原因以及解決辦法

Cuda out of memory原因以及解決辦法 文章目錄 Cuda out of memory原因以及解決辦法batch_size設置過大 batch_size設置過大 最近在做對抗訓練方面的實驗&#xff0c;當batch_size設置為256的時候&#xff0c;出現cuda out of memory. 當將batch_size修改為128時&#xff0c;則…

mysql使用--連接查詢

1.連接查詢 如&#xff1a;SELECT * FROM t1, t2; 上述FROM語句將t1表&#xff0c;t2表連接。 假設t1表含n條記錄&#xff0c;t2表含m條記錄&#xff0c;則t1, t2得到的表將包含n*m條記錄。 我們以一個混合連接&#xff0c;過濾的查詢分析語句執行過程。 如&#xff1a;SELECT…

thinkphp文件夾生成zip壓縮包

一、準備工作&#xff0c;使用phpinfo()查看有沒有zip擴展 <?php echo phpinfo(); ?>Thinkphp使用PHP自帶的ZipArchive壓縮文件或文件夾 顯示enabled 說明已經配置好 如果沒有安裝擴展的&#xff0c;請參照以下方法&#xff1a; 1、下載對應版本的擴展包&#xff1a…

Java操作excel之poi

1. 創建Excel 1.1 創建新Excel工作簿 引入poi依賴 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar…

QTableView 和 QAbstractTableModel

1.自定義類繼承QAbstractTableModel 頭文件如下&#xff1a; #ifndef TESTMOUDLE_H #define TESTMOUDLE_H #include "StructTest.h" #include <QAbstractTableModel> class TestMoudle : public QAbstractTableModel { public: TestMoudle(QStringList&…

如何一次性解壓多個文件

第一步&#xff1a;多選壓縮包 第二步&#xff1a;右鍵解壓即可 一句話&#xff0c;單個怎么解壓&#xff0c;多個就怎么解壓&#xff0c;只不過先選中 參考&#xff1a;如何一次性解壓多個文件