快取穿透是用戶訪問一個不存在的key,導致請求穿透到資料庫, 問題關鍵是程式上要識別出這個key是一個錯誤key,不是由系統生成的key,每次添加或洗掉快取時維護一個key欄位查詢過濾器,例如:布隆過濾器、HashSet,這樣在訪問快取前,可以對key先進行查詢過濾,判斷key是否存在,再往下執行業務邏輯, 另一種辦法是把空結果快取,key不存在有兩種情況,一是資料庫存在,但key快取過期了,或者還沒把資料設定快取,二是資料庫沒記錄,key不存在,要把這兩種情況區分開,程式才不會誤判,對于第二種,要把key快取起來,值設定為空字串回傳,過期時間不宜設定太長,例如10分鐘內,因為資料庫雖然現在沒記錄,但將來可能有,設定一定有效期是有必要的,既能夠保持資料最終一致,又能解決穿透問題,第一種是資料庫存在,key不存在,回傳的是null,繼續往下執行業務邏輯, 快取雪崩是指大范圍key在同一時間失效,請求同一時間落到資料庫, 在每個key設定基礎失效時間上加上一個隨機失效時間,例如5分鐘內的亂數,這樣就可以把失效時間分散開,避免集中在一個時間點上失效, 快取擊穿是一個熱點key突然快取時間到期失效,大量請求落到資料庫, 既然問題是熱點key快取到期失效引起的,如果程式能在key臨近到期時,主動去更新快取延期,就能避免被擊穿,在設定快取時可以把到期時間記錄到快取里,每次讀快取時取出到期時間,判斷距離當前時間還有多久失效,假如已到達設定的閾值(如:1分鐘),則拉取最新資料更新快取,建議根據您的業務執行時間去設定閾值,保證在閾值內能執行完快取更新, 上篇文章說到用快取雙刪來更新快取,但在快取刪掉后,讀業務沒了快取層,在瞬間將面臨大流量擊穿到資料庫,假如熱點key設定了兩份快取分別是C1和C2,并且C2過期時間要比C1長,當C1快取不存在時,用C2快取來緩沖,雖然像解決了問題,但C1被刪了,只能通過后臺作業或者消費佇列去更新C1,這樣做快取雙刪就失去原來的作用了,所以不能光用快取來檔流量,也要在原來快取層上加入限流,把流量層層削弱,讓少部分流量留入資料庫,不至于宕機,下篇將講講如何限流
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/506114.html
標籤:Java
上一篇:快取更新的另一種方法:雙刪策略
