小議快取失效 穿透 雪崩和擊穿 的風險及解決方案

2021-10-19 18:21:47 字數 1222 閱讀 9998

一、快取穿透

含義:指查詢乙個快取和資料庫中均不存在的資料(極端的如負數或integer.max_value),由於快取未命中,查詢請求將會轉到資料庫,但資料庫中也無此資料,且以往歷次查詢得到null結果的未被寫入快取,導致每次查詢該資料的請求都會越過("穿透")快取,落到資料庫,使得快取這道屏障形同虛設。

風險:利用不存在的資料對資料庫進行高併發查詢,資料庫感到瞬時壓力過大,終因暗箭難防,寡不敵眾,撒手寰,含恨而去。

解決方案:將從資料庫查詢的null結果以適當形式(比如0)寫入快取,並設定較短的過期時間。

二、快取雪崩

含義:指在將資料寫入快取時,恰巧出現大量同批次資料的key設定了相同的過期時間的情況,或者過期時間值比較單一,資料過期時間重合率高,導致大量資料的快取在某一時刻同時失效(面積之大,勢如雪崩),使得大批量請求落庫。

風險:孤軍奮戰的db,勢單力薄,終究無法頂住瞬間打來的大併發流量的突襲而被打崩,「潰不成」。

解決方案:在設定失效時間時採用隨機值,如1-50秒隨機,這樣每個快取的過期時間的重複率就會降低,從而避免集體失效事件的發生率。

三、快取擊穿

含義:一些訪問熱度較高的資料,會在某些時段被大批請求極端高併發地訪問。有一種情形是,某一高熱度資料恰巧在大批請求到來時失效,那麼,這一大批查詢請求,就會像槍林彈雨擊穿**惡霸的腦殼一般,全都穿過快取打到db老巢,形成快取擊穿。

風險:歷盡滄桑的db老巢,本就風雨飄搖,定然扛不住大流量的瞬間精準暴擊而轟然崩塌。

解決方案:

1、加鎖。對於大量併發請求,只放行其中乙個請求去db中查詢,剩餘的請求一律等待(自旋)。被放行的請求查詢完畢之後立即釋放鎖,其它請求才能搶到鎖。後續搶到鎖的請求,仍要先去查快取,而此時快取中已有資料,便不會再到db中查詢,從而避免快取擊穿;

2、延長高熱度資料的過期時間,或者採用自動續期機制,但對於電商類應用,最好設定高熱資料的key永不過期;

3、分散存放。將高熱度資料分布式地存放於不同的快取分片或快取集群中。

快取雪崩,穿透和擊穿

一 快取雪崩 大量key同時失效,大量請求傳送到db上,導致db宕機。解決辦法 設定key過期時間時,使用隨機數 setredis key,value,time math.random 10000 二 快取穿透 大量請求請求乙個快取中沒有的key,這些請求直接懟到db上,造成宕機。如傳送為負數的入參...

快取擊穿 雪崩和穿透

訪問乙個不存在的key,快取不起作用,請求會穿透到db 資料庫 流量大時db會掛掉 解決方法 之所以發生穿透,是因為快取中沒有儲存這些資料的key,從而每次都查詢資料庫,我們可以為這些key在快取中設定對應的值為null,後面查詢這個key的時候就不用查詢資料庫了,訪問key未在db查詢到值,也將空...

快取穿透,擊穿,雪崩

一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...