1. 程式人生 > 其它 >快取層與資料庫層資料同步

快取層與資料庫層資料同步

快取層與資料庫層資料同步問題

在實際的業務開發中,為了避免大量請求直接操作資料庫,我們會用redis做一個快取層,使用者的資料庫請求先在redis中查詢,查詢的到就返回,查詢不到再從資料庫取資料更新快取,然後返回。

這就涉及到了快取層與資料庫層之間如何保持資料一致的問題。

一、旁路快取方案

寫操作時,先修改資料庫,再刪除相關快取。

之所以要刪除快取而不是更新,主要是基於:

有些快取更新涉及多個表之間的複雜操作,頻繁進行會消耗效能。不刪快取,每次更新資料庫都要計算一次,而刪除快取後,快取的計算只會在下一次請求到來時才會進行。

這個方案的缺點是當刪除快取失敗時,客戶會讀到舊資料,直到下一次資料更新

二、雙寫一致方案

先刪除快取,再更新資料庫

先將快取刪掉,就避免了使用者讀到舊資料

這個方案的缺點是:如果資料庫更新失敗,使用者讀到的仍然是舊資料,但不會出現不一致;如果在資料庫更新完成之前來了請求,快取仍然會載入到舊資料,產生不一致

三、延時雙刪方案

先刪除快取,再更新資料庫, 更新成功後非同步再刪一次快取

這樣保證了資料庫更新成功後,快取中的資料在一定時間後一定是更新後的資料。

缺點是:資料更新成功到第二次快取刪除成功之間的較短時間內,使用者可能讀到舊資料。

總結

三種方案都不能稱作完美,具體使用時按需選用,對資料一致要求較高,就選擇延時雙刪;對資料一致性要求不高且併發量不高,就選擇雙寫一致或旁路快取。

當然, 如果要追求完美的資料一致性,就必須使用序列請求,但這會大幅度削減網路吞吐量。