如何保證緩存與數(shù)據(jù)庫雙寫時的數(shù)據(jù)一致性?
21、如何解決Redis的并發(fā)競爭Key問題
所謂 Redis 的并發(fā)競爭 Key 的問題也就是多個系統(tǒng)同時對一個 key 進行操作,但是最后執(zhí)行的順序和我們期望的順序不同,這樣也就導致了結果的不同!
推薦一種方案:分布式鎖(zookeeper 和 Redis 都可以實現(xiàn)分布式鎖)。(如果不存在 Redis 的并發(fā)競爭 Key 問 題,不要使用分布式鎖,這樣會影響性能)
基于zookeeper臨時有序節(jié)點可以實現(xiàn)的分布式鎖。大致思想為:每個客戶端對某個方法加鎖時,在zookeeper上的 與該方法對應的指定節(jié)點的目錄下,生成一個唯一的瞬時有序節(jié)點。判斷是否獲取鎖的方式很簡單,只需要判斷有 序節(jié)點中序號最小的一個。當釋放鎖的時候,只需將這個瞬時節(jié)點刪除即可。同時,其可以避免服務宕機導致的鎖 無法釋放,而產(chǎn)生的死鎖問題。完成業(yè)務流程后,刪除對應的子節(jié)點釋放鎖。
在實踐中,當然是從以可靠性為主。所以首推Zookeeper。
22、如何保證緩存與數(shù)據(jù)庫雙寫時的數(shù)據(jù)一致性
首先說一句,你只要用緩存,就可能會涉及到緩存與數(shù)據(jù)庫雙存儲雙寫,你只要是雙寫,就一定會有數(shù)據(jù)一致性的問題,那么你如 何解決一致性問題?
一般來說,就是如果你的系統(tǒng)不是嚴格要求緩存+數(shù)據(jù)庫必須一致性的話,緩存可以稍微的跟數(shù)據(jù)庫偶爾有不一致的 情況,最好不要做這個方案,最好將讀請求和寫請求串行化,串到一個內(nèi)存隊列里去,這樣就可以保證一定不會出現(xiàn)不一致的情況。
串行化之后,就會導致系統(tǒng)的吞吐量會大幅度的降低,用比正常情況下多幾倍的機器去支撐線上的一個請求。
最經(jīng)典的緩存+數(shù)據(jù)庫讀寫的模式,就是 預留緩存模式Cache Aside Pattern。
讀的時候,先讀緩存,緩存沒有的話,就讀數(shù)據(jù)庫,然后取出數(shù)據(jù)后放入緩存,同時返回響應。更新的時候,先刪除緩存,然后再更新數(shù)據(jù)庫,這樣讀的時候就會發(fā)現(xiàn)緩存中沒有數(shù)據(jù)而直接去數(shù)據(jù)庫中拿數(shù)據(jù)了。(因為要刪除,狗日的編輯器可能會背著你做一些優(yōu)化,要徹底將緩存中的數(shù)據(jù)進行刪除才行)
互聯(lián)網(wǎng)公司非常喜歡問這道面試題因為緩存在互聯(lián)網(wǎng)公司使用非常頻繁
在高并發(fā)的業(yè)務場景下,數(shù)據(jù)庫的性能瓶頸往往都是用戶并發(fā)訪問過大。所以,一般都使用Redis做一個緩沖操作,讓請求先訪問到Redis,而不是直接去訪問MySQL等數(shù)據(jù)庫,從而減少網(wǎng)絡請求的延遲響應。
23、數(shù)據(jù)為什么會出現(xiàn)不一致的情況?
這樣的問題主要是在并發(fā)讀寫訪問的時候,緩存和數(shù)據(jù)相互交叉執(zhí)行。
一、單庫情況下
同一時刻發(fā)生了并發(fā)讀寫請求,例如為A(寫) B (讀)2個請求
A請求發(fā)送一個寫操作到服務端,第一步會淘汰cache,然后因為各種原因卡主了,不在執(zhí)行后面業(yè)務(例:大量的業(yè)務操作、調(diào)用其他服務處理消耗了1s)。
B請求發(fā)送一個讀操作,讀cache,因為cache淘汰,所以為空
B請求繼續(xù)讀DB,讀出一個臟數(shù)據(jù),并寫入cache
A請求終于執(zhí)行完全,在寫入數(shù)據(jù)到DB
總結:因最后才把寫操作數(shù)據(jù)入DB,并沒同步。cache里面一直保持臟數(shù)據(jù)
臟數(shù)據(jù)是指源系統(tǒng)中的數(shù)據(jù)不在給定的范圍內(nèi)或對于實際業(yè)務毫無意義,或是數(shù)據(jù)格式非法,以及在源系統(tǒng)中存在不規(guī)范的編碼和含糊的業(yè)務邏輯。
二、主從同步,讀寫分離的情況下,讀從庫而產(chǎn)生臟數(shù)據(jù)
A請求發(fā)送一個寫操作到服務端,第一步會淘汰cache
A請求寫主數(shù)據(jù)庫,寫了最新的數(shù)據(jù)。
B請求發(fā)送一個讀操作,讀cache,因為cache淘汰,所以為空
B請求繼續(xù)讀DB,讀的是從庫,此時主從同步還沒同步成功。讀出臟數(shù)據(jù),然后臟數(shù)據(jù)入cache
最后數(shù)據(jù)庫主從同步完成
總結:這種情況下請求A和請求B操作時序沒問題,是主從同步的時延問題(假設1s),導致讀請求讀取從庫讀到臟數(shù)據(jù)導致的數(shù)據(jù)不一致
根本原因:
單庫下,邏輯處理中消耗1s,可能讀到舊數(shù)據(jù)入緩存
主從+讀寫分離,在1s的主從同步時延中,到從庫的舊數(shù)據(jù)入緩存

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
10月23日火熱報名中>> 2025是德科技創(chuàng)新技術峰會
-
10月23日立即報名>> Works With 開發(fā)者大會深圳站
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評選
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產(chǎn)未來的關鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術在線大會
-
11月28日立即下載>> 【白皮書】精準洞察 無線掌控——283FC智能自檢萬用表
- 1 特斯拉工人被故障機器人打成重傷,索賠3.6億
- 2 【行業(yè)深度研究】退居幕后四年后,張一鳴終于把算法公司變成AI公司?
- 3 AI 時代,阿里云想當“安卓” ,那誰是“蘋果”?
- 4 拐點已至!匯川領跑工控、埃斯頓份額第一、新時達海爾賦能扭虧為盈
- 5 L3自動駕駛延期,逼出車企技術自我淘汰
- 6 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 7 谷歌“香蕉”爆火啟示:國產(chǎn)垂類AI的危機還是轉機?
- 8 00后華裔女生靠兩部AI電影狂賺7.8億人民幣,AI正式進軍好萊塢
- 9 機器人9月大事件|3家國產(chǎn)機器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 10 市值暴漲千億,這潑天富貴終于輪到百度了
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市