緩存:一般緩存都是定時任務去重新整理,或者查詢不到之後就去更新
Redis緩存雪崩、擊穿、穿透
當緩存伺服器重新開機或者大量緩存資料集中再某一時間段失效(過期),這樣在失效的時候,會給後端系統(DB)帶來很大的壓力,造成瞬時資料庫請求量大、壓力驟增,引起雪崩,甚至導緻資料庫被打挂
1.過期時間打散:給緩存時間加上一個随機數,避免同一時刻大量資料集中失效
2.熱點資料不過期:要着重考慮重新整理的時間間隔和資料異常如何處理的情況
3.增加互斥鎖:按 key 次元加鎖,對于同一個 key,隻允許一個線程去計算,其他線程原地阻塞等待第一個線程的計算結果,然後直接走緩存即可
緩存擊穿是指一個key非常熱點,不停地扛着高并發,并發集中在這一個點上請求,當這個key過期失效時,持續的高并發就穿透緩存,直接請求DB
1.增加互斥鎖:在并發的多個請求中,隻有第一個請求線程能拿到鎖并執行資料庫查詢操作,其他的線程拿不到鎖就阻塞等着,等到第一個線程将資料寫入緩存後,直接走緩存,DB資料回寫到緩存,後面的請求就不會打到DB,走緩存,進而避免擊穿
3.布隆過濾器(Bloom Filter),利用高效的資料結構和算法快速判斷出這個Key是否在資料庫中存在,不存在就傳回,存在你就去查了DB重新整理KV再傳回
通路一個緩存和資料庫都不存在的 key,此時會直接打到資料庫上,并且查不到資料,沒法回寫緩存,是以每次都會打在資料庫上,造成資料庫壓力過大,甚至崩潰
1.接口校驗:可以在最外層先做一層校驗:使用者鑒權、資料合法性校驗
2.緩存空值:當通路緩存和DB都沒有查詢到值時,可以将空值寫進緩存,但是設定較短的過期時間,該時間需要根據産品業務特性來設定
3.布隆過濾器:使用布隆過濾器存儲所有可能通路的 key,不存在的 key 直接被過濾,存在的 key 則再進一步查詢緩存和資料庫