隨著技術發展,現在項目技術選型不像從前那樣單一的,特別是在高並發場景下的項目,都是多種技術配套著來使用。在以前,對於用戶數據無論是增刪改查,我們都是直接操作資料庫的,但在高並發場景下這樣做顯然是不合理的,於是乎我們在DB層之前加上Cache層,以此來緩解DB層的壓力。

在業界通常是將MySQL作為數據最終落地的存儲方案,而用Redis來緩存熱點數據。一般是讀數據是從Redis中讀取,增刪改則是操作MySQL。但是這樣會存在一個問題,即:讀操作和寫操作是並發的,執行順序無法保證,這樣很容易出現緩存數據與資料庫中的數據不一致。

舉例說明一下:

  • 假設我們更新了資料庫後,緩存一直沒有失效,那我們從緩存中讀取的就是臟數據。

  • 假設緩存中的數據不存在,我們從資料庫中讀取數據然後存入緩存,此時資料庫剛好更新,那在緩存期間內,這個緩存數據就是臟數據。

如何避免Redis和MySQL中數據一致性問題呢?結合我的經驗給出一些方案供大家參考:

1、首先確定你的業務是否要求緩存和資料庫之間是強一致性關係

如果你的業務要求資料庫和緩存之間是強一致性,那你要做的就是確保每次更新了MySQL後就同步更新Redis;

如果不需要強一致性,那我們合理控制好緩存的TTL即可。

2、藉助MQ消息來更新緩存

大概思路是,資料庫的每一次修改操作後,我們通過MQ來生產一條消息,然後消費者對應去清理緩存Key並重新寫入。


以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!


要看應用場景,數據變動頻繁的環境中,使用讀緩存是毫無意義的,反而加重系統負荷,因為要花費額外資源維護緩存和數據源的一致性。

其實redis可以當作資料庫的元數據使用,設計好數據結構就是一個簡單的關係型庫,業務數據完全放到redis中運行,MySQL當作後備庫使用。redis也有持久化機制而且很容易做鏡像,因此可以在很大時間粒度上進行數據同步,比如一天同步一次。而業務層只操作redis,與資料庫完全剝離,即使資料庫掛掉也不會導致業務中斷。


推薦閱讀:
相關文章