新聞中心
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供雞冠企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站制作、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為雞冠眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
在計(jì)算機(jī)世界中,緩存(caching)就是將數(shù)據(jù)子集儲(chǔ)存到一個(gè)具備高度可訪問性的高速運(yùn)行層的過程,這一層被稱作高速緩沖存儲(chǔ)器(cache)。
此過程旨在快速讀取使用率較高的數(shù)據(jù),避免在存取之前的數(shù)據(jù)時(shí)產(chǎn)生額外的計(jì)算負(fù)擔(dān)。緩存只能儲(chǔ)存數(shù)據(jù)一小段時(shí)間,這是權(quán)衡容量后的選擇,以此換取更高的運(yùn)行速度。
像隨機(jī)存取存儲(chǔ)器(RAM)和內(nèi)存存儲(chǔ)引擎這類在緩存層下的硬件能夠?qū)崿F(xiàn)快速存取,它們通常和軟件層一起被用于訪問數(shù)據(jù)。緩存基本上分為兩種:本地緩存和遠(yuǎn)程緩存。本地緩存依靠JVW(Java虛擬機(jī))堆進(jìn)行儲(chǔ)存,而遠(yuǎn)程(或集群)緩存使用內(nèi)存存儲(chǔ)器,如Redis和Memcached。
什么是堆內(nèi)本地緩存?
堆內(nèi)緩存指把數(shù)據(jù)存儲(chǔ)于Java堆中,在這里數(shù)據(jù)由垃圾收集器(GC)自動(dòng)管理。
堆內(nèi)緩存的優(yōu)點(diǎn):
- GC會(huì)自動(dòng)分配和釋放對(duì)象
- 訪問數(shù)據(jù)的速度更快
堆內(nèi)緩存的不足:
- GC停頓多發(fā)
- 因?yàn)閿?shù)據(jù)被存儲(chǔ)于JVM存儲(chǔ)器之中,如果JVM崩潰了,數(shù)據(jù)就會(huì)丟失。因此無法長(zhǎng)期緩存。
什么是堆外本地緩存?
堆外緩存指把數(shù)據(jù)存儲(chǔ)在堆外。垃圾收集器不會(huì)自動(dòng)處理這些數(shù)據(jù),因?yàn)閿?shù)據(jù)被存儲(chǔ)在Java堆外,所以它們以字節(jié)數(shù)組存儲(chǔ),因此也存在把數(shù)據(jù)序列化和反序列化的額外運(yùn)行負(fù)擔(dān)。
堆外緩存的優(yōu)點(diǎn):
- 允許大量數(shù)據(jù)的緩存且無須擔(dān)心GC停頓
- JVM崩潰后支持在存儲(chǔ)器中添加持久層以恢復(fù)數(shù)據(jù)
- JVM之間可共享緩存數(shù)據(jù)
堆外緩存的不足:
- 數(shù)據(jù)的序列化和反序列化是使用堆外緩存時(shí)最大的不便之處。這會(huì)為下層程序帶來計(jì)算負(fù)擔(dān)。因?yàn)闆]有共同的數(shù)據(jù)結(jié)構(gòu),把序列化的數(shù)據(jù)轉(zhuǎn)換成單獨(dú)對(duì)象將付出額外的成本。
- 短期數(shù)據(jù)更適合堆內(nèi)緩存,因?yàn)樗试SGC自動(dòng)運(yùn)行。因而,識(shí)別哪些數(shù)據(jù)可以被歸于堆內(nèi)緩存會(huì)帶來額外的計(jì)算。
- 手動(dòng)存儲(chǔ)器管理(像存儲(chǔ)器分段之類的問題!)
總之,因?yàn)槎淹饩彺婺軌蜷L(zhǎng)期存儲(chǔ)大量數(shù)據(jù),所以它是存儲(chǔ)數(shù)據(jù)的一種更好方式。再加上大磁盤子系統(tǒng),就能提高每秒讀寫次數(shù)(IOPS)。
什么是遠(yuǎn)程緩存?
遠(yuǎn)程緩存是將數(shù)據(jù)存儲(chǔ)在云端的緩沖區(qū)。因?yàn)榭梢栽谠贫藱z索數(shù)據(jù),所以這有助于構(gòu)建一個(gè)更堅(jiān)固且性能更強(qiáng)的持久層。Redis和Memcached是當(dāng)下兩款大受歡迎的內(nèi)存緩存產(chǎn)品。
圖源:unsplash
遠(yuǎn)程緩存的優(yōu)勢(shì):
- 遠(yuǎn)程緩存集群可以根據(jù)需求進(jìn)行擴(kuò)展
- 遠(yuǎn)程緩存不僅僅局限于單一數(shù)據(jù)結(jié)構(gòu),并且它支持多語言編程,因而操作簡(jiǎn)單。
- 與磁盤的低速存取相比,性能有所增強(qiáng)(因?yàn)閿?shù)據(jù)存儲(chǔ)在存儲(chǔ)器中,存取數(shù)據(jù)速度更快)
如何確定系統(tǒng)/服務(wù)需要緩存
- 緩存命中率:如果服務(wù)所提供的數(shù)據(jù)不需要經(jīng)常刷新且屬于經(jīng)常檢索型數(shù)據(jù),應(yīng)當(dāng)考慮緩存它們。
- 最終一致性的容限:仔細(xì)考慮源數(shù)據(jù)的變化率,以及緩存的刷新頻率。還應(yīng)該考慮服務(wù)對(duì)象是否重視最近數(shù)據(jù)的讀取。
緩存策略類型和相應(yīng)挑戰(zhàn)
圖源:unsplash
(1) 本地緩存:
通過在服務(wù)(比如說哈希表)內(nèi)使用某種存儲(chǔ)方式將使本地緩存的執(zhí)行更加容易,但也會(huì)導(dǎo)致緩存一致性問題。意思就是,不同服務(wù)器中的本地緩存不同,這將導(dǎo)致數(shù)據(jù)不一致。
例如,服務(wù)器S1用數(shù)據(jù)D1響應(yīng)了請(qǐng)求R1,并把它存儲(chǔ)到本地緩存中。如果在數(shù)據(jù)庫(kù)中的數(shù)據(jù)被更新成D2版本,之后R1再次發(fā)出相同的請(qǐng)求,則有可能返回?cái)?shù)據(jù)D1或D2,這取決于請(qǐng)求抵達(dá)了哪個(gè)服務(wù)器。
冷啟動(dòng)也是內(nèi)存緩存的一個(gè)重要問題。因?yàn)槊恳粋€(gè)服務(wù)器都是在沒有緩存的情況下啟動(dòng)的,隨著新服務(wù)器的增加,甚至在部署期間,對(duì)下游依賴發(fā)出的請(qǐng)求數(shù)量也會(huì)隨之變多。這個(gè)問題可以通過請(qǐng)求合并解決。
(2) 外部緩存:
- 能夠解決以上問題,因?yàn)橥獠烤彺媸欠珠_存儲(chǔ)的,例如Redis和Memcached。
- 提供更多存儲(chǔ)空間并減少因容量而導(dǎo)致的緩存淘汰。
- 挑戰(zhàn)包括提高整體系統(tǒng)的復(fù)雜性和增加更多負(fù)載以維護(hù)額外的緩存服務(wù)器。
- 始終在服務(wù)中添加代碼來解決緩存可能不可用的情況。
- 可以在此期間呼叫下游服務(wù)。但如果緩存中斷時(shí)間過長(zhǎng),可能導(dǎo)致下游服務(wù)的負(fù)載增加。
- 或者,外部存儲(chǔ)器和內(nèi)部存儲(chǔ)器一起使用可以避免完全回落到下游依賴。
- 也可以考慮采取減載技術(shù),通過限制服務(wù)的請(qǐng)求數(shù)量來避免下游服務(wù)負(fù)載過重。
(3) 應(yīng)對(duì)緩存擴(kuò)展和彈性問題:
如果緩存達(dá)到最大容量,那么需要通過向其添加更多節(jié)點(diǎn)來擴(kuò)展。深入了解系統(tǒng)及其在達(dá)到最大容量時(shí)的反應(yīng)(例如,緩存達(dá)到最大容量時(shí)每個(gè)容器的內(nèi)存利用率上升)有助于設(shè)置準(zhǔn)確的警報(bào)。
這些警報(bào)可用于擴(kuò)展緩存服務(wù)。在擴(kuò)展服務(wù)時(shí),需要記住兩件事:緩存集群是否支持在沒有宕機(jī)的情況下添加節(jié)點(diǎn),或者是否支持一致性哈希算法來平衡流量分配。始終確保通過模擬故障來測(cè)試擴(kuò)展策略。
(4) 控制數(shù)據(jù)的魯棒性
緩存數(shù)據(jù)應(yīng)能夠讀取更新后的代碼格式,而更新后的代碼應(yīng)能夠處理緩存所提供的舊版本數(shù)據(jù)。
緩存實(shí)現(xiàn)要點(diǎn)
圖源:unsplash
(1) 緩存大小:根據(jù)服務(wù)中通過的數(shù)據(jù)類型可以確定緩存大小,以便提高緩存命中率。
(2) 緩存淘汰:這指的是當(dāng)緩存達(dá)到最大容量時(shí),把數(shù)據(jù)從緩存中移除。緩存淘汰最常見的模式是LRU(最近最少使用)。
(3) 緩存逾期:這是一種確定數(shù)據(jù)在緩存中的保留時(shí)間的策略,具體取決于數(shù)據(jù)刷新頻率或客戶處理過時(shí)數(shù)據(jù)的能力。
(4) 下游服務(wù)不可用
如果下游服務(wù)因?yàn)槟承┰虿豢捎?,緩存服?wù)不應(yīng)該用更新數(shù)據(jù)的請(qǐng)求攻擊下游,而是能夠長(zhǎng)期保護(hù)緩存,并等待它恢復(fù)。根據(jù)與客戶之間的權(quán)衡協(xié)調(diào),要么報(bào)告緩存中的過時(shí)數(shù)據(jù),避免請(qǐng)求令下游服務(wù)掉線,要么使用一種機(jī)制來存儲(chǔ)下游服務(wù)的錯(cuò)誤響應(yīng),并對(duì)其進(jìn)行相應(yīng)的解釋說明。
(5) 安全性
正在緩存的敏感數(shù)據(jù)或客戶數(shù)據(jù)的安全性是人們對(duì)緩存集群的擔(dān)憂之一。敏感數(shù)據(jù)應(yīng)在存儲(chǔ)前加密,并在輸入和輸出緩存數(shù)據(jù)的過程中確保其安全性。此外,由于緩存數(shù)據(jù)的返回速度比從數(shù)據(jù)庫(kù)獲取的調(diào)用速度快,攻擊者可以根據(jù)響應(yīng)時(shí)間識(shí)別服務(wù)發(fā)出的請(qǐng)求類型,這被稱為側(cè)信道時(shí)序攻擊。
(6) “驚群效應(yīng)”問題
下游服務(wù)不可用時(shí),如果為了從下游服務(wù)獲取未緩存的數(shù)據(jù)而發(fā)出多個(gè)請(qǐng)求,則可能會(huì)引發(fā)多次重試,進(jìn)而導(dǎo)致服務(wù)掉線??梢越Y(jié)合多個(gè)策略來緩解這個(gè)情況,例如按客戶或請(qǐng)求來進(jìn)行節(jié)流、請(qǐng)求合并(即對(duì)相同的未緩存數(shù)據(jù)只發(fā)送一個(gè)請(qǐng)求)等。
緩存可以提供更快的數(shù)據(jù)訪問速度和提高下游服務(wù)可用性,但它的代價(jià)是緩存節(jié)點(diǎn)的處理會(huì)更加復(fù)雜。通過巧妙地理解下游服務(wù)的需求,可以得出一個(gè)緩存解決方案。在不同的情景中(如流量峰值、緩存不可用、下游服務(wù)掉線等)都應(yīng)當(dāng)對(duì)此解決方案的表現(xiàn)進(jìn)行仔細(xì)監(jiān)控以調(diào)整參數(shù)。
希望本文能夠幫你理解那些在為服務(wù)部署緩存解決方案時(shí)要牢記于心的要點(diǎn)。
當(dāng)前名稱:詳解緩存:緩存中存在的挑戰(zhàn)及策略
網(wǎng)頁URL:http://m.5511xx.com/article/copjicd.html


咨詢
建站咨詢
