redis與mysql保持一致性的方法有兩種,分別是:1、在寫庫前後都進行【redis.del(key)】操作,並且設定合理的超時時間;2、通過基於訂閱binlog的同步機制實作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增量訂閱消費訊息佇列增量資料更新到redis1)讀Redis:熱資料基本上都在Redis2)寫MySQL:增刪改都是操作MySQL3)更新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中文網其他相關文章!