快取,資料庫先操作那個都行

2021-10-20 04:54:01 字數 1778 閱讀 9218

快取刪除後,尚未更新資料庫,併發讀請求,從資料庫讀到了舊值,並且更新到快取導致後續請求都是舊值。

時間從上

到下,越來

越晚更新操作

刪除redis

讀取操作

快取沒有資料

從資料庫讀到舊值

回寫redis

更新mysql

返回返回

經典的延遲雙刪。就是:先更新資料線,再刪快取,之後延遲一段時間再刪快取。

時間從上

到下,越來

越晚更新操作

刪除redis

讀取操作

快取沒有資料

從資料庫讀到舊值

回寫redis

更新mysql

返回延遲一段時間

刪除redis

讀取操作

快取沒有資料

從資料庫讀到新值

回寫redis

返回延遲一段時間,挺重要不能拍腦袋,需要考慮2個因素

時間從上

到下,越來

越晚更新操作

刪除redis

讀取操作

快取沒有資料

從資料庫讀到舊值

更新mysql

延遲一段時間,

小於從資料讀取資料的時間,

延遲策略失效

刪除redis

回寫redis

返回自建mysql集群,配置不當,會出現mysql主從同步延遲大的情況。

時間從上

到下,越來

越晚更新操作

刪除redis

讀取操作

快取沒有資料

從資料庫讀到舊值

回寫redis

更新mysql主庫

返回延遲一段時間,

小於mysql主從同步時間

延遲策略失效

刪除redis

讀取操作

快取沒有資料

從庫讀到舊值

mysql主從同步完成

回寫redis

返回

延遲時間必須大於查詢介面的響應時間。

並且要大於mysql主從同步的時間,防止主從同步延遲造成,讀到舊值的情況

--- 溫安適 20210225

注意:建議查詢介面要從主庫進行讀取時間

從上到下,

越來越晚

更新操作

更新mysql主庫

讀取操作

快取有資料,讀到舊值

刪除redis

返回讀取操作

快取沒有資料

主庫讀到新值

回寫redis

返回等待快取刪除完成,期間資料庫會有不一致資料短暫存在,但是一般可以不處理。

策略

潛在問題

解決方式

注意事項

先刪快取,

再更資料庫

併發條件下

資料庫更新還沒有完成

有併發讀請求,從資料庫讀到了舊值

延遲雙刪

延遲時間必須

大於查詢介面的響應時間。

並且大於mysql主從同步的時間

先更資料庫,

再刪快取

併發條件下

快取沒有刪除完成,併發讀

從快取讀到了舊值

不處理,

最終會一致

查詢介面建議讀主庫,存在不一致,

但是一般不需處理

快取 先資料庫還是先快取 2

到底是先運算元據庫還是先操作快取,取決於哪種方案可以避免資料不一致,或者資料不一致的概率更低。下面的分析會基於cache aside策略展開,為什麼基於cache aside策略,請檢視博文 快取更新策略 先快取再資料庫的方案,在併發讀寫情況下,會出現資料不一致的情況,如下圖所示。而且,這種不一致情...

先刪快取還是先刪資料庫

在論壇上看到好多人說先刪除快取在更新資料庫,這種邏輯是錯誤的,第一種情況先刪快取在刪資料庫 在多執行緒環境下,當乙個執行緒把快取刪掉之後,另乙個執行緒都快取,都不到快取就會直接讀庫,讀到資料後就會更新快取,先前的執行緒呢,才更新資料庫,會造成快取髒讀的情況,很容易產生快取髒讀。第二種情況先刪資料庫再...

先刪資料庫還是先刪快取

先刪快取再刪資料庫 在高併發的情況下會導致快取擊穿 快取沒有執行緒全部訪問資料庫造成壓力過大 當第乙個執行緒進來刪除快取,第二個執行緒進來快取沒有查詢資料庫然後更新快取,第乙個執行緒更新資料庫,造成髒讀。先刪資料庫再刪快取 當乙個執行緒進來更新資料庫,另乙個執行緒進來讀取快取,然後第乙個執行緒更新快...