Java面試合集沖擊月薪40K的offer之《什麼是緩存雪崩、擊穿、穿透》
什麼是緩存雪崩、擊穿、穿透?
資料一般存儲于DB,DB的資料是在磁盤上的,磁盤的讀寫速度相對于計算機硬體來說是比較慢的。
引入了緩存層,會有緩存異常的三個問題,如下
1、緩存雪崩
2、緩存擊穿
3、緩存穿透。
一張圖了解全貌
緩存雪崩
是指緩存同一時間大面積的失效,後面的相關的請求都會落到DB上,造成DB短時間内承受大量request而崩掉。
解決方案:
1、
1)緩存資料的過期時間設定随機時間。
2)防止同一時刻内的大量資料過期現象發生的情況。
2、
1)給每一個緩存資料增加相應的緩存sign,(唯一辨別)。
2)記錄緩存是否失效,如果緩存sign失效,則進行更新資料緩存。
3、緩存進行預熱
4、互斥鎖
緩存穿透
是指緩存和DB中都沒有的資料,導緻所有的請求都落到DB上,造成DB短時間内承受大量請求而崩掉。
解決方案:
1、接口層加一個校驗,比如使用者鑒權,id做基礎,id<=0的直接攔截;
2、從緩存取不到的資料,在資料庫中也沒有取到,這時也可以将key-value對寫為key-null,緩存有效時間可以設定短點,如30秒(設定太長會導緻正常情況也沒法使用)。這樣可以防止攻擊使用者反複用同一個id暴力攻擊
3、采用布隆過濾器。
1)将所有可能存在的資料哈希到一個容量足夠大的 bitmap 裡;
2)一個一定不存在的資料肯定會被這個 bitmap所攔截,避免了系統對底層存儲系統的查詢壓力。
緩存擊穿
是指緩存中沒有但DB中有的資料(一般是緩存時間到期),由于并發使用者特别多,同時讀緩存沒讀到資料,又同時去DB去取資料,引起DB壓力瞬間增大,造成過大壓力。
和緩存雪崩不同,緩存擊穿指并發查同一條資料,緩存雪崩是不同資料都過期了,很多資料都查不到進而查DB。
解決方案
1、設定熱點資料永遠不會過期政策。
2、加互斥鎖去解決。