Redis如何防止雪崩 穿透 擊穿?

2021-10-25 17:39:45 字數 1257 閱讀 1113

什麼是redis快取雪崩:

redis不可能把所有的資料都快取起來(記憶體昂貴且有限),所以redis需要對資料設定過期時間,並採用的是惰性刪除+定期刪除兩種策略對過期鍵刪除。如果快取資料設定的過期時間是相同的,並且redis恰好將這部分資料全部刪光了。這就會導致在這段時間內,這些快取同時失效,全部請求到資料庫中。這就是redis快取雪崩。快取雪崩會造成資料庫直接崩潰,從而導致整個系統癱瘓。

如何防止redis快取雪崩:

(1)在快取的時候給時間加上乙個隨機值,設定不同的快取過期時間,減少快取在同一時間過期的概率。

(2)或者設定快取永不過期,資料有更新再主動更新。

什麼是redis快取穿透:

在資料庫中,正常的資料庫表id都是從1開始的(正數),但是可能有黑客想要進行破壞,所以每次傳送的請求id值都是負數。而redis快取中並沒有id為負數的鍵,導致redis快取失效,所有請求都去請求資料庫了,而資料庫也沒有這個負的id值,所以每次都是返回空,導致redis也不會記錄。所以這個不存在的資料每次請求都能夠越過redis直接請求資料庫,使得redis快取失去了意義。

這就是快取穿透,如果大量的請求資料在快取中不命中,導致請求直接走資料庫,就有可能導致資料庫崩潰,導致整個系統癱瘓。

如何防止redis快取穿透:

1、由於請求的引數是不合法的(每次都請求不存在的引數),所以我們可以使用布隆過濾器(bloomfilter)或者壓縮filter提前攔截,不合法的請求就不能請求到資料庫層。

2、如果通過某乙個key去查詢資料,而對應的資料庫中不存在該資料,則可以將此key對應的value設定為乙個預設的值,比如說null,並設定乙個快取的失效時間,這樣,在快取失效之前,所有的這個key的請求都會被redis快取擋住了。後面如果此key對應的資料在資料庫中存在時,快取失效之後,再通過此key再去訪問資料,就能拿到新的value了。

什麼是redis快取擊穿(熱點key):

快取中的某乙個key(比如說乙個**商品),在某個時間點過期的時候,剛好在這個時間點有大量的這個key的請求傳送過來,這時就會有大量的請求直接訪問資料庫,可能會把資料庫搞崩潰,從而導致系統癱瘓。

如何防止redis快取擊穿:

(1)在對資料庫查詢的時候使用互斥鎖,如果快取過期了,在大量的請求中就只能有乙個執行緒能夠拿到查詢資料庫的鎖,而其他的請求只能進入等待狀態,等該執行緒進行完查詢操作後,把拿到的資料寫入redis快取中,從新設定快取過期時間,這樣其他的請求又會請求到redis快取,避免了資料庫的崩潰。

(2)根據情況可以設定熱點key永不過期,配合定時任務更新cache,或者資料有更新再主動更新。

redis 雪崩,穿透,擊穿

雪崩 同一時間key大面積失效 多出現在定時任務重新整理時 處理方案 1,把每個key的失效時間都加乙個隨機值 2,設定熱點資料永不過期,有更新操作就更新快取 3,如果時集群,將熱點資料均勻分布在不同的redis庫仲 穿透 快取和資料庫仲都沒有的資料時,使用者不斷的發起請求 處理方案 1,在介面層增...

Redis雪崩 穿透 擊穿

1 定義 1.快取穿透是指查詢乙個一定不存在的資料,由於快取不命中,接著查詢資料庫也無法查詢出結果,2.雖然也不會寫入到快取中,但是這將會導致每個查詢都會去請求資料庫,造成快取穿透 2 解決方法 布隆過濾 1.對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層...

Redis 穿透 擊穿 雪崩

原文 如果在請求資料時,在快取層和資料庫層都沒有找到符合條件的資料,也就是說,在快取層和資料庫層都沒有命中資料,那麼,這種情況就叫作快取穿透 既然我們知道了造成快取穿透的主要原因就是快取中不存在相應的資料,直接到資料庫查詢,資料庫返回空結果,快取中不儲存空結果。那我們就自然而然的想到了解決方案 就是...