新聞中心
There are only two hard things in Computer Science: cache invalidation and naming things.

成都創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供牡丹網(wǎng)站建設(shè)、牡丹做網(wǎng)站、牡丹網(wǎng)站設(shè)計(jì)、牡丹網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、牡丹企業(yè)網(wǎng)站模板建站服務(wù),十余年牡丹做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
計(jì)算機(jī)科學(xué)中有兩件難事:緩存失效和命名
– Phil Karlton
From Martin Fowler : TwoHardThings
緩存系統(tǒng)一定程度上極大提升系統(tǒng)并發(fā)能力,但同樣也增加額外技術(shù)考慮因素,下面針對(duì)緩存系統(tǒng)設(shè)計(jì)與使用中面臨的常見(jiàn)問(wèn)題展開(kāi)。
- 緩存應(yīng)用的典型場(chǎng)景
- 緩存雪崩
- 緩存穿透
- 緩存更新與數(shù)據(jù)一致性
緩存應(yīng)用的典型場(chǎng)景
請(qǐng)求->緩存->***緩存則返回?cái)?shù)據(jù)->無(wú)緩存則讀取原始數(shù)據(jù)源
緩存定位 :前置數(shù)據(jù)加載,避免數(shù)據(jù)回源,提供高性能、高并發(fā)的數(shù)據(jù)讀取能力;只有未***緩存時(shí)才進(jìn)行數(shù)據(jù)回源,極大減輕原始數(shù)據(jù)讀取的壓力
緩存分類(lèi) :按緩存系統(tǒng)所處位置不同,分為本地緩存、分布式緩存
- 本地緩存:內(nèi)存級(jí)緩存、文件級(jí)緩存,內(nèi)存級(jí)緩存優(yōu)勢(shì)在于本地內(nèi)存I/O、高性能(單次內(nèi)存尋址100ns),缺點(diǎn)在于空間有限,無(wú)法多端數(shù)據(jù)同步,此類(lèi)方案有PHP的Opcache/Yac, Java中Encache/GuavaCache/SpringCache等;文件級(jí)緩存依賴(lài)磁盤(pán)I/O實(shí)現(xiàn)緩存作用,受機(jī)械磁盤(pán)尋道性能限制(單次磁盤(pán)讀取時(shí)間10ms左右),或考慮固態(tài)硬盤(pán)/Raid優(yōu)化方案,較少使用
- 分布式緩存:Memcached、Redis等,分布式系統(tǒng)解決緩存容量問(wèn)題,具備持續(xù)擴(kuò)容能力,但不可避免一次網(wǎng)絡(luò)I/O請(qǐng)求
本文主要討論 分布式緩存 系統(tǒng)設(shè)計(jì)與使用中面臨的問(wèn)題。
緩存雪崩
定義: 緩存雪崩是指緩存系統(tǒng)失效,導(dǎo)致大量請(qǐng)求同時(shí)進(jìn)行數(shù)據(jù)回源,導(dǎo)致數(shù)據(jù)源壓力驟增而崩潰 。兩種情況會(huì)導(dǎo)致此問(wèn)題:1、多個(gè)緩存數(shù)據(jù)同時(shí)失效;2、緩存系統(tǒng)崩潰
緩存同時(shí)失效
- 在大量緩存同時(shí)失效的情況下,請(qǐng)求回源,導(dǎo)致數(shù)據(jù)源請(qǐng)求暴增而崩潰,系統(tǒng)全局不可用
- 緩存時(shí)間設(shè)置原則:根據(jù) 緩存數(shù)據(jù)訪(fǎng)問(wèn)規(guī)律和緩存數(shù)據(jù)不一致的敏感性 要求來(lái)選擇緩存時(shí)間
- 緩存數(shù)據(jù)訪(fǎng)問(wèn)規(guī)律:如不同緩存數(shù)據(jù)訪(fǎng)問(wèn)無(wú)規(guī)律或相對(duì)離散,則不會(huì)存在這些緩存數(shù)據(jù)同時(shí)失效的情況;如 緩存數(shù)據(jù)為批量寫(xiě)入 (定時(shí)任務(wù)預(yù)熱),應(yīng)考慮將 緩存時(shí)間離散化 ,避免同時(shí)失效的情況下大量回源請(qǐng)求
- 緩存數(shù)據(jù)不一致的敏感性:不同應(yīng)用場(chǎng)景下對(duì)緩存數(shù)據(jù)的一致性要求不同,緩存時(shí)間的設(shè)置視情況而定
- 這里也涉及到緩存更新策略問(wèn)題,錯(cuò)誤的更新策略可能會(huì)先刪除緩存,再設(shè)置緩存,此時(shí)間差范圍內(nèi)的請(qǐng)求會(huì)進(jìn)行回源,會(huì)導(dǎo)致此問(wèn)題
如何避免應(yīng)考慮: 緩存失效時(shí)間離散化
緩存系統(tǒng)故障
緩存系統(tǒng)整體故障,則整個(gè)緩存系統(tǒng)不可用,大量回源請(qǐng)求,且由于緩存系統(tǒng)故障無(wú)法回寫(xiě)緩存,導(dǎo)致無(wú)法快速恢復(fù)。
一句老話(huà):為解決一個(gè)問(wèn)題,引入新的解決方案,同時(shí)也必然引入新的問(wèn)題。
這也是緩存系統(tǒng)的引入,在解決高性能、高并發(fā)的同時(shí),引入了新的故障點(diǎn)。
考慮此問(wèn)題,應(yīng)從事前、事故中、事后不同階段考慮:
- 事前:增加緩存系統(tǒng) 高可用方案設(shè)計(jì) ,避免出現(xiàn)系統(tǒng)性故障
- 事故中:
熔斷限流機(jī)制
- 事后:緩存 數(shù)據(jù)持久化 ,在故障后 快速恢復(fù) 緩存系統(tǒng)
緩存穿透
定義: 緩存穿透是指訪(fǎng)問(wèn)不存在數(shù)據(jù),從而繞過(guò)緩存,直取數(shù)據(jù)源(大量數(shù)據(jù)源讀取操作)
解決緩存穿透的思路:
- 不存在資源訪(fǎng)問(wèn)時(shí),在緩存系統(tǒng)設(shè)置空值來(lái)攔截
- 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單
- 問(wèn)題:大量非法請(qǐng)求時(shí),緩存系統(tǒng)被填充大量非法值
- 根據(jù)資源設(shè)置攔截機(jī)制(布隆過(guò)濾器bloomfilter或壓縮filter過(guò)濾有效資源,如有效用戶(hù)id等;也可以全局保存有效資源摘要,專(zhuān)用過(guò)濾、防穿透)
- 優(yōu)點(diǎn):緩存系統(tǒng)空間利用較好
- 問(wèn)題:過(guò)濾器實(shí)現(xiàn)機(jī)制和數(shù)據(jù)一致性要求
緩存更新與數(shù)據(jù)一致性
緩存系統(tǒng)數(shù)據(jù)的更新策略是需要專(zhuān)門(mén)開(kāi)題來(lái)說(shuō)的,建議閱讀 左耳朵耗子:緩存更新的套路 系統(tǒng)了解,這里只根據(jù)實(shí)際經(jīng)驗(yàn)給出在不同一致性要求下的建議。
一種常見(jiàn)緩存更新策略(此方案有問(wèn)題):
- 讀操作:***緩存則返回,無(wú)緩存則取回源數(shù)據(jù),寫(xiě)緩存
- 寫(xiě)操作:先刪除緩存,再更新數(shù)據(jù)源
問(wèn)題場(chǎng)景:讀寫(xiě)并發(fā)的場(chǎng)景下先刪緩存操作可能導(dǎo)致臟數(shù)據(jù)入緩存
- 寫(xiě)操作:刪除緩存
- 讀操作:無(wú)緩存則取回源數(shù)據(jù)(舊數(shù)據(jù)),回寫(xiě)緩存(此時(shí)緩存中為舊數(shù)據(jù))
- 寫(xiě)操作:更新數(shù)據(jù)源
- 此時(shí)緩存數(shù)據(jù)不一致:緩存中為舊數(shù)據(jù),數(shù)據(jù)源為新數(shù)據(jù),出現(xiàn)緩存舊數(shù)據(jù)問(wèn)題
幾種更新緩存的策略:
- Cache Aside Pattern:緩存失效時(shí)回源取數(shù)據(jù),更新緩存;***緩存時(shí),返回緩存數(shù)據(jù);先數(shù)據(jù)源更新后,再失效緩存(由等待下次讀取來(lái)回寫(xiě)緩存)
- 優(yōu)勢(shì):無(wú)緩存舊數(shù)據(jù)問(wèn)題、緩存系統(tǒng)維護(hù)簡(jiǎn)單、Facebook推薦方案
- 問(wèn)題:無(wú)法絕對(duì)杜絕并發(fā)讀寫(xiě)問(wèn)題
- 緩存過(guò)期的背景下,讀操作回源取數(shù)據(jù)(此時(shí)為舊數(shù)據(jù))
- 寫(xiě)操作:更新數(shù)據(jù)源,失效緩存
- 讀操作:將回源數(shù)據(jù)(舊數(shù)據(jù))寫(xiě)緩存,出現(xiàn)緩存數(shù)據(jù)不一致問(wèn)題
- 這種問(wèn)題出現(xiàn)概率極低,幾點(diǎn)要求:緩存已過(guò)期、并發(fā)讀寫(xiě)、讀數(shù)據(jù)比寫(xiě)數(shù)據(jù)快、但讀操作更新緩存比寫(xiě)操作失效緩存慢(也就是說(shuō)寫(xiě)操作的行為需完全發(fā)生在讀操作兩步之間),一般而言讀操作(讀庫(kù)+更新緩存)時(shí)長(zhǎng)要小于寫(xiě)操作(更新數(shù)據(jù)源+失效緩存),所以認(rèn)為這種并發(fā)問(wèn)題概率較低
- 是否可進(jìn)一步解決此問(wèn)題:增加鎖機(jī)制,解決并發(fā)問(wèn)題
- Read Through Pattern:更新數(shù)據(jù)源由緩存系統(tǒng)操作
讀取數(shù)據(jù)
- Write Through Pattern:更新數(shù)據(jù)源由緩存系統(tǒng)操作
寫(xiě)數(shù)據(jù) Read Through
- Write Behind Caching Pattern:又稱(chēng)
Write Back- 一句話(huà)總結(jié):更新數(shù)據(jù)時(shí),只更新緩存,不更新數(shù)據(jù)源(緩存
異步批量更新數(shù)據(jù)源) - 優(yōu)勢(shì):
- 更新緩存為內(nèi)存操作,讀寫(xiě)I/O非常高
- 異步批量更新數(shù)據(jù)源,合并多個(gè)操作
- 問(wèn)題:
緩存不滿(mǎn)足強(qiáng)一致性要求強(qiáng)一致性和高性能的沖突、高可用和高性能的沖突終究會(huì)使Trade-Off- 實(shí)現(xiàn)復(fù)雜,需跟蹤哪些Cache更新,成本較高
- 一句話(huà)總結(jié):更新數(shù)據(jù)時(shí),只更新緩存,不更新數(shù)據(jù)源(緩存
總體來(lái)說(shuō),不同方案在不同場(chǎng)景下是有各自?xún)?yōu)劣的,技術(shù)選型、架構(gòu)設(shè)計(jì)應(yīng)根據(jù)實(shí)際場(chǎng)景取舍,并對(duì)選擇方案的利弊有足夠且深入理解。
一般而言,推薦 Cache Aside Pattern 方案,容忍較小概率的不一致(同時(shí)也可以增加鎖機(jī)制解決此低概率并發(fā)問(wèn)題),簡(jiǎn)化緩存系統(tǒng)復(fù)雜度。
新聞標(biāo)題:緩存系統(tǒng)中面臨的雪崩/穿透/一致性問(wèn)題
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/dpepocs.html


咨詢(xún)
建站咨詢(xún)
