Redis和MySQL中資料一致性的問題

2021-10-10 06:05:41 字數 1301 閱讀 5109

二、解決辦法?

同一時刻發生了併發讀寫請求,例如a是寫,b是讀。

1.a請求傳送乙個寫操作到服務端,第一步先淘汰快取,因為一些原因卡住了。

2.b請求傳送乙個讀操作,讀取快取,因為快取淘汰,所以b會請求資料庫,但是因為a還沒有更新,讀取的是髒資料。

3.a請求執行完成,寫操作完成。但是快取中還是舊資料,後面的讀操作讀到的將都會是舊資料,這就造成了資料不一致。

1.a傳送乙個寫操作到服務端,第一步先淘汰快取。

2.a請求寫資料庫,完成資料的更新

3.b發起乙個讀操作,讀快取,快取淘汰,會從資料庫中讀取資料。

4.但是可能由於網路波動或其他因素,主從同步還沒同步成功,所以b就是讀出髒資料,放到快取中。造成資料不一致

根本原因:就是主從同步延遲導致的

不管是先更新mysql資料庫,在刪除redis快取;還是先刪除快取,在更新資料庫,都會發生資料不一致的情況。

1.如果先刪除快取,再更新資料庫:但是萬一在更新資料庫操作時出現了問題,導致還沒來得及更新的時候,另乙個執行緒就來讀取,發現快取為空,則去資料庫中讀取並寫入快取,此時快取中就是髒資料。

2.如果先寫庫,但是萬一快取刪除失敗了,沒有刪除掉快取,則也會出現資料不一致。

採用延時雙刪策略

在更新資料庫前後都進行刪除快取的操作,並且設定合理的超時時間。

1.先刪除快取;

2.更新資料庫;

3.休眠500毫秒;

4.再次刪除快取;

1.簡單粗暴法,使用主庫讀寫

直接對主庫進行讀寫,這樣就不會存在主從同步的延時性問題,也就不會出現資料的不一致,但是這種方法破壞了讀寫分離的初衷,只能想想。

2.借助redis來解決

首先分析下:主從分離不一致根本原因就是主從同步有延遲,同步頻率(主庫多長時間更新一次資料到從庫)是配置資料庫主從同步時可以配置的,那麼我們預設讓它1秒鐘同步一次,那麼這種延遲導致資料不一致就是發生在這一秒鐘之內的未同步而已。

解決辦法

可以使用redis,主庫在發生更新時,可以先將要更新的資料放到redis中,並且設定過期時間為1秒;從庫查詢時先按照key去redis中查詢,如果存在(可能還沒同步成功)則讀取主庫,如果不存在,則說明資料已經同步到了從庫直接查詢從庫即可

如何保持mysql和redis中資料的一致性

快取由於其高併發和高效能的特性,已經在專案中被廣泛使用。在讀取快取方面,大家沒啥疑問,都是按照下圖的流程來進行業務操作。在快取和資料庫同時存在時,如果有寫操作的時候,先運算元據庫還是先操作快取呢?先思考一下,可能會存在哪些問題,再往下看。這套方案,大家是普遍反對的。為什麼呢?有如下兩點原因。3.1....

Redis和MySQL中資料一致性問題

二 解決辦法?1 單庫情況下發生不一致的情況 同一時刻發生了併發讀寫請求,例如a是寫,b是讀。1 a請求傳送乙個寫操作到服務端,第一步先淘汰快取,但是因為一些原因卡住了。2 b請求傳送乙個讀操作,讀取快取,因為快取淘汰,所以b會請求資料庫,但是因為a還沒有更新,讀取的是髒資料。3 a請求執行完成,寫...

docker中安裝mysql和Redis

此處的映象倉庫為阿里雲映象倉庫,配置詳見阿里雲映象加速配置 docker pull mysql 5.7sudo docker run p 3306 3306 name mysql v mydata mysql log var log mysql v mydata mysql data var lib...