常見的緩存問題:緩存穿透、緩存雪崩、熱點key

1、緩存穿透

簡介

  1. 當咱們在緩存中查詢不到數據的時候,會去數據庫中進行查詢,將數據庫中查到的數據寫入到緩存中,數據庫中查詢到的數據不寫入緩存中,
  2. 這就致使了,一旦咱們一直去查詢一個必定不存在的數據(不管是緩存仍是數據庫),它就會一直不斷的去請求查詢數據庫,形成數據庫請求壓力過大,緩存失效
  3. 這種現象被稱爲「緩存穿透」。

解決辦法

  • 舉例:當用戶去查詢「key=dcl」時,數據庫中沒有此條數據,那麼就在緩存中緩存「key=dcl,value=空」,當用戶下次再去查詢「key=dcl」時,先在緩存中進行exists(key)判斷,若是存在就返回「空結果」,若是不存在再到數據庫中進行查詢。
  • 注意事項:當咱們在數據庫中插入「key=dcl」的相關數據時,要對緩存中的相同key進行刪除,不然即使數據庫中有具體的value值也查詢不到;固然咱們也能夠設置「空結果」緩存的過時時間

2、緩存雪崩

簡介

當咱們的緩存集中在一段時間大量失效的時候,用戶查詢時會引起大量直接查詢數據庫的現象,被稱爲「緩存雪崩」,例如服務器遷移緩存清空或者大量的key在同一時間段過時。算法

解決辦法

  1. 將緩存失效/過時的時間分佈均勻
  2. 緩存預熱:緩存功能上線時,可經過緩存reload機制,預先去更新緩存,在即將放生大併發前手動觸發加載緩存不一樣的key。好比:開發人員在上線時,本身手動點擊一下,對相關數據進行緩存
  3. 考慮加互斥鎖進行排隊的方式保證緩存的單線程/進程寫,從而避免雪崩時大量的併發請求落到數據庫上。

3、熱點key

簡介

當緩存中的某個key訪問很是頻繁時,是的全部的流量都涌向同一臺機器,成爲系統的瓶頸,而且一旦該key失效的時,在高併發狀況下會有大量的線程來構建緩存,致使負載增長系統崩潰數據庫

解決方案

  1. 鎖機制:單機狀況下用synchronized,lock等,分佈式狀況下用分佈式鎖。
  2. 不設置真正的緩存過時時間,在該key的value中去記錄過時時間,若是檢測到value中的過時時間到了,就去查詢該key是否仍是熱點key,若是不是對該key進行刪除;若是是就更新value中的記錄的過時時間。
  3. 設置標籤緩存:重點問題重點關注,相似於在value中存儲緩存,給熱點key設置標籤緩存,一旦標籤緩存到期就去查詢對應的熱點key是否仍是熱點,並執行相應的操做。
  4. 將熱點key分散爲多個子key,而後存儲到緩存集羣的不一樣機器上,這些子key對應的value都和熱點key是同樣的。當經過熱點key去查詢數據時,經過某種hash算法隨機選擇一個子key,而後再去訪問緩存機器,將熱點分散到了多個子key上。

PS:緩存

  1. 文章來自各類資源的整理,若有侵權請告知刪除。
  2. 轉載本文請註明出處
相關文章
相關標籤/搜索