快取資料同步策略示意圖
在大多數情況下,我們通過瀏覽器查詢到的資料都是快取資料,如果快取資料與資料庫的資料存在較大差異的話,可能會產生比較嚴重的後果的。所以,我們應該也必須保證資料庫資料、快取資料的一致性,這就是快取與資料庫的同步。
快取資料同步,常見的有三種方式:
給快取設定有效期,到期後自動刪除。再次查詢的時候,更新資料。
這種方式的優缺點及使用場景如下:
優點:簡單、方便、好理解;
缺點:時效性差,快取過期之前可能資料庫中的資料和快取中的資料就不一致了了。
使用場景:更新頻率低,時效性要求低的業務。
同步雙寫策略就是在修改資料庫的同時,也修改快取。
同步雙寫的優缺點:
優點:時效性強,快取與資料庫強一致;
缺點:有程式碼侵入,耦合度高;只要運算元據庫的插入、更新及刪除相關業務操作,就要去同步更新快取,這種耦合度太高了;
使用場景:對一致性、時效性要求較高的快取資料。
非同步通知其實就是在修改了資料庫的時候,傳送時間通知,相關服務監聽到通知之後非同步的修改快取資料。
這種方式的優缺點:
優點:低耦合,可以同時通知多個快取服務。可以使用MQ,非同步特性來更新快取,這樣更新資料庫和更新快取就解耦了,而且一次可以更新多個服務,同時,程式碼入侵也是很少的(只有傳送MQ少量程式碼)甚至是零入侵就可以實現;
缺點:時效性一般,可能存在中間不一致的狀態。因為是非同步的,可能會存在時間差,導致資料在某一時刻,是不一致的。但是可以保證最終一致性
使用場景:時效性要求一般的,有多個服務需要同步更新快取的。
事實上,大多數場景下,我們都可以通過非同步通知這種策略來更新快取。所以,我們就來深入的講講非同步通知。
通常情況下,非同步通知實現方案,可以基於MQ或者是基於Canal來實現。
我們先來看看基於MQ非同步通知的流程
我們以修改了商品後,更新對應的快取為例來講講。業務流程大致如下描述:
1:在頁面修改了商品資訊後,商品資訊入庫,儲存到MySQL資料庫中;
2:入庫成功後,釋出一個MQ訊息;
3:有個服務監聽對應MQ訊息,如果接收到訊息後,就更新對應商品的快取資訊
流程圖如下:
MQ非同步通知更新快取流程圖
這種方案,依然有少量的程式碼入侵:在寫完資料庫後,傳送MQ訊息,這點程式碼入侵是沒辦法省略的。
第二種方案,就是Canal通知基於Canal通知的業務流程如下圖:
基於Canal通知的業務流程圖
流程解讀:
1:商品服務完成商品修改後,商品資訊入庫後,相關業務直接結束。這裡沒有任何的程式碼入侵;
2:Canal監聽MySQL變化,當發現變化後,立即通知快取服務;
3:快取服務接收到canal通知後,更新快取
使用Canal的非同步通知是程式碼零侵入的。所以,這裡,咱們就選擇基於Canal的通知。接下來,我們就來講講Canal
本文來自部落格園,作者:kaizi1992,轉載請註明原文連結:https://www.cnblogs.com/kaigejava/p/17538300.html