redis快取穿透 雪崩 擊穿,以及解決辦法

2021-09-22 01:37:35 字數 922 閱讀 1715

redis快取穿透、雪崩、擊穿,以及解決辦法

我們先來討論乙個redis的使用場景:

使用redis作為快取的時候,大部分做法是 先在redis裡查詢是否有該key, 比如查詢使用者資訊時,先在redis裡根據使用者id查詢,如果沒有則到資料庫裡查詢, 如果在資料庫裡查詢到了再放入redis,並設定過期時間,然後返回使用者資料。

那麼恭喜你,這種使用場景會導致以下3個問題

1、穿透:指的是redis中不存在該key, 而去查詢資料庫, 查到後再儲存到redis, 查不到則直接返回。

這種情況看上去沒毛病,正常業務操作也不會有啥問題。但是一些惡意攻擊者可以使用大量不存在的key來攻擊你的服務,當大量不存在的key來請求你的服務時,資料庫接受大量的查詢,達到一定的限度,將會壓垮資料庫,造成其他服務不可用。

2、雪崩:redis中大量的key同時過期,造成資料庫瞬間壓力增大,甚至壓垮資料庫。

造成雪崩有兩種情況: a、大量快取設定的過期時間一致,並且也是同時初始化到快取裡的,那麼同時過期也是理所當然的。 b、redis某個節點宕機,造成該節點所有key過期。

3、擊穿:當某個熱點key存在時(比如秒殺活動等),該key過期的瞬間,大量的併發查詢會落到資料庫,給資料庫造成壓力。

解決方案:

1、穿透, 3種思路。 a、如果資料庫根據該key未查到資料,不立即返回,先快取乙個空值,並且過期時間設定小一點,這樣使用同乙個key來惡意攻擊就會失效。 b、惡意攻擊者可能使用不同的不存在的key來攻擊,這個時候可以用過濾器來過濾掉一部分無效key。 c、參考其他解決方案。

3、擊穿:2種解決方案。a、使用排他鎖,這樣保證只有乙個查詢能到達資料庫。b、熱點key設定成永不過期。

其他解決方案:

產生以上3個問題共同特點是給資料庫造成壓力,如果不查詢資料庫,以上3個問題就不存在了。具體做法就是使用非同步程式同步快取。

Redis快取穿透,快取雪崩以及快取擊穿

概念 訪問乙個不存在的key,快取不起作用,請求會穿透到db,流量大時db會掛掉。快取穿透的概念很簡單,使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這...

Redis快取穿透,穿透擊穿,快取雪崩

乙個一定不存在快取及查詢不到的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bit...

redis 快取穿透 擊穿 雪崩

介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id 0的直接攔截 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key value對寫為key null,快取有效時間可以設定短點,如30秒 設定太長會導致正常情況也沒法使用 這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊 public o...