redis快取與資料庫一致性問題

2022-03-28 02:38:13 字數 1016 閱讀 5140

不一致產生的原因

我們在使用redis過程中,通常會這樣做:先讀取快取,如果快取不存在,則讀取資料庫。偽**如下:

object stuobj = new

object();

public

stu getstufromcache(string key)}}

return

stu;

}

寫資料庫的偽**如下:

public

void

setstu()

不管是先寫庫,再刪除快取;還是先刪快取,再寫庫,都有可能出現資料不一致的情況因為寫和讀是併發的,沒法保證順序,如果刪了快取,還沒有來得及寫庫,另乙個執行緒就來讀取,發現快取為空,則去資料庫中讀取資料寫入快取,此時快取中為髒資料。如果先寫了庫,再刪除快取前,寫庫的執行緒宕機了,沒有刪除掉快取,則也會出現資料不一致情況。 如果是redis集群,或者主從模式,寫主讀從,由於redis複製存在一定的時間延遲,也有可能導致資料不一致。優化思路

雙刪加超時

在寫庫前後都進行redis.del(key)操作,並且設定合理的超時時間。這樣最差的情況是在超時時間內存在不一致,當然這種情況極其少見,可能的原因就是服務宕機。此種情況可以滿足絕大多數需求。 當然這種策略要考慮redis和資料庫主從同步的耗時,所以在第二次刪除前最好休眠一定時間,比如500毫秒,這樣毫無疑問又增加了寫請求的耗時

非同步淘汰快取

通過讀取binlog的方式,非同步淘汰快取。

好處:業務**侵入性低,將快取與資料庫不一致的時間盡可能縮小。

redis快取與資料庫一致性

實時同步 對強制性要求比較高的,應採用實時同步方案,先查詢快取若查詢不到再去db中查詢,然後儲存到快取 更新快取時,先更新資料庫,再將快取的設定過期 建議不要去更新快取內容,直接設定快取過期 1.cacheable 查詢時使用,注意long型別需要轉化為string型別,否則會拋棄異常 2.cach...

快取與資料庫一致性

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

Redis快取與資料庫資料一致性

寫流程 先刪除快取,刪除之後再更新db,再非同步將資料刷回快取。如果先更新資料庫再更新快取,更新資料庫時,程式訪問快取時還是舊的資料。讀流程 先讀快取,如果快取沒讀到,則去讀db,之後再非同步將資料刷回快取。缺點 容災不足 第一步del快取失敗 如果繼續執行,那麼從 更新完db 到非同步 重新整理快...