<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一道之前的面試題:
如何保證快取和資料庫的一致性?
下面介紹幾種方案(大家回答的時候最好根據自己的業務,結合下面的方案)
更新快取策略方式常見的有下面幾種:
下面一一介紹!
這種方式可輕易排除,因為如果先更新快取成功,但是資料庫更新失敗,則肯定會造成資料不一致。
這種快取更新策略俗稱雙寫,存在問題是:並行更新資料庫場景下,會將髒資料刷到快取
updateDB(); updateRedis();
舉例:如果在兩個操作之間資料庫和快取又被後面請求修改,此時再去更新快取已經是過期資料了。
存在問題:更新資料庫之前,若有查詢請求,會將髒資料刷到快取
deleteRedis(); updateDB();
舉例:如果在兩個操作之間發生了資料查詢,那麼會有舊資料放入快取。
該方案會導致請求資料不一致
如果同時有一個請求A進行更新操作,另一個請求B進行查詢操作。那麼會出現如下情形:
上述情況就會導致不一致的情形出現。而且,如果不採用給快取設定過期時間策略,該資料永遠都是髒資料。
存在問題:在更新資料庫之前有查詢請求,並且快取失效了,會查詢資料庫,然後更新快取。如果在查詢資料庫和更新快取之間進行了資料庫更新的操作,那麼就會把髒資料刷到快取
updateDB(); deleteRedis();
舉例:如果在查詢資料庫和放入快取這兩個操作中間發生了資料更新並且刪除快取,那麼會有舊資料放入快取。
假設有兩個請求,一個請求A做查詢操作,一個請求B做更新操作,那麼會有如下情形產生
如果發生上述情況,確實是會發生髒資料。但是發生上述情況有一個先天性條件,就是寫資料庫操作比讀資料庫操作耗時更短
不過資料庫的讀操作的速度遠快於寫操作的
因此這一情形很難出現。
方案1和方案2的共同缺點:
並行更新資料庫場景下,會將髒資料刷到快取,但一般並行寫的場景概率都相對小一些;
執行緒安全形度,會產生髒資料,比如:
方案3和方案4的共同缺點:
不管採用哪種順序,2種方式都是存在一些問題的:
問題解決思路:延遲雙刪,新增重試機制,下面介紹!
更新快取還是刪除快取?
刪除快取優點:簡單、成本低,容易開發;缺點:會造成一次cache miss
如果更新快取開銷較小並且讀多寫少,基本不會有寫並行的時候可以才用更新快取,否則通用做法還是刪除快取。
方案 | 問題 | 問題出現概率 | 推薦程度 |
---|---|---|---|
更新快取 -> 更新資料庫 | 為了保證資料準確性,資料必須以資料庫更新結果為準,所以該方案絕不可行 | 大 | 不推薦 |
更新資料庫 -> 更新快取 | 並行更新資料庫場景下,會將髒資料刷到快取 | 並行寫場景,概率一般 | 寫請求較多時會出現不一致問題,不推薦使用。 |
刪除快取 -> 更新資料庫 | 更新資料庫之前,若有查詢請求,會將髒資料刷到快取 | 並行讀場景,概率較大 | 讀請求較多時會出現不一致問題,不推薦使用 |
更新資料庫 -> 刪除快取 | 在更新資料庫之前有查詢請求,並且快取失效了,會查詢資料庫,然後更新快取。如果在查詢資料庫和更新快取之間進行了資料庫更新的操作,那麼就會把髒資料刷到快取 | 並行讀場景&讀操作慢於寫操作,概率最小 | 讀操作比寫操作更慢的情況較少,相比於其他方式出錯的概率小一些。勉強推薦。 |
採用更新前後雙刪除快取策略
public void write(String key,Object data){ redis.del(key); db.update(data); Thread.sleep(1000); redis.del(key); }
大家應該評估自己的專案的讀資料業務邏輯的耗時。然後寫資料的休眠時間則在讀資料業務邏輯的耗時基礎上即可。
這麼做的目的,就是確保讀請求結束,寫請求可以刪除讀請求造成的快取髒資料。
問題及解法:
1、同步刪除,吞吐量降低如何處理
將第二次刪除作為非同步的,提交一個延遲的執行任務
2、解決刪除失敗的方式:
新增重試機制,例如:將刪除失敗的key,寫入訊息佇列;但對業務耦合有些嚴重;
延時工具可以選擇:
最普通的阻塞Thread.currentThread().sleep(1000);
Jdk排程執行緒池,quartz定時任務,利用jdk自帶的delayQueue,netty的HashWheelTimer,Rabbitmq的延時佇列,等等
我們有個商品中心的場景,是讀多寫少的服務,並且寫資料會傳送MQ通知下游拿資料,這樣就需要嚴格保證快取和資料庫的一致性,需要提供高可靠的系統服務能力。
關於快取過期時間的問題
如果快取設定了過期時間,那麼上述的所有不一致情況都只是暫時的。
但是如果沒有設定過期時間,那麼不一致問題就只能等到下次更新資料時解決。
所以一定要設定快取過期時間。
到此這篇關於Java快取一致性問題的文章就介紹到這了,更多相關Java快取一致性內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45