保持資料庫和redis的資料一致性大致有兩種方案:
一:先刪除快取,再更新資料庫
該方案會導致不一致的原因是。同時有乙個請求a進行更新操作,另乙個請求b進行查詢操作。那麼會出現如下情形:
上述情況就會導致不一致的情形出現。而且,如果不採用給快取設定過期時間策略,該資料永遠都是髒資料。
解決方案:採用延時雙刪策略
二:先更新資料庫,再刪除快取
假設這會有兩個請求,乙個請求a做查詢操作,乙個請求b做更新操作,那麼會有如下情形產生
ok,如果發生上述情況,確實是會發生髒資料
發生上述情況有乙個先天性條件,就是步驟(3)的寫資料庫操作比步驟(2)的讀資料庫操作耗時更短,才有可能使得步驟(4)先於步驟(5)。可是,大家想想,資料庫的讀操作的速度遠快於寫操作的(不然做讀寫分離幹嘛,做讀寫分離的意義就是因為讀操作比較快,耗資源少),因此步驟(3)耗時比步驟(2)更短,這一情形很難出現。
三:最佳解決方案:
方案一
先做乙個說明,從理論上來說,給快取設定過期時間,是保證最終一致性的解決方案。這種方案下,我們可以對存入快取的資料設定過期時間,所有的寫操作以資料庫為準,對快取操作只是盡最大努力即可。也就是說如果資料庫寫成功,快取更新失敗,那麼只要到達過期時間,則後面的讀請求自然會從資料庫中讀取新值然後回填快取。
方案二
redis裡的資料總是不過期,但是有個背景更新任務(「定時執行的**」 或者 「被佇列驅動的**)讀取db,把最新的資料塞給redis。這種做法將redis看作是「儲存」。訪問者不知道背後的實際資料來源,只知道redis是唯一可以取的資料的地方。當實際資料來源更新時,背景更新任務來將資料更新到redis。這時還是會存在redis和實際資料來源不一致的問題。如果是定時任務,最長的不一致時長就是更新任務的執行間隔;如果是用類似於佇列的方式來更新,那麼不一致時間取決於佇列產生和消費的延遲。常用的佇列(或等價物)有redis(怎麼還是redis),kafka,amq,rmq,binglog,log檔案,阿里的canal等。
注意,沒有所謂的最佳解決方案,針對不同的業務場景我們自主選擇不同的方案,不大可能達到十全十美
redis和mysql怎樣保持資料一致
服務端獲取資料首先從redis獲取,如果redis中的資料被刪除就從mysql中獲取資料,在把資料更新到redis 1.redis設定固定時間更新,時間不宜太長,缺點是修改mysql資料不會立即更新 2.更新mysql時同時刪除redis的資料,但這個操作不是原子性的,如果這個時候有其他執行緒插進來...
Redis和MySQL中資料一致性問題
二 解決辦法?1 單庫情況下發生不一致的情況 同一時刻發生了併發讀寫請求,例如a是寫,b是讀。1 a請求傳送乙個寫操作到服務端,第一步先淘汰快取,但是因為一些原因卡住了。2 b請求傳送乙個讀操作,讀取快取,因為快取淘汰,所以b會請求資料庫,但是因為a還沒有更新,讀取的是髒資料。3 a請求執行完成,寫...
如何保證Redis和MySQL資料一致性
如何保證redis和mysql資料一致性,這個問題真的是面試問的最多的乙個問題了,所以總結一下,類似的問題,比如如何保證es和mysql的資料一致性,凡是涉及到資料多個地方讀寫,有資料一致性的需求和同步操作,以下總結的方法都可考慮。redis和mysql資料一致性說的是,redis作為快取,必須保持...