對應比較常用的資料,比如鑑權資料一般會放在快取中(比如: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進行更新操作,另乙個請...