Redis緩存雪崩、緩存擊穿、緩存穿透詳解
1、緩存雪崩
【1】定義
大量緩存數(shù)據(jù)在同一時間失效,導(dǎo)致所有請求直接打到數(shù)據(jù)庫,引發(fā)數(shù)據(jù)庫瞬時高負(fù)載甚至崩潰
【2】原因
1、緩存數(shù)據(jù)設(shè)置了相同的過期時間
2、緩存服務(wù)宕機(jī)
【3】解決方案
[1]差異化過期時間
在基礎(chǔ)TTL上增加隨機(jī)值,避免同時失效
[2]多級緩存
結(jié)合本地緩存和分布式緩存,本地緩存失效后回源到分布式緩存
[3]熔斷降級
監(jiān)控數(shù)據(jù)庫負(fù)載,超過閾值時觸發(fā)熔斷(如返回默認(rèn)值或限流)
[4]緩存永不過期+異步更新
緩存不設(shè)TTL,通過后臺任務(wù)定期更新(適合低頻變更數(shù)據(jù))
2、緩存擊穿
【1】定義
某個熱點key突然失效,大量并發(fā)請求直接穿透到數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫壓力激增
【2】原因
1、熱點key過期
2、惡意請求故意攻擊高頻訪問的key
【3】解決方案
[1]互斥鎖
第一個請求發(fā)現(xiàn)緩存失效時,加鎖(如Redis SETNX),從數(shù)據(jù)庫加載數(shù)據(jù)后釋放鎖,其它請求等待或輪詢
[2]邏輯過期
1、緩存永不過期,但存儲數(shù)據(jù)時附加一個過期時間字段
2、發(fā)現(xiàn)數(shù)據(jù)邏輯過期時,觸發(fā)異步更新
[3]熱點數(shù)據(jù)加載
監(jiān)控?zé)狳ckey,在接近過期時提前刷新緩存
3、緩存穿透
【1】定義
查詢不存在的數(shù)據(jù)(如非法ID、惡意攻擊),導(dǎo)致請求繞過緩存直接訪問數(shù)據(jù)庫
【2】原因
1、業(yè)務(wù)邏輯漏洞(如未校驗參數(shù)合法性)
2、惡意攻擊(如爬蟲偽造不存在的ID)
【3】解決方案
[1]緩存空對象
對查詢不到的數(shù)據(jù),混存一個空值,并設(shè)置較短TTL
[2]布隆過濾器
在緩存層前加布隆過濾器,快速判斷key是否存在:若布隆過濾器返回不存在,直接拒絕請求;若返回可能存在,繼續(xù)查詢緩存/數(shù)據(jù)庫
[3]參數(shù)校驗
對請求參數(shù)做合法性校驗
4、對比總結(jié)
| 問題 | 觸發(fā)條件 | 核心解決方案 |
|---|---|---|
| 緩存雪崩 | 大量key同時失效 | 差異化TTL、多級緩存、熔斷降級 |
| 緩存擊穿 | 單個熱點key失效 | 互斥鎖、邏輯過期、預(yù)加載 |
| 緩存穿透 | 查詢不存在的數(shù)據(jù) | 布隆過濾器、控制緩存、參數(shù)校驗 |
5、最佳實踐
1、監(jiān)控與告警:實時監(jiān)控緩存命中率、數(shù)據(jù)庫QPS,設(shè)置閾值告警
2、壓測模擬:通過模擬雪崩/擊穿場景,驗證解決方案的可靠性
3、組合策略:根據(jù)業(yè)務(wù)場景混合使用上述方案
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解
這篇文章主要介紹了Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
Redis常見數(shù)據(jù)類型List列表使用詳解
Redis的List是一種有序的字符串集合,支持兩端高效插入和刪除,適用于隊列和棧,這篇文章主要介紹了Redis常見數(shù)據(jù)類型List列表使用的相關(guān)資料,需要的朋友可以參考下2024-12-12
一文了解發(fā)現(xiàn)并解決Redis熱key與大key問題
熱key是服務(wù)端的常見問題,本文主要介紹Redis熱key與大key問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Redis分布式鎖的超時機(jī)制實現(xiàn)的方法示例
本文介紹了Redis分布式鎖中超時機(jī)制的關(guān)鍵作用,通過設(shè)置鎖的過期時間防止客戶端崩潰導(dǎo)致的死鎖問題,具有一定的參考價值,感興趣的可以了解一下2025-10-10
Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題
在網(wǎng)站開發(fā)中,我們經(jīng)常會遇到需要控制用戶重復(fù)刷新頁面的情況,本文就來介紹了Python利用redis限制用戶重復(fù)刷新帶來的數(shù)據(jù)問題,感興趣的可以了解一下2024-03-03
Redis+IDEA實現(xiàn)單機(jī)鎖和分布式鎖的過程
這篇文章主要介紹了Redis+IDEA實現(xiàn)單機(jī)鎖和分布式鎖的過程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07

