Redis中快取穿透 擊穿 雪崩問題和解決方法

2022-09-21 00:33:11 字數 1192 閱讀 5445

目錄

快取穿透是指使用者想查詢乙個資料,發現redis中沒有,也就是快取沒有命中,就向永續性資料庫發起查詢,發現資料庫也沒有這個資料,於是查詢失敗了。

當使用者請求很多的情況下,快取沒有命中,資料庫也沒有數程式設計客棧據,會給資料庫造成很大的壓力,這就是快取穿透。

解決方案

第一種解決方案:使用布隆過濾器

使用布隆過濾器之後,將儲存的資料放入布隆過濾器中,每次資料查詢首先查詢布隆過濾器,當在過濾器中判斷存在時,再到快取查詢,如果沒有,再進入資料查詢。

如果在布隆過濾器中www.cppcns.com不存在,則直接返回告訴使用者該資料查不到,這樣能大大減輕資料庫查詢壓力。

第二種方案:快取空物件

當資料庫資料不存在時,將返回的空物件快取起來,同時設定乙個過期時間,之後在訪問資料時,將從快取中獲取,從而保護了資料庫。

存在問題:

對空值設定過期時間,會存在更新資料庫資料到快取資料失效的這一段時間,快取資料有問題(問題在於快取的空物件資料,由於還沒有過期,但此時資料庫資料已經更新了),會對要保證資料一致性的業務造成影響。會需要更多的空間來儲存更多的控制,造成記憶體中有大量的空值的鍵。

快取擊穿是指乙個熱點key,在不停的扛著大量的併發,當key在失效的瞬間,持續的大併發就會穿破快取,直接請求到資料庫。對資料庫造成瞬間壓力過大。

解決方案

第一種方案:熱點資料永不過期

從快取角度看,沒有設定過期時間,就不會存在快取過期之後產生的問題。

第二種方案:加互斥鎖

使用分布式鎖,保證對每個key的訪問同一時刻只能乙個執行緒去查詢後端服務,其他沒有獲取鎖許可權的執行緒則等待即可。

快取雪崩是指在某乙個時間段,快取集中過期失效或者redis宕機

對於資料庫而言,所有請求壓力會全部到達資料庫,導致資料庫呼叫量暴增,可能也造成資料庫宕機的情況

解決方案

第一種方案(預防為主):redis採用高可用

這種方案的思路就是集群使用,即使乙個re程式設計客棧dis掛掉,其他redis還可以繼續服務。

第二種方案(降低發生時所造成的危害):限流降級

這種思路就是在快取失效後,通過加鎖或者佇列來控制讀取資料庫的執行緒數量讓執行緒在佇列排隊,控制整體請請求速率。

第三種方案:資料預熱

資料預熱即是在正式部署服務之前,先訪問一遍資料,可以將大部分的資料載入到快取中,在即將發生大併發之前已經載入不同的key,設定不同的過期時間,讓快取失效的時間更加均勻。

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

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

redis 快取穿透 擊穿 雪崩

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

redis快取穿透,擊穿,雪崩

快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,多來自於黑客攻擊。由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的k...