并發(fā)環(huán)境下,先操作數(shù)據(jù)庫還是先操作緩存?
前言
在分布式系統(tǒng)中,緩存和數(shù)據(jù)庫同時存在時,如果有寫操作,先操作數(shù)據(jù)庫還是先操作緩存呢?本文將分5種方案展開闡述對比,謝謝閱讀~
緩存維護方案一
如果是一讀(線程B)一寫(線程A)操作,「先操作緩存,再操作數(shù)據(jù)庫」。流程圖如下所示:

1.線程A發(fā)起一個寫操作,第一步del cache
2.線程A第二步寫入新數(shù)據(jù)到DB 3.線程B發(fā)起一個讀操作,cache miss緩存失效了。 4.線程B從DB獲取最新數(shù)據(jù) 5.線程B執(zhí)行set cache,把從DB讀到的數(shù)據(jù),更新到緩存。

1.線程A發(fā)起一個寫操作,第一步del cache 2.此時線程B發(fā)起一個讀操作,cache miss 3.線程B繼續(xù)讀DB,讀出來一個老數(shù)據(jù) 4.然后老數(shù)據(jù)設置入cache 5.線程A寫入DB最新的數(shù)據(jù)
?
緩存維護方案二

1.線程A發(fā)起一個寫操作,第一步set cache 2.線程A第二步寫入新數(shù)據(jù)到DB 3.線程B發(fā)起一個寫操作,set cache 4.線程B第二步寫入新數(shù)據(jù)到DB

1.線程A發(fā)起一個寫操作,第一步set cache 2.線程B發(fā)起一個寫操作,第一步set cache 3.線程B寫入數(shù)據(jù)庫到DB 4.線程A寫入數(shù)據(jù)庫到DB
?
緩存維護方案三

1.線程A發(fā)起一個寫操作,第一步write DB 2.線程A第二步del cache 3.線程B發(fā)起一個讀操作,cache miss 4.線程B從DB獲取最新數(shù)據(jù) 5.線程B同時set cache
?
緩存維護方案四

?
緩存維護方案五

緩存維護總結
1.讀取緩存中是否有相關數(shù)據(jù) 2.如果緩存中有相關數(shù)據(jù)value,則返回 3.如果緩存中沒有相關數(shù)據(jù),則從數(shù)據(jù)庫讀取相關數(shù)據(jù)放入緩存中key->value,再返回 4.如果有更新寫數(shù)據(jù),則先操作數(shù)據(jù)庫,再操作緩存 5.為了保證第四步更新緩存成功,使用binlog異步通知操作 6.如果是主從數(shù)據(jù)庫,binglog取自于從庫 7.如果是一主多從,每個從庫都要采集binlog,然后消費端收到最后一臺binlog數(shù)據(jù)才刪除緩存
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
評論
圖片
表情
