快取是減輕資料庫壓力的一種解決辦法,不過要做到快取和資料庫資料一致性。
給快取設定過期時間,是保證資料最終一致性的辦法,我們也要盡量保證使用時候的一致性。
一般不使用先更新快取再更新資料庫的方式,如果快取更新成功而資料庫更新失敗,那肯定不行
那基本就還剩如下三種
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將新值寫入資料庫 上述情況就會導致不一...
快取和資料庫一致性問題分析
問題 如何保證快取和資料庫雙寫的一致性 一般來說,如果允許快取可以稍微的跟資料庫偶爾有不一致的情況,也就是說如果你的系統不是嚴格要求 快取 資料庫 必須保持一致性的話,最好不要做這個方案,即 讀請求和寫請求序列化,串到乙個記憶體佇列裡去。序列化可以保證一定不會出現不一致的情況,但是它也會導致系統的吞...