首頁  >  文章  >  資料庫  >  redis如何與mysql保持一致性

redis如何與mysql保持一致性

清浅
清浅原創
2019-05-08 13:37:5810084瀏覽

redis與mysql保持一致性的方法有兩種,分別是:1、在寫庫前後都進行【redis.del(key)】操作,並且設定合理的超時時間;2、通過基於訂閱binlog的同步機制實作redis與mysql保持一致性。

redis如何與mysql保持一致性

redis與mysql保持一致性的方法有採取延時雙刪策略,先刪除快取再寫資料庫;第二種方法是異步更新緩存,先讀取讀Redis再寫mysql再更新Redis資料

快取與資料庫一致性解決方案如下:

##方法一:採用延時雙刪策略

在寫函式庫前後都進行redis.del(key)操作,並且設定合理的逾時時間。

偽代碼如下

public void write(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); }

具體的步驟就是:

(1)先刪除快取

(2)再寫資料庫

(3)休眠500毫秒

(4)再次刪除快取

那麼,這個500毫秒怎麼確定的,具體該休眠多久呢?

需要評估自己的專案的讀取資料業務邏輯的耗時。這麼做的目的,就是確保讀取請求結束,寫入請求可以刪除讀取請求造成的快取髒資料。

當然這種策略還要考慮redis和資料庫主從同步的耗時。最後的的寫入資料的休眠時間:則在讀取資料業務邏輯的耗時基礎上,加幾百ms即可。如:休眠1秒。

設定快取過期時間

從理論上來說,給快取設定過期時間,是保證最終一致性的解決方案。所有的寫入操作以資料庫為準,只要到達快取過期時間,則後面的讀取請求自然會從資料庫讀取新值然後回填快取。

該方案的弊端

結合雙刪策略快取逾時設置,這樣最差的情況就是在逾時時間內資料存在不一致,而且又增加了寫入請求的耗時。

方法二:非同步更新快取(基於訂閱binlog的同步機制)

#技術整體思路:

MySQL binlog增量訂閱消費訊息佇列增量資料更新到redis

1)讀Redis:熱資料基本上都在Redis

2)寫MySQL:增刪改都是操作MySQL

3)更新Redis資料:MySQ的資料操作binlog,來更新到Redis

#Redis更新

(1)資料操作主要分為兩大塊:

一個是全量(將全部資料一次寫入到redis)一個是增量(即時更新)

這裡說的是增量,指的是mysql的update、insert、delate變更數據。

(2)讀取binlog後分析 ,利用訊息佇列,推播更新各台的redis快取資料。

這樣一旦MySQL中產生了新的寫入、更新、刪除等操作,就可以把binlog相關的訊息推送至Redis,Redis再根據binlog中的記錄,對Redis進行更新。

其實這種機制,很類似MySQL的主從備份機制,因為MySQL的主備也是透過binlog來實現的資料一致性。

這裡可以結合使用canal(阿里的一個開源框架),透過這個框架可以對MySQL的binlog進行訂閱,而canal正是模仿了mysql的slave資料庫的備份請求,使得Redis的資料更新達到了相同的效果。

當然,這裡的訊息推播工具你也可以採用別的第三方:kafka、rabbitMQ等來實作推播更新Redis

以上是redis如何與mysql保持一致性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn