天天看點

Redis詳解(十二)------ 緩存穿透、緩存擊穿、緩存雪崩

本篇部落格我們來介紹Redis使用過程中需要注意的三種問題:緩存穿透、緩存擊穿、緩存雪崩。

  本篇部落格我們來介紹Redis使用過程中需要注意的三種問題:緩存穿透、緩存擊穿、緩存雪崩。

  緩存穿透:緩存和資料庫中都沒有的資料,可使用者還是源源不斷的發起請求,導緻每次請求都會到資料庫,進而壓垮資料庫。

  如下圖紅色的流程:

  

Redis詳解(十二)------ 緩存穿透、緩存擊穿、緩存雪崩

   比如客戶查詢一個根本不存在的東西,首先從Redis中查不到,然後會去資料庫中查詢,資料庫中也查詢不到,那麼就不會将資料放入到緩存中,後面如果還有類似源源不斷的請求,最後都會壓到資料庫來處理,進而給資料庫造成巨大的壓力。

  ①、業務層校驗

  使用者發過來的請求,根據請求參數進行校驗,對于明顯錯誤的參數,直接攔截傳回。

  比如,請求參數為主鍵自增id,那麼對于請求小于0的id參數,明顯不符合,可以直接傳回錯誤請求。

  ②、不存在資料設定短過期時間

  對于某個查詢為空的資料,可以将這個空結果進行Redis緩存,但是設定很短的過期時間,比如30s,可以根據實際業務設定。注意一定不要影響正常業務。

  ③、布隆過濾器

  關于布隆過濾器,後面會詳細介紹。布隆過濾器是一種資料結構,利用極小的記憶體,可以判斷大量的資料“一定不存在或者可能存在”。

  對于緩存穿透,我們可以将查詢的資料條件都哈希到一個足夠大的布隆過濾器中,使用者發送的請求會先被布隆過濾器攔截,一定不存在的資料就直接攔截傳回了,進而避免下一步對資料庫的壓力。

  緩存擊穿:Redis中一個熱點key在失效的同時,大量的請求過來,進而會全部到達資料庫,壓垮資料庫。

Redis詳解(十二)------ 緩存穿透、緩存擊穿、緩存雪崩

   這裡要注意的是這是某一個熱點key過期失效,和後面介紹緩存雪崩是有差別的。比如淘寶雙十一,對于某個特價熱門的商品資訊,緩存在Redis中,剛好0點,這個商品資訊在Redis中過期查不到了,這時候大量的使用者又同時正好通路這個商品,就會造成大量的請求同時到達資料庫。

  ①、設定熱點資料永不過期

  對于某個需要頻繁擷取的資訊,緩存在Redis中,并設定其永不過期。當然這種方式比較粗暴,對于某些業務場景是不适合的。

  ②、定時更新

  比如這個熱點資料的過期時間是1h,那麼每到59minutes時,通過定時任務去更新這個熱點key,并重新設定其過期時間。

  ③、互斥鎖

  這是解決緩存擊穿比較常用的方法。

  互斥鎖簡單來說就是在Redis中根據key獲得的value值為空時,先鎖上,然後從資料庫加載,加載完畢,釋放鎖。若其他線程也在請求該key時,發現擷取鎖失敗,則睡眠一段時間(比如100ms)後重試。

  緩存雪崩:Redis中緩存的資料大面積同時失效,或者Redis當機,進而會導緻大量請求直接到資料庫,壓垮資料庫。

Redis詳解(十二)------ 緩存穿透、緩存擊穿、緩存雪崩

   對于一個業務系統,如果Redis當機或大面積的key同時過期,會導緻大量請求同時打到資料庫,這是災難性的問題。

  ①、設定有效期均勻分布

  避免緩存設定相近的有效期,我們可以在設定有效期時增加随機值;

  或者統一規劃有效期,使得過期時間均勻分布。

  ②、資料預熱

  對于即将來臨的大量請求,我們可以提前走一遍系統,将資料提前緩存在Redis中,并設定不同的過期時間。

  ③、保證Redis服務高可用

  前面我們介紹過Redis的哨兵模式和叢集模式,為防止Redis叢集單節點故障,可以通過這兩種模式實作高可用。