快取和資料庫一致性

2021-08-21 14:12:37 字數 878 閱讀 5370

對應比較常用的資料,比如鑑權資料一般會放在快取中(比如:redis),這樣能夠跟快的實現讀取,所以一般讀取流程如下:

目前網上有很多關於快取和資料庫怎麼保持一致性的文件,主要可以總結為如下幾點:

1、先更新資料庫,在更新快取;

2、先刪除快取,在更新資料庫;

3、先更新資料庫,在刪除快取;

下面將對著幾種機制作出說明:

一、先更新資料庫,再更新快取

這種方式如果在併發情況下可能會出現問題,比如執行緒a和執行緒b依次請求更新資料庫同一條資料:

1:執行緒a更新資料庫;

2:執行緒b更新資料庫;

3:執行緒b更新快取;

4:執行緒a更新快取。

這樣就會導致資料庫和快取不一致,出現髒資料。

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

這種方式也有可能存在問題,比如執行緒a請求查詢資料,執行緒b請求更新資料:

1:執行緒b刪除快取;

2:執行緒a查詢快取,因為不存在所以回到資料庫中查詢(這個值是執行緒b更新前的舊值),並快取;

3:執行緒b更新資料庫。

這樣也導致資料庫和快取不一致,出現髒資料。

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

這種情況也有可能出現髒資料,比如執行緒a請求查詢資料,執行緒b請求更新資料:

1:執行緒a讀取redis為空,並從資料庫中獲取舊資料;

2:執行緒b更新資料庫,並刪除快取;

3:執行緒a將舊資料寫入快取。

上面的這三種方式都可能導致髒資料,那麼怎麼解決呢?

1、對快取資料設定有效期

2、在上面的第二種修改為:先刪除快取,再更新資料庫,最後再刪除快取

資料庫和快取一致性

今天程式過程中突然想到了乙個問題,怎麼保證redis快取和mysql資料庫中的資料相同 一致性 即在更新資料時怎樣保證資料庫和redis快取始終相同。從理論上講,給快取設定過期時間是保證最終一致性的解決方案。這種方案下,所有寫操作以資料庫為準,對快取做最大努力即可。下面介紹的是不依賴於給快取設定過期...

快取與資料庫一致性

此時系統的讀寫流量很小,這個時候所有的讀寫操作都在主庫 此時,從庫的角色只是作為災備。風險分析 從資料一致性的角度來看沒有任何問題,所有讀寫操作都在主庫 隨著業務的前進和流量的激增,會出現大表和資料庫寫入效能下降的問題。我們可以通過分庫的方式,提公升資料庫單機的qps壓下來 通過分表的方式,降低單錶...

怎麼保證快取和資料庫資料的一致性?

選擇淘汰快取 選擇先淘汰快取,再更新資料庫 原因 假如先更新資料庫,再淘汰快取,假如快取淘汰失敗,那麼後面的請求都會得到髒資料,直至快取過期。假如先淘汰快取再更新資料庫,如果資料庫更新失敗,只會產生一次快取miss,相比較而言,後者對業務影響更小一點。如下場景 同時有乙個請求a進行更新操作,另乙個請...