這篇文章主要講解了“如何解決服務(wù)器端緩存失效的問(wèn)題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何解決服務(wù)器端緩存失效的問(wèn)題”吧!
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)平利,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575緩存失效情況舉例
看下這個(gè)段偽代碼:
代碼如下:
local value = get_from_cache(key)
if not value then
value = query_db(sql)
set_to_cache(value, timeout = 100)
end
return value
看上去沒(méi)有問(wèn)題,在單元測(cè)試情況下,也不會(huì)有異常。
但是,進(jìn)行壓力測(cè)試的時(shí)候,你會(huì)發(fā)現(xiàn),每隔100秒,數(shù)據(jù)庫(kù)的查詢就會(huì)出現(xiàn)一次峰值。如果你的cache失效時(shí)間設(shè)置的比較長(zhǎng),那么這個(gè)問(wèn)題被發(fā)現(xiàn)的機(jī)率就會(huì)降低。
為什么會(huì)出現(xiàn)峰值呢?想象一下,在cache失效的瞬間,如果并發(fā)請(qǐng)求有1000條同時(shí)到了 query_db(sql) 這個(gè)函數(shù)會(huì)怎樣?沒(méi)錯(cuò),會(huì)有1000個(gè)請(qǐng)求打向數(shù)據(jù)庫(kù)。這就是緩存失效瞬間引起的風(fēng)暴。它有一個(gè)英文名,叫 "dog-pile effect"。
怎么解決?自然的想法是發(fā)現(xiàn)緩存失效后,加一把鎖來(lái)控制數(shù)據(jù)庫(kù)的請(qǐng)求。具體的細(xì)節(jié),春哥在lua-resty-lock的文檔里面做了詳細(xì)的說(shuō)明,我就不重復(fù)了,請(qǐng)看這里。多說(shuō)一句,lua-resty-lock庫(kù)本身已經(jīng)替你完成了wait for lock的過(guò)程,看代碼的時(shí)候需要注意下這個(gè)細(xì)節(jié)。
傳統(tǒng)緩存失效應(yīng)對(duì)策略
為了提高業(yè)務(wù)訪問(wèn)速度,提升業(yè)務(wù)讀并發(fā),很多用戶都會(huì)在業(yè)務(wù)架構(gòu)中引入緩存層。業(yè)務(wù)所有讀請(qǐng)求全部路由到緩存層,通過(guò)緩存的內(nèi)存讀取機(jī)制大大提升業(yè)務(wù)讀取性能。緩存中的數(shù)據(jù)不能持久化 ,一旦緩存異常退出,那么內(nèi)存中的數(shù)據(jù)就會(huì)丟失,所以為了保證數(shù)據(jù)完整,業(yè)務(wù)的更新數(shù)據(jù)會(huì)落地到持久化存儲(chǔ)中,例如DB。目前云用戶的業(yè)務(wù)架構(gòu)一般如下圖:
在上圖中,大家可以看到,用戶的更新數(shù)據(jù)直接持久化到DB, 業(yè)務(wù)讀請(qǐng)求直接請(qǐng)求緩存數(shù)據(jù),所以業(yè)務(wù)需要解決緩存失效問(wèn)題,即解決因?yàn)閿?shù)據(jù)變更導(dǎo)致緩存中的數(shù)據(jù)失效的問(wèn)題。 目前業(yè)務(wù)解決緩存失效問(wèn)題的解決方法一般是業(yè)務(wù)實(shí)現(xiàn)DB、緩存雙寫(xiě)。通過(guò)業(yè)務(wù)雙寫(xiě)解決緩存失效,存在如下的問(wèn)題:
代碼侵入性比較強(qiáng),需要雙寫(xiě)兩份存儲(chǔ),任何對(duì)DB的數(shù)據(jù)變更,都需要同時(shí)更新緩存,代碼層面后期可維護(hù)程度不高
用戶請(qǐng)求線程里同步調(diào)用緩存,對(duì)緩存存在強(qiáng)以來(lái),遇到緩存超時(shí)等異常時(shí),沒(méi)有辦法做到有效的重試,遇到異常給用戶返回系統(tǒng)錯(cuò)誤、操作失敗等信息,嚴(yán)重影響用戶體驗(yàn)
用戶請(qǐng)求線程里同步完成DB、緩存雙寫(xiě),變更請(qǐng)求鏈路長(zhǎng),訪問(wèn)延遲大,影響用戶體驗(yàn)
RDS數(shù)據(jù)訂閱消費(fèi),輕松解決緩存失效
在阿里巴巴內(nèi)部同樣也遇到了緩存失效的問(wèn)題,隨著業(yè)務(wù)架構(gòu)得不斷調(diào)整優(yōu)化,我們已經(jīng)沉淀出一套高可靠、極優(yōu)雅得緩存失效架構(gòu)。即通過(guò)數(shù)據(jù)傳輸提供的數(shù)據(jù)訂閱功能,異步獲取DB(例如公共云上的RDS)的增量數(shù)據(jù),根據(jù)增量數(shù)據(jù)進(jìn)行緩存失效。具體的架構(gòu)類(lèi)似下圖:
在這個(gè)架構(gòu)里面,緩存更新流程如下:
1.業(yè)務(wù)完成DB更新后即返回請(qǐng)求
2.數(shù)據(jù)訂閱通過(guò)日志解析方式實(shí)時(shí)解析并訂閱DB的增量更新數(shù)據(jù),當(dāng)發(fā)現(xiàn)DB有數(shù)據(jù)更新時(shí),將增量數(shù)據(jù)推送給下游消費(fèi)者
3.下游消費(fèi)業(yè)務(wù)一旦接收到增量更新數(shù)據(jù),即調(diào)用消費(fèi)線程進(jìn)行緩存更新
至此完成整個(gè)緩存更新過(guò)程。
從上面的緩存失效流程,可以看出這種緩存失效機(jī)制:
1.更新路徑短,延遲低: 緩存失效為異步流程,業(yè)務(wù)更新DB完成后直接返回,不需要關(guān)心緩存失效流程,整個(gè)更新路徑短,更新延遲低
2.應(yīng)用簡(jiǎn)單可靠:應(yīng)用無(wú)需實(shí)現(xiàn)復(fù)雜雙寫(xiě)邏輯,只需啟動(dòng)異步線程監(jiān)聽(tīng)增量數(shù)據(jù),更新緩存數(shù)據(jù)即可
3.應(yīng)用更新無(wú)性能消耗:因?yàn)閿?shù)據(jù)訂閱是通過(guò)解析DB的增量日志來(lái)獲取增量數(shù)據(jù),獲取數(shù)據(jù)的過(guò)程對(duì)業(yè)務(wù)、DB性能無(wú)損
感謝各位的閱讀,以上就是“如何解決服務(wù)器端緩存失效的問(wèn)題”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何解決服務(wù)器端緩存失效的問(wèn)題這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
網(wǎng)頁(yè)題目:如何解決服務(wù)器端緩存失效的問(wèn)題-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://www.rwnh.cn/article30/dhhepo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、品牌網(wǎng)站設(shè)計(jì)、App開(kāi)發(fā)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容