Redis緩存與數據庫一致性解決方案

背景

緩存是數據庫的副本,應用在查詢數據時,先從緩存中查詢,若是命中直接返回,若是未命中,去數據庫查詢最新數據並返回,同時寫入緩存。數據庫

緩存可以有效地加速應用的讀寫速度,同時也能夠下降後端負載。是應用架構中經常使用的一種技術。後端

問題

當業務發生時,系統狀態改變,須要同時修改數據庫和緩存的數據。如何保證應用從緩存讀取到最新的數據,且即便數據庫當即崩潰,數據也不丟失?這就是緩存與數據庫的一致性問題。緩存

分析

一個系統狀態同時存在於緩存和數據庫,緩存是數據庫的副本,數據庫能夠讀和寫,把緩存的寫看做是讀緩存未命中的一部分,則緩存只有讀。只要保證數據庫的寫對緩存的可見性,就能保證它們的一致性。架構

解決方案

讀緩存分佈式

  1. 若是命中直接返回。
  2. 若是未命中
  3. 獲取key對應的分佈式鎖
  4. 讀數據庫
  5. 返回結果並更新緩存
  6. 釋放key對應的分佈式鎖

寫數據庫class

  1. 獲取緩存key對應的分佈式鎖
  2. 操做緩存刪除鍵
  3. 修改數據庫
  4. 釋放緩存key對應的分佈式鎖

總結

在系統狀態不變時,緩存與數據庫是一致的。在系統狀態變化時,經過分佈式鎖串行化對狀態的讀寫。寫時先讓緩存(即數據庫副本)失效,只需保證數據庫自己的更新;寫後的讀操做恢復緩存。即狀態變化過程當中,只有數據庫保存狀態,沒有副本,數據是一致的。技術

相關文章
相關標籤/搜索