快取和資料庫一致性問題解決方案

2021-10-20 19:37:24 字數 1151 閱讀 1389

快取是減輕資料庫壓力的一種解決辦法,不過要做到快取和資料庫資料一致性。

快取設定過期時間,是保證資料最終一致性的辦法,我們也要盡量保證使用時候的一致性。

一般不使用先更新快取再更新資料庫的方式,如果快取更新成功而資料庫更新失敗,那肯定不行

那基本就還剩如下三種

1)先更新資料庫,再更新快取

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

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

依次分析

方法一:先更新資料庫,再更新快取

這種方法其實還有很多專案在這麼用,不過是最糟糕的選項。

1、a更新資料庫資料為a

2、b更新資料庫資料為b

3、b更新快取資料為b

4、a更新快取資料為a

最終,資料庫資料為b,而快取資料為a

方法二:先刪除快取,再更新資料庫

更新資料庫之前先把快取刪除,由第一次的查詢操作來新增快取,不過也會導致不一致性

1、a刪除快取

2、b查詢快取未查到

3、b查詢資料庫為b,並更新快取

4、a修改資料庫為a

最終,資料庫資料為a,而快取資料為b

有個延時策略可以解決這個方法,就是在更新資料庫之後,定時任務(例如1s後)執行刪除快取,把這期間儲存的快取資料刪除掉

方法三:先更新資料庫,再刪除快取

其實方法二的延時策略就有這個影子,不過也不是一定沒問題,在快取恰好失效時候有風險

1、快取失效

2、a未查找到快取,查詢資料庫

3、b更新資料庫

4、b刪除快取

5、a更新快取

不過這種情況發生的概率極低,因為更新資料庫的時間大多比查詢資料庫的時間長,所以基本上的執行順序都是2-5-3-4或者2-3-5-4

實在放心不下,繼續使用延時策略

如果刪除快取出現異常呢,這個時候可以把刪除快取的工作放到訊息佇列

redis快取一致性問題解決方案

使用快取來儲存熱點資料是應對高併發的常用手段之一,通過使用快取,大大減輕了資料庫的壓力,同時減少了響應請求的時間。但是引入快取之後,隨之而來的問題就是當db資料更新時,快取中的資料就會與db資料不一致,這時候就需要對快取的資料進行更新或者淘汰快取,這篇文章就是分析各種處理快取一致性問題的解決方案。更...

Redis與資料庫一致性問題解決方案

1 先刪快取,再更新資料庫 該方案會導致不一致的原因是。同時有乙個請求a進行更新操作,另乙個請求b進行查詢操作。那麼會出現如下情形 1 請求a進行寫操作,刪除快取 2 請求b查詢發現快取不存在 3 請求b去資料庫查詢得到舊值 4 請求b將舊值寫入快取 5 請求a將新值寫入資料庫 上述情況就會導致不一...

快取和資料庫一致性問題分析

問題 如何保證快取和資料庫雙寫的一致性 一般來說,如果允許快取可以稍微的跟資料庫偶爾有不一致的情況,也就是說如果你的系統不是嚴格要求 快取 資料庫 必須保持一致性的話,最好不要做這個方案,即 讀請求和寫請求序列化,串到乙個記憶體佇列裡去。序列化可以保證一定不會出現不一致的情況,但是它也會導致系統的吞...