【Redis】穿透、擊穿和緩存雪崩分析與解決

穿透

概念
緩存穿透是指,用戶訪問緩存和數據庫都沒有的數據,本次查詢失敗,當用戶量很多時,由於緩存都沒有命中,大量數據請求瞬間打到DB,會給持久層數據庫造成很大的壓力,嚴重的話還會擊垮數據庫

實例
比如發起id爲-1的數據,或者id爲根本不存在的數據,此時的用戶很可能是攻擊者

解決方案

  • 接口層用戶鑑權校驗,參數做校驗,不合法的return
  • Nginx有配置項,可以讓運維大大對單個IP每秒訪問次數超出閾值的IP都拉黑。
  • 布隆過濾器(Bloom Filter)查詢數據庫是否存在數據,存在返回刷新KV數據庫,不存在直接return
  • 如果對應在數據庫中的數據都不存在,我們將此key對應的value設置爲一個默認的值,比如“NULL”,並設置一個緩存的失效時間。當然這個key的時效比正常的時效要小的多,比如5分鐘,這樣既可以抗住短時間大量的併發請求了。

擊穿

概念
緩存擊穿是指,一個十分熱點的key,不停的接受高併發訪問,在這個key過期失效的一瞬間,大量的請求就擊穿了緩存,直接請求數據庫

解決方案

  • 設置熱點數據永遠不過期
  • 加上互斥鎖
    讓第一個進來的線程查詢數據庫,並將數據更新回緩存,然後釋放鎖,這樣就可以讓接下來併發操作的線程去緩存拿數據

緩存雪崩

概念
緩存雪崩是指大量的key值失效,數據直接打到DB,將數據庫直接打垮,同一時間大面積失效,那一瞬間Redis跟沒有一樣,那這個數量級別的請求直接打到數據庫幾乎是災難性的,你想想如果打掛的是一個用戶服務的庫,那其他依賴他的庫所有的接口幾乎都會報錯,用戶會對你的產品失去信心

解決方案
在這裏插入圖片描述

  • 設置key值隨機過期
setRedis(Key,value,time + Math.random() * 10000);
  • key值不過期
  • redis集羣部署,多個redis存放均勻的熱點數據
  • 資源隔離組件hystrix,熔斷降級
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章