redis快取穿透 擊穿 雪崩

2022-09-20 13:12:17 字數 1036 閱讀 9889

what:

快取穿透:key對應的資料在資料來源並不存在,請求資料沒有被快取命中,直接到db或者儲存裝置中查詢,從而壓垮下游的資料來源。例如:乙個服務快取了手機號及對應手機資訊,當請求是乙個非法手機號時,那麼每次請求快取都會被穿透,從而失效。很多服務攻擊也採用該種方式。

快取擊穿:key對應資料存在快取中,但是由於資料過期,快取採用的查詢更新的機制。如果在過期的一瞬間,大量併發請求過來,這些請求都會請求下游的db或者儲存裝置,從而壓垮下游的資料來源。

快取雪崩:快取重啟(暫時資料不全)或者大量的資料在某個時間點失效,從而導致大量請求到db或者儲存裝置,從而壓垮下游的資料來源。如下圖:

注意:快取擊穿和快取雪崩,核心區別:在於雪崩時針對很多key的快取,擊穿則是某乙個key(熱點的key)。

快取穿透:

1、使用布隆過濾器,將非法的請求直接過濾掉;

2、簡單的方案:直接將不存在value的key對應的資料快取個null,但是過期時間設定的相對短一些,例如:3分鐘;

快取擊穿:

key可能會在某些時間點被超高併發地訪問,是一種非常「熱點」的資料。

1、使用互斥鎖(mutex):就是發現資料失效時,不直接從下游資料來源查詢,而是獲得乙個互斥鎖,只有獲得鎖的請求才去查詢資料,並更新;其他的就重試整個get快取的方法,或者超時。

簡單互斥鎖,例如:setnx,是「set if not exists」的縮寫,也就是只有不存在的時候才設定,可以利用它來實現鎖的效果。

快取雪崩:

1、採用加鎖或者佇列的方案,減輕對下游資料的並行訪問量。

2、在快取資料失效的時間後面,再加個隨機數,從而減小大量資料同時失效的可能;

3、設定快取過期標記和過期時間不同。例如:過期時間是過期標記時間的1倍,那麼過期標記標記資料已經過期了(如果過期會觸發,後台執行緒更新對應key的資料),實際快取還能把舊資料返回給呼叫端,直到另外的執行緒在後台更新完成後,才會返回新快取。

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

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

redis 快取穿透 擊穿 雪崩

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

redis快取穿透,擊穿,雪崩

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