Redis快取同步1-策略介紹

2023-07-09 12:01:17

他.png

快取資料同步策略示意圖

在大多數情況下,我們通過瀏覽器查詢到的資料都是快取資料,如果快取資料與資料庫的資料存在較大差異的話,可能會產生比較嚴重的後果的。所以,我們應該也必須保證資料庫資料、快取資料的一致性,這就是快取與資料庫的同步。

快取資料同步策略

快取資料同步,常見的有三種方式:

1:設定有效期 

給快取設定有效期,到期後自動刪除。再次查詢的時候,更新資料。

這種方式的優缺點及使用場景如下:

優點:簡單、方便、好理解;

缺點:時效性差,快取過期之前可能資料庫中的資料和快取中的資料就不一致了了。

使用場景:更新頻率低,時效性要求低的業務。

 2:同步雙

 

同步雙寫策略就是在修改資料庫的同時,也修改快取。

同步雙寫的優缺點:

優點:時效性強,快取與資料庫強一致;

缺點:有程式碼侵入,耦合度高;只要運算元據庫的插入、更新及刪除相關業務操作,就要去同步更新快取,這種耦合度太高了;

使用場景:對一致性、時效性要求較高的快取資料。

 3:非同步通知

 

非同步通知其實就是在修改了資料庫的時候,傳送時間通知,相關服務監聽到通知之後非同步的修改快取資料。

這種方式的優缺點:

優點:低耦合,可以同時通知多個快取服務。可以使用MQ,非同步特性來更新快取,這樣更新資料庫和更新快取就解耦了,而且一次可以更新多個服務,同時,程式碼入侵也是很少的(只有傳送MQ少量程式碼)甚至是零入侵就可以實現;

缺點:時效性一般,可能存在中間不一致的狀態。因為是非同步的,可能會存在時間差,導致資料在某一時刻,是不一致的。但是可以保證最終一致性

使用場景:時效性要求一般的,有多個服務需要同步更新快取的。

事實上,大多數場景下,我們都可以通過非同步通知這種策略來更新快取。所以,我們就來深入的講講非同步通知。

通常情況下,非同步通知實現方案,可以基於MQ或者是基於Canal來實現。

非同步通知的兩種方案

我們先來看看基於MQ非同步通知的流程

 

MQ非同步通知更新快取

 

我們以修改了商品後,更新對應的快取為例來講講。業務流程大致如下描述:

1:在頁面修改了商品資訊後,商品資訊入庫,儲存到MySQL資料庫中;

2:入庫成功後,釋出一個MQ訊息;

3:有個服務監聽對應MQ訊息,如果接收到訊息後,就更新對應商品的快取資訊

流程圖如下:

image.png

MQ非同步通知更新快取流程圖

這種方案,依然有少量的程式碼入侵:在寫完資料庫後,傳送MQ訊息,這點程式碼入侵是沒辦法省略的。

第二種方案,就是Canal通知

基於Canal的通知

基於Canal通知的業務流程如下圖:

image.png

基於Canal通知的業務流程圖

流程解讀:

1:商品服務完成商品修改後,商品資訊入庫後,相關業務直接結束。這裡沒有任何的程式碼入侵;

2:Canal監聽MySQL變化,當發現變化後,立即通知快取服務;

3:快取服務接收到canal通知後,更新快取

使用Canal的非同步通知是程式碼零侵入的。所以,這裡,咱們就選擇基於Canal的通知。接下來,我們就來講講Canal