Redis和MySQL中資料一致性問題

2021-10-09 22:34:38 字數 1476 閱讀 9613

二、解決辦法?

1、單庫情況下發生不一致的情況

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

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

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

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

2、主從同步、讀寫分離的情況下,讀從庫而產生資料不一致
1、a傳送乙個寫操作到服務端,第一步先淘汰快取

2、a請求寫主資料庫,完成了資料的更新

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

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

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

1、單庫情況下的解決方案

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

1、採用延時雙刪策略

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

2、mysql持久化資料,redis唯讀資料

redis在啟動之後,從資料庫載入資料。

讀請求:

不要求強一致性的讀請求,走redis,要求強一致性的直接從mysql讀取

寫請求:

資料首先都寫到資料庫,之後更新redis(先寫redis再寫mysql,如果寫入失敗事務回滾會造成redis中存在髒資料)

2、讀寫分離下的解決方案

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

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

2、借助redis來解決

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

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

本人也是個菜雞,關於redis和資料庫的一致性問題感覺網上說的是五花八門,沒有乙個統一的說法,我也只是整理了一下我比較認同的方法,可能也是錯的。。。。

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

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

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...

redis和mysql怎樣保持資料一致

服務端獲取資料首先從redis獲取,如果redis中的資料被刪除就從mysql中獲取資料,在把資料更新到redis 1.redis設定固定時間更新,時間不宜太長,缺點是修改mysql資料不會立即更新 2.更新mysql時同時刪除redis的資料,但這個操作不是原子性的,如果這個時候有其他執行緒插進來...