簡要說下緩存穿透,緩存擊穿,緩存雪崩的出現情景和解決方案!
出現上述問題的前提:因為數據庫使用磁盤存取數據,往往比較慢,而緩存使用內存(而且通常是key-value型),存取較快!
這樣先使用內存緩存來緩存數據庫數據,讀取數據的時候先從緩存讀取,只有獲取不到的時候才從數據庫獲??!
下面分別從概念,出現場景,解決方案來說:
①,
概念:訪問一個不存在的key,所有的讀取都會訪問數據庫,通常數據庫中也沒有這樣的數據,造成穿透,數據量大時,導致數據庫卡死!
出現情景:一般數據庫都是使用正整數來做id,然后使用id作為key緩存,如果有人惡意攻擊,傳一個負數(-100)做大量查詢,那么數據庫崩潰!
解決辦法:
1,設置攔截,對不符合要求的id直接攔截!
2,緩存不存在,數據庫也不存在也進行數據保存,key-null,并設置過期時間(短點好,1min),這樣能攔截短時間內大量的同一個key的穿透!
②,
概念:緩存擊穿通常發生在超高并發的時候,緩存中的key超時過期,這時候大量的請求同一時間落到數據庫,造成數據庫卡死!
出現場景:秒殺活動通常會把商品id等提前進行緩存,如果某個正想辭職的程序員在設置過期時間的時候,把過期時間設在了秒殺前一刻,那秒殺開始的時候,大量的請求將直接訪問數據庫!
解決辦法:
1,熱點數據設置超長的過期時間(甚至forever)
2,人為干預:在活動開始前先對所有熱點數據進行設置!
③,
概念:大批量的key過期,導致大量的查詢到了持久層,引起卡死!主要是大量的key,而緩存擊穿通常是一個或者少量key!
出現場景:緩存服務器宕機,代碼錯誤等導致key大量過期等原因!
解決方法:
1,高可用緩存集群,保證緩存不掛!
2,過期時間使用隨機算法,防止同一時間過期!