先刪資料庫還是先刪快取

2021-10-05 12:26:09 字數 872 閱讀 2102

先刪快取再刪資料庫:

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

先刪資料庫再刪快取:

當乙個執行緒進來更新資料庫,另乙個執行緒進來讀取快取,然後第乙個執行緒更新快取,造成髒讀。

異常:

以上情況都沒有考慮到異常情況,比如快取更新失敗資料庫更新失敗。可以做補償機制。redis也可以做事務處理。

結論:

第一種方式會造成長時間的髒讀(通過別的地方了解到延時雙刪策略就是先刪除快取再更新資料庫然後等一段時間在刪除快取,問題是這個一段時間的確定)和快取擊穿,第二種會造成短時間的髒讀。一般情況下會用第二種,目前還沒遇到高要求的系統。

快取擊穿:

快取沒有執行緒全部訪問資料庫造成壓力過大。

解決方案:

給key設定預設值和失效時間。

檢查失效時間,每次get出來後對比失效時間,比如小於1分鐘更新快取。

查詢資料庫和更新快取加鎖(吞吐量下降第乙個執行緒進來快取沒有進行更新上鎖,第二個執行緒先進行重試拿快取有返回,沒有sleep,然後再重試拿鎖)

快取雪崩:

快取同一時間的失效,所以,後面的請求全部訪問資料庫,造成資料庫短時間內承受大量請求而崩掉。

解決方案:

將快取有效時間均勻散開。

雙快取,第二個快取有效時間長,第乙個執行緒進來沒有快取加鎖設定快取,其他執行緒沒有鎖讀取另乙個快取。

先刪快取還是先刪資料庫

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

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

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

先更新快取還是先更新資料庫?

該模式是從資料倉儲中將資料載入到快取中,從而提高訪問速度的一種模式。該模式可以有效的提高效能,同時也能一定程度上保證快取中的資料和資料倉儲中的資料的一致性,和同步資料到資料倉儲中。1 讀請求常見流程 最佳實踐 應用首先會判斷快取是否有該資料,快取命中直接返回資料,快取未命中即快取穿透到資料庫,從資料...