緩存的那些應(yīng)用場(chǎng)景,你都清楚嗎?
點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)

來源:blog.csdn.net/u013065023/article/
details/54670694
本文主要跟大家來探討下緩存的應(yīng)用場(chǎng)景有哪些?緩存給我們帶來了哪些便利?同時(shí)又給我們帶來了哪些問題?還有,簡單介紹一些常用的緩存工具。JUST DO IT! Go!
緩存的應(yīng)用場(chǎng)景
CPU緩存
是位于CPU與內(nèi)存之間的臨時(shí)存儲(chǔ)器,它的容量比內(nèi)存小的多但是交換速度卻比內(nèi)存要快得多。(選用存儲(chǔ)介質(zhì),提高訪問速度:高速緩存>內(nèi)存;減少重復(fù)量)
瀏覽器緩存
瀏覽器可以緩存一些靜態(tài)資源,比如圖片、js、css等,這些都是不常變化的內(nèi)容,所以沒有必要每次都去請(qǐng)求。(減少網(wǎng)絡(luò)IO消耗,提高訪問速度)

CDN緩存
客戶端會(huì)先檢查瀏覽器的緩存,若緩存過期則會(huì)像CDN發(fā)送請(qǐng)求(Request),CDN檢查緩存數(shù)據(jù)還未過期,那么直接返回響應(yīng)(Response),只需兩步搞定。
但是,CDN緩存過期,那么需要向應(yīng)用服務(wù)器(Web Server)發(fā)起請(qǐng)求,獲得新的數(shù)據(jù)響應(yīng),這部分新的數(shù)據(jù)按一定的緩存策略會(huì)選擇是否緩存在CDN中。
從下圖可發(fā)現(xiàn),此時(shí)數(shù)據(jù)需要完成1–>3–>4–>2最終返回到瀏覽器端。此處的CDN,(減少網(wǎng)絡(luò)IO消耗,提高訪問速度)

數(shù)據(jù)庫緩存
我們看下圖,在WebServer和DB之間加一層cache,這層cache一般選取的介質(zhì)是內(nèi)存,因?yàn)槲覀兌贾来嫒霐?shù)據(jù)庫的數(shù)據(jù)都具有持久化的特點(diǎn),那么讀寫會(huì)有磁盤IO的操作,內(nèi)存的讀寫速度遠(yuǎn)比磁盤快得多。(選用存儲(chǔ)介質(zhì),提高訪問速度:內(nèi)存>>磁盤;減少磁盤IO的操作,減少重復(fù)查詢,提高吞吐量)

業(yè)務(wù)層緩存
除了上面介紹的緩存場(chǎng)景,我們還可能需要更細(xì)粒度的緩存,可以在上圖的某個(gè)切面做更細(xì)致處理,下篇我們將從實(shí)踐方面來探討業(yè)務(wù)上的緩存。
學(xué)習(xí)資料:Java進(jìn)階視頻資源
存儲(chǔ)介質(zhì)訪問速度比較 來自Google工程師Jeff Dean的分享,僅供參考:

緩存的工作原理
一句話概況:更快讀寫的存儲(chǔ)介質(zhì)+減少IO+減少CPU計(jì)算=性能優(yōu)化。
通過上述應(yīng)用場(chǎng)景(標(biāo)紅部分),我們可知緩存的基本原理就是通過這幾個(gè)方面來進(jìn)行優(yōu)化的。
在實(shí)際應(yīng)用中,我們需要對(duì)數(shù)據(jù)進(jìn)行分類,才能更好的使用緩存以及一些策略來輔助。比如哪些為冷熱數(shù)據(jù)?哪些數(shù)據(jù)量很大,讀取會(huì)嚴(yán)重影響IO?哪些數(shù)據(jù)查多改少(日志數(shù)據(jù),爬蟲數(shù)據(jù))?哪些數(shù)據(jù)又是經(jīng)過很復(fù)雜的計(jì)算得到的結(jié)果(這些珍貴的數(shù)據(jù)需要好好保存利用)?……
緩存帶來的好處
顯而易見,緩存給我們帶來最直接的體驗(yàn)就是“快”,我們來總結(jié)一下:
通過減少IO(包括磁盤和網(wǎng)絡(luò))來提高吞吐量,減少計(jì)算量(CPU計(jì)算)釋放CPU,這些都是提高系統(tǒng)的響應(yīng)速度。 通過切面的處理方式,可以在各層進(jìn)行插拔,是所有性能優(yōu)化最簡單有效的解決方案。(對(duì)于不熟悉業(yè)務(wù)代碼或算法的優(yōu)化者,顯然加一層緩存的復(fù)雜度和風(fēng)險(xiǎn)更低,而這一層看似簡單的緩存,它給系統(tǒng)帶來的性能優(yōu)化有可能大大超過前者)
緩存帶來的困擾
我們不能否認(rèn)緩存給我們帶來諸多便利,同時(shí),我們不能忽略緩存確實(shí)也給我們帶來了不少困擾:
數(shù)據(jù)的一致性、實(shí)時(shí)性受影響。(需要對(duì)數(shù)據(jù)的一致性,時(shí)效性進(jìn)行評(píng)估,進(jìn)而確定是否要緩存或設(shè)定緩存的過期時(shí)間,比如個(gè)性化的數(shù)據(jù)是否值得緩存?) 緩存介質(zhì)帶來的不可靠性。(一般使用內(nèi)存做緩存的話,若機(jī)器故障,如何保證緩存的高可用?可考慮對(duì)緩存進(jìn)行分布式做成高可用,同時(shí),需要接受這種不可靠不安全會(huì)給數(shù)據(jù)帶來的問題,在異常情況下進(jìn)行補(bǔ)償處理,定期持久化等方式) 緩存的數(shù)據(jù)使得更難排查問題。因?yàn)榫彺婷惺请S著訪問隨時(shí)變化的,緩存的行為難以重現(xiàn),使得出現(xiàn)BUG很難排查。 進(jìn)程內(nèi)緩存可能會(huì)增加GC壓力:在具有垃圾收集功能的語言中(如Java),大量長壽命的緩存對(duì)象會(huì)增加垃圾收集的時(shí)間和次數(shù)。
我前面提到的,使用緩存之前我們需要對(duì)數(shù)據(jù)進(jìn)行分類,對(duì)訪問行為進(jìn)行預(yù)估,思考哪些數(shù)據(jù)需要緩存,緩存時(shí)需要采用什么策略?這樣,我們才不被緩存所困擾,才能規(guī)避這些問題。
常用的緩存工具
業(yè)務(wù)上緩存,常用 and 開源的緩存工具有:ehcache、memcache、Redis。
ehcache是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,hibernate使用其做二級(jí)緩存。同時(shí),ehcache可以通過多播的方式實(shí)現(xiàn)集群。本人主要用于本地的緩存,數(shù)據(jù)庫上層的緩存。memcache是一套分布式的高速緩存系統(tǒng),提供key-value這樣簡單的數(shù)據(jù)儲(chǔ)存,可充分利用CPU多核,無持久化功能。本人在做web集群的時(shí)候用過,主要做session共享,頁面對(duì)象緩存。redis高性能的key-value系統(tǒng),提供豐富的數(shù)據(jù)類型,單核CPU有抗并發(fā)能力,有持久化和主從復(fù)制的功能。本人主要使用redis的redis sentinel,根據(jù)不同業(yè)務(wù)分為多組。
推薦閱讀
國產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(后續(xù))
年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了
關(guān)于程序員大白
程序員大白是一群哈工大,東北大學(xué),西湖大學(xué)和上海交通大學(xué)的碩士博士運(yùn)營維護(hù)的號(hào),大家樂于分享高質(zhì)量文章,喜歡總結(jié)知識(shí),歡迎關(guān)注[程序員大白],大家一起學(xué)習(xí)進(jìn)步!
