如何保持MySQL和Redis的一致性

如今,Mysql+ Redis已經成爲了一種常用的數據庫架構方式,但由於種種原因,總會導致Redis和Mysql之間出現一系列的數據不一致的問題。

例如,一個事務首先寫入了Mysql,但還未寫入Redis,這是用戶訪問Redis,就會造成數據不一致。

爲了解決這種問題,本文總結了兩個方法,儘可能的去達到MySql和Redis之間的數據一致性。

1. 保持數據最終一致性

針對一些對數據一致性要求不是特別高的情況下,像排行榜、近期回覆數據。DB更新後,Redis不立即更新,等待鍵值自然過期,然後去DB裏取的同時set redis。或者在DB更新時,馬上刪掉Redis key,都可以保證數據的最終一致性。

2. 保持數據強一致性

而針對一些我們對數據一致性要求比較高的數據,並且處於高併發情況下的一些數據,我們需要保證它們的強一致性,主要有兩種做法:
刪除redis key
這種方法是,每當一個數據庫更新操作時,我們需要直接把redis的key刪除,然後去更新Mysql數據庫。並且在休眠500ms(根據具體業務確定)後,再次刪除Redis key。這樣是爲了避免在寫未完成的這段時間內,有併發讀操作讀了mysql中的髒數據,寫入了redis中,造成了redis中的一個髒數據。所以我們要給再次刪除一遍redis中的key。

基於訂閱binlog的異步更新緩存
當MySql做出修改刪除變更時,會在binlog日誌中記錄。我們可以使用一些消息隊列做一個訂閱(例如阿里發佈的開源框架canal,提供了一種發佈/訂閱模式的同步機制)。通過消息隊列我們對mysql的binlog進行訂閱,這樣一旦mysql中產生了增刪改等操作,我們就可以把binlog相關的消息推送給redis,redis再根據binlog中的記錄,對Redis進行更新。(類似Mysql主從備份機制

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