緩存與數據庫一致問題

問題

如果數據庫的數據在redis中有一份緩存,那么數據修改時,就需要在分布系統中的兩個獨立點同步修改。由于整個操作不是原子的,無論先修改哪一個,都會有短暫的不一致。

由此帶來另外兩個問題:1. 存在并發時,非原子操作可能引入并發問題。2. 如果修改操作的兩步中,后一步失敗,那么也會造成緩存與數據庫的不一致。

如何解決(強一致)?

要解決原子操作的不一致問題,只能通過鎖來解決 。將兩步操作通過鎖變為原子操作。我們可以使用redis,為每個key構造分布鎖。
具體流程如下:

  • 讀取時將數據與鎖一同返回,如果發現數據未加鎖,則認為當前數據有效。
  • 讀取時,如果發現已經上了寫鎖,則重試。
  • 寫數據時,首先嘗試加鎖。此鎖鎖定1秒時間。如果加鎖成功,開始更新數據庫。無論更新失敗或者成功都解鎖。如果成功,同時使緩存過期。
  • 寫數據時,如果加鎖失敗。則重試。
  • 如果加鎖成功,更新數據庫成功,但是解鎖失敗,那么鎖將在1s后自動解鎖。

存在的缺點

  • 在正常的流程中,如果寫操作過于頻繁,那么大量的讀操作、寫操作會被阻塞。
  • 在最壞的情況下,某個key可能會被鎖超過1s。

其它方法

如果對一致性要求不高,那么在寫庫之前,可以先設置key為1s后過期,再更新數據庫。如果更新key失敗,則重試。更新數據庫完成后,設置key過期。如果設置過期失敗,那么數據最多有1s不一致。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容