1、緩存穿透
簡介
- 當咱們在緩存中查詢不到數據的時候,會去數據庫中進行查詢,將數據庫中查到的數據寫入到緩存中,數據庫中查詢不到的數據不寫入緩存中,
- 這就致使了,一旦咱們一直去查詢一個必定不存在的數據(不管是緩存仍是數據庫),它就會一直不斷的去請求查詢數據庫,形成數據庫請求壓力過大,緩存失效。
- 這種現象被稱爲「緩存穿透」。
解決辦法
- 舉例:當用戶去查詢「key=dcl」時,數據庫中沒有此條數據,那麼就在緩存中緩存「key=dcl,value=空」,當用戶下次再去查詢「key=dcl」時,先在緩存中進行exists(key)判斷,若是存在就返回「空結果」,若是不存在再到數據庫中進行查詢。
- 注意事項:當咱們在數據庫中插入「key=dcl」的相關數據時,要對緩存中的相同key進行刪除,不然即使數據庫中有具體的value值也查詢不到;固然咱們也能夠設置「空結果」緩存的過時時間。
2、緩存雪崩
簡介
當咱們的緩存集中在一段時間內大量失效的時候,用戶查詢時會引起大量直接查詢數據庫的現象,被稱爲「緩存雪崩」,例如服務器遷移緩存清空或者大量的key在同一時間段過時。算法
解決辦法
- 將緩存失效/過時的時間分佈均勻
- 緩存預熱:緩存功能上線時,可經過緩存reload機制,預先去更新緩存,在即將放生大併發前手動觸發加載緩存不一樣的key。好比:開發人員在上線時,本身手動點擊一下,對相關數據進行緩存
- 考慮加互斥鎖進行排隊的方式保證緩存的單線程/進程寫,從而避免雪崩時大量的併發請求落到數據庫上。
3、熱點key
簡介
當緩存中的某個key訪問很是頻繁時,是的全部的流量都涌向同一臺機器,成爲系統的瓶頸,而且一旦該key失效的時,在高併發狀況下會有大量的線程來構建緩存,致使負載增長,系統崩潰。數據庫
解決方案
- 鎖機制:單機狀況下用synchronized,lock等,分佈式狀況下用分佈式鎖。
- 不設置真正的緩存過時時間,在該key的value中去記錄過時時間,若是檢測到value中的過時時間到了,就去查詢該key是否仍是熱點key,若是不是對該key進行刪除;若是是就更新value中的記錄的過時時間。
- 設置標籤緩存:重點問題重點關注,相似於在value中存儲緩存,給熱點key設置標籤緩存,一旦標籤緩存到期就去查詢對應的熱點key是否仍是熱點,並執行相應的操做。
- 將熱點key分散爲多個子key,而後存儲到緩存集羣的不一樣機器上,這些子key對應的value都和熱點key是同樣的。當經過熱點key去查詢數據時,經過某種hash算法隨機選擇一個子key,而後再去訪問緩存機器,將熱點分散到了多個子key上。
PS:緩存
- 文章來自各類資源的整理,若有侵權請告知刪除。
- 轉載本文請註明出處