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

A請(qǐng)求發(fā)送一個(gè)寫操作到服務(wù)端,第一步會(huì)淘汰cache,然后因?yàn)楦鞣N原因卡主了,不在執(zhí)行后面業(yè)務(wù)(例:大量的業(yè)務(wù)操作、調(diào)用其他服務(wù)處理消耗了1s)。
B請(qǐng)求發(fā)送一個(gè)讀操作,讀cache,因?yàn)閏ache淘汰,所以為空
B請(qǐng)求繼續(xù)讀DB,讀出一個(gè)臟數(shù)據(jù),并寫入cache
A請(qǐng)求終于執(zhí)行完全,在寫入數(shù)據(jù)到DB
總結(jié):因最后才把寫操作數(shù)據(jù)入DB,并沒(méi)同步。cache里面一直保持臟數(shù)據(jù)
臟數(shù)據(jù)是指源系統(tǒng)中的數(shù)據(jù)不在給定的范圍內(nèi)或?qū)τ趯?shí)際業(yè)務(wù)毫無(wú)意義,或是數(shù)據(jù)格式非法,以及在源系統(tǒng)中存在不規(guī)范的編碼和含糊的業(yè)務(wù)邏輯。
二、主從同步,讀寫分離的情況下,讀從庫(kù)而產(chǎn)生臟數(shù)據(jù)

A請(qǐng)求發(fā)送一個(gè)寫操作到服務(wù)端,第一步會(huì)淘汰cache
A請(qǐng)求寫主數(shù)據(jù)庫(kù),寫了最新的數(shù)據(jù)。
B請(qǐng)求發(fā)送一個(gè)讀操作,讀cache,因?yàn)閏ache淘汰,所以為空
B請(qǐng)求繼續(xù)讀DB,讀的是從庫(kù),此時(shí)主從同步還沒(méi)同步成功。讀出臟數(shù)據(jù),然后臟數(shù)據(jù)入cache
最后數(shù)據(jù)庫(kù)主從同步完成
總結(jié):這種情況下請(qǐng)求A和請(qǐng)求B操作時(shí)序沒(méi)問(wèn)題,是主從同步的時(shí)延問(wèn)題(假設(shè)1s),導(dǎo)致讀請(qǐng)求讀取從庫(kù)讀到臟數(shù)據(jù)導(dǎo)致的數(shù)據(jù)不一致
根本原因:
單庫(kù)下,邏輯處理中消耗1s,可能讀到舊數(shù)據(jù)入緩存
主從+讀寫分離,在1s的主從同步時(shí)延中,到從庫(kù)的舊數(shù)據(jù)入緩存
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級(jí)工廠來(lái)了
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動(dòng)更多
-
即日-5.20立即下載>> 【限時(shí)免費(fèi)】物理場(chǎng)仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測(cè)未來(lái)·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會(huì)
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國(guó)機(jī)器人產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國(guó)機(jī)器人行業(yè)年度評(píng)選
-
精彩回顧立即查看>> 【在線會(huì)議】液冷服務(wù)器信號(hào)完整性及冷卻液關(guān)鍵電參數(shù)測(cè)試
推薦專題
- 1 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實(shí)測(cè):中文穩(wěn)、細(xì)節(jié)炸,設(shè)計(jì)師慌了
- 3 6000億美元估值錨定:字節(jié)跳動(dòng)的“去單一化”突圍與估值重構(gòu)
- 4 Tesla AI5芯片最新進(jìn)展總結(jié)
- 5 連夜測(cè)了一波DeepSeek-V4,我發(fā)現(xiàn)它可能只剩“審美”這個(gè)短板了
- 6 熱點(diǎn)丨AI“瑜亮之爭(zhēng)”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫(kù)跑路,全員被封號(hào),還繼續(xù)扣錢!
- 8 2026,人形機(jī)器人只贏了面子
- 9 DeepSeek降價(jià)90%:價(jià)格屠夫不是身份,是戰(zhàn)略
- 10 AI Infra產(chǎn)業(yè)鏈卡在哪里了?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





