快取層與資料庫層資料同步
阿新 • • 發佈:2021-11-01
在實際的業務開發中,為了避免大量請求直接操作資料庫,我們會用redis做一個快取層,使用者的資料庫請求先在redis中查詢,查詢的到就返回,查詢不到再從資料庫取資料更新快取,然後返回。
這就涉及到了快取層與資料庫層之間如何保持資料一致的問題。
一、旁路快取方案
寫操作時,先修改資料庫,再刪除相關快取。
之所以要刪除快取而不是更新,主要是基於:
有些快取更新涉及多個表之間的複雜操作,頻繁進行會消耗效能。不刪快取,每次更新資料庫都要計算一次,而刪除快取後,快取的計算只會在下一次請求到來時才會進行。
這個方案的缺點是當刪除快取失敗時,客戶會讀到舊資料,直到下一次資料更新
二、雙寫一致方案
先刪除快取,再更新資料庫
先將快取刪掉,就避免了使用者讀到舊資料
這個方案的缺點是:如果資料庫更新失敗,使用者讀到的仍然是舊資料,但不會出現不一致;如果在資料庫更新完成之前來了請求,快取仍然會載入到舊資料,產生不一致
三、延時雙刪方案
先刪除快取,再更新資料庫, 更新成功後非同步再刪一次快取
這樣保證了資料庫更新成功後,快取中的資料在一定時間後一定是更新後的資料。
缺點是:資料更新成功到第二次快取刪除成功之間的較短時間內,使用者可能讀到舊資料。
總結
三種方案都不能稱作完美,具體使用時按需選用,對資料一致要求較高,就選擇延時雙刪;對資料一致性要求不高且併發量不高,就選擇雙寫一致或旁路快取。