此問題是無法做到100%場景一致性的,只能做到基本一致或者最終一致性。 推薦使用的方案 延時雙刪 原理:先進行緩存清除,再執行update,最後(延遲N秒)再執行緩存清除。(延遲N秒)的時間要大於一次寫操作的時間。 一般執行流程: 服務節點刪除 redis 主庫數據。 服務節點修改 mysql 主庫 ...
此問題是無法做到100%場景一致性的,只能做到基本一致或者最終一致性。
推薦使用的方案
延時雙刪
原理:先進行緩存清除,再執行update,最後(延遲N秒)再執行緩存清除。(延遲N秒)的時間要大於一次寫操作的時間。
一般執行流程:
- 服務節點刪除 redis 主庫數據。
- 服務節點修改 mysql 主庫數據。
- 服務節點使得當前業務處理 等待一段時間,等 redis 和 mysql 主從節點數據同步成功。
- 服務節點從 redis 主庫刪除數據。
- 當前或其它服務節點讀取 redis 從庫數據,發現 redis 從庫沒有數據,從 mysql 從庫讀取數據,並寫入 redis 主庫。
基於MQ的可靠性消息通信
具體步驟如下:
- 把要刪除的緩存值或者是要更新的資料庫值暫存到消息隊列MQ中
- 當刪除緩存值或者是更新資料庫值成功時,把這些值從消息隊列中去除,以免重覆操作。
- 當刪除緩存值或者是更新資料庫值失敗時,執行失敗策略,重試服務從消息隊列中重新讀取這些值,然後再次進行刪除或更新。
- 刪除或者更新失敗時,需要再次進行重試,重試超過的一定次數。向業務層發送報錯信息。
canal組件
原理:監控mysql主庫的binlog日誌,把更新後的數據同步到redis中。
使用Binlog實時更新/刪除Redis緩存。利用Canal,即將負責更新緩存的服務偽裝成一個MySQL的從節點,從MySQL接收Binlog,解析Binlog之後,得到實時的數據變更信息,然後根據變更信息去更新刪除Redis緩存。