關於緩存擊穿、緩存雪崩、緩存穿透

設計一個緩存系統,不得不要考慮的問題就是:緩存穿透、緩存擊穿與失效時的雪崩效應。

緩存穿透

緩存穿透是指查詢一個在DB中根本不存在的key,由於緩存一般是不命中時被動寫入的,如果從存儲層查不到數據是不寫入緩存,這將導致這個不存在的數據請求每次都要請求到存儲層,失去了緩存的意義,流量大的時候,可能會導致DB宕機。

解決方案

1、採用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的bitmap中,請求到來的時候先從這個bitmap過濾請求key,如果key不存在就會被這個bitmap過濾掉,從而避免了對底層存儲系統的查詢壓力,

2、緩存空對象,對一個key如果查詢數據不存在,則仍然在緩存中存儲這個key,value爲空對象,並且設一個比較短的過期時間

緩存雪崩

緩存雪崩是指我們爲key設置了相同的緩存過期時間,導致緩存在某一個時刻同時失效,請求全部轉發到DB,DB瞬時壓力過重雪崩

解決方案

緩存失效時的雪崩效應對底層系統的衝擊是非常可怕的,大多數系統設計者考慮使用加鎖或者隊列的方式保證緩存的單線程讀寫,從而避免緩存失效期間大量的併發請求落到底層存儲系統上。

1、加鎖限流:加鎖控制對db的請求數量

2、將緩存失效時間分散開,可以在原有的失效時間基礎上增加一個隨機值,這樣每一個緩存的過期時間的重複率就會變低,避免集體失效的事件。

緩存擊穿

對一些設置了過期時間的key,如果這些可以在某個時間點被高併發訪問,是一種非常熱點的數據,這時候如果這些緩存被擊穿,這個和緩存雪崩的區別就是這裏是針對某一個key的緩存,緩存雪崩式針對很對key

緩存在某個時間點過期的時候,恰好在這個時間點對這個Key有大量的併發請求過來,這些請求發現緩存過期一般都會從後端DB加載數據並回設到緩存,這個時候大併發的請求可能會瞬間把後端DB壓垮。

解決方案:

1、永不過期

2、使用互斥鎖(mutex key): 這種解決方案思路比較簡單,就是隻讓一個線程構建緩存,其他線程等待構建緩存的線程執行完,重新從緩存獲取數據就可以了

參考:https://www.cnblogs.com/raichen/p/7750165.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章