mysql和Redis資料不一致的解決辦法
阿新 • • 發佈:2020-07-16
1、mysql和redis資料讀寫不一致?
業務場景
從理論上來說,給快取設定過期時間,是保證最終一致性的終極解決方案。這種方案下,我們可以對存入快取的資料設定過期時間,所有的寫操作以資料庫為準,對快取操作只是盡最大努力即可。也就是說如果資料庫寫成功,快取更新失敗,那麼只要到達過期時間,則後面的讀請求自然會從資料庫中讀取新值然後回填快取。因此,接下來討論的思路不依賴於給快取設定過期時間這個方案。
採用延時雙刪策略
程式碼如下
publicvoid use(Stringkey,Objectdata){ redis.delKey(key); db.updateData(data); Thread.sleep(800); redis.delKey(key); }
轉化為中文描述就是
(1)先淘汰快取
(2)再寫資料庫(這兩步和原來一樣)
(3)休眠800ms,再次淘汰快取
這麼做,可以將800ms內所造成的快取髒資料,再次刪除。
那麼,這個時間怎麼確定的,具體該休眠多久呢?
針對上面的情形,讀者應該自行評估自己的專案的讀資料業務邏輯的耗時。然後寫資料的休眠時間則在讀資料業務邏輯的耗時基礎上,加幾百ms即可。這麼做的目的,就是確保讀請求結束,寫請求可以刪除讀請求造成的快取髒資料。