上億高并發(fā),如何保證緩存與數(shù)據(jù)庫的雙寫一致性
【內(nèi)容聲明】文章部分內(nèi)容源于互聯(lián)網(wǎng),僅作參考!如需咨詢“上億高并發(fā),如何保證緩存與數(shù)據(jù)庫的雙寫一致性”等有關(guān)服務(wù)器、云主機租用、托管、配置、價格問題,請立即咨詢YINGSOO客服,為您答疑解惑!
【推薦主機】法國物理服務(wù)器 | 美國高防服務(wù)器 | 美國站群服務(wù)器
【常見問題】日本云服務(wù)器怎么樣?日本云服務(wù)器與香港云服務(wù)器對比
現(xiàn)在將高速緩存應(yīng)用于業(yè)務(wù)當中已經(jīng)十分常見了,甚至可能跟數(shù)據(jù)庫的頻率不相上下。你的用戶量如果上去了,直接將一個裸的 MySQL 去扛住所有壓力明顯是不合理的。這里的高速緩存,目前業(yè)界主流的就是 Redis 了,如何保證緩存與數(shù)據(jù)庫的雙寫一致性?
你只要用緩存,就可能會涉及到緩存與數(shù)據(jù)庫雙存儲雙寫,你只要是雙寫,就一定會有數(shù)據(jù)一致性的問題,那么你如何解決一致性問題?
上億高并發(fā),如何保證緩存與數(shù)據(jù)庫的雙寫一致性?
1、最初級的緩存不一致問題以及解決方案
問題:先修改數(shù)據(jù)庫,再刪除緩存,如果刪除緩存失敗了,那么會導(dǎo)致數(shù)據(jù)庫中是新數(shù)據(jù),緩存中是舊數(shù)據(jù),數(shù)據(jù)出現(xiàn)不一致。
解決思路:
先刪除緩存,再修改數(shù)據(jù)庫,如果刪除緩存成功了修改數(shù)據(jù)庫失敗了,那么數(shù)據(jù)庫中是舊數(shù)據(jù),緩存中是空的,那么數(shù)據(jù)不會不一致,因為讀的時候緩存沒有,則讀數(shù)據(jù)庫中舊數(shù)據(jù),然后更新到緩存中。
2、并發(fā)下數(shù)據(jù)緩存不一致問題分析
問題:
第一個請求數(shù)據(jù)發(fā)生變更,先刪除了緩存,然后要去修改數(shù)據(jù)庫,此時還沒來得及去修改;
第二個請求過來去讀緩存,發(fā)現(xiàn)緩存空了,去查詢數(shù)據(jù)庫,查到了修改前的舊數(shù)據(jù),放到了緩存中;
第三個請求讀取緩存中的數(shù)據(jù) (此時第一個請求已經(jīng)完成了數(shù)據(jù)庫修改的操作)。
完了,數(shù)據(jù)庫和緩存中的數(shù)據(jù)不一樣了。。。。
問題分析:
只有在對同一條數(shù)據(jù)并發(fā)讀寫的時候,才可能會出現(xiàn)這種問題。其實如果說你的并發(fā)量很低的話,特別是讀并發(fā)很低,每天訪問量就1萬次,那么很少的情況下,會出現(xiàn)剛才描述的那種不一致的場景;但如果每天的是上億的流量,每秒并發(fā)讀是幾萬,每秒只要有數(shù)據(jù)更新的請求,就可能會出現(xiàn)上述的數(shù)據(jù)庫+緩存不一致的情況。
解決思路:
數(shù)據(jù)庫的緩存更新與讀取操作進行串行化,一個隊列對應(yīng)一個工作線程,每個工作線程串行拿到對應(yīng)的操作,然后一條一條的執(zhí)行。
1. 首先我們的項目里維護一組線程池和內(nèi)存隊列。
2. 更新數(shù)據(jù)的時候,根據(jù)數(shù)據(jù)的唯一標識將請求路由到一個jvm隊列中,去更新數(shù)據(jù)庫,然后請求結(jié)束。
3. 讀取數(shù)據(jù)的時候,先查緩存,如果發(fā)現(xiàn)數(shù)據(jù)不在緩存中,那么將根據(jù)唯一標識路由之后,也發(fā)送同一個jvm內(nèi)部的隊列中,重新讀取數(shù)據(jù)庫后更新緩存,最后請求結(jié)束。
這里有一個需要優(yōu)化的點,比如一個隊列中,連續(xù)存在多個更新緩存請求串在一起是沒意義的,這樣重復(fù)的查詢數(shù)據(jù)庫并更新緩存的操作應(yīng)該優(yōu)化:如果發(fā)現(xiàn)隊列中已經(jīng)有一個更新緩存的請求了,那么就不用再放個更新請求操作進去了,直接讓后面的讀請求阻塞個200ms左右(這里只是舉個例子,實際值可以根據(jù)服務(wù)的響應(yīng)時間和機器的處理能力來計算),然后再次查詢緩存,如果緩存沒有值就查數(shù)據(jù)庫,拿到結(jié)果后不用更新緩存,直接返回給頁面即可。
高并發(fā)解決方案:
優(yōu)惠產(chǎn)品:香港云服務(wù)器租用去首頁注冊領(lǐng)券!YINGSOO最新推出Bzz蜂群挖礦服務(wù)器、Bzz蜂群母雞服務(wù)器、Swarm Bzz挖礦教程【圖文教程】、Swarm Bzz挖礦教程【視頻教程】,《swarm bzz挖礦資料大全》,Bzz節(jié)點租用請咨詢YINGSOO客服!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。