穿透
概念
緩存穿透是指,用戶訪問緩存和數據庫都沒有的數據,本次查詢失敗,當用戶量很多時,由於緩存都沒有命中,大量數據請求瞬間打到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,熔斷降級