1. 程式人生 > >Redis快取避免快取雪崩、快取擊穿、快取併發問題解決實踐方案

Redis快取避免快取雪崩、快取擊穿、快取併發問題解決實踐方案

分散式快取的意義在於縮短系統響應時間、提高系統併發、減輕DB儲存壓力。

正常情況下使用分散式快取的流程如下圖,業務請求進來時,先查詢Redis,如果Redis中存在的話,直接返回Redis中結果;如果Redis中不存在的話,訪問資料庫。

快取使用位置

在高併發場景,應該滿足對Redis的相同查詢,理想情況每次最多有一個請求通過,儘量保證減少資料庫的訪問壓力。即Redis不僅僅作為快取,也作為一個請求過濾器,對於相同的查詢,只漏過一個請求對資料庫操作。

快取雪崩問題:
快取雪崩問題是快取在某一時刻同時失效,導致所有請求全部轉到資料庫中,增大資料庫壓力。

快取擊穿:
快取擊穿是指資料庫中壓根不存在某一資料,導致根本無法將結果快取到資料庫中,如果大量請求查詢該不存在的資料,所有的請求將會全部打到資料庫中,給資料庫造成壓力。

快取併發問題
快取併發問題是指在多個請求同時訪問一個數據時,如果這個資料在Redis快取中不存在,這多個請求將全部訪問到資料庫中,如果同一時刻大量這樣的請求,將給資料庫造成壓力。

Redis解決快取雪崩、快取擊穿、快取併發問題實踐方案:

在這裡插入圖片描述

此流程在程式邏輯上使用非一致失效時間避免快取雪崩,當然也可以使用多快取、備用快取,但是程式邏輯是最有效的方式;通過鎖和標記變數來避免快取併發,在多請求同時訪問同一資料時,設定鎖,以阻擋其它執行緒訪問,保證訪問資料庫只有一個請求進去,同時設定標記變數,表示當前資料正在被獲取;通過設定標記變數
表明資料庫中無該資料,當然這種方式需要跟資料庫保持嚴格一致,在資料庫變更時,對快取進行更新。