緩存的那些應用場景,你都清楚嗎?
點擊上方“程序員大白”,選擇“星標”公眾號
重磅干貨,第一時間送達

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

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

數(shù)據(jù)庫緩存
我們看下圖,在WebServer和DB之間加一層cache,這層cache一般選取的介質是內存,因為我們都知道存入數(shù)據(jù)庫的數(shù)據(jù)都具有持久化的特點,那么讀寫會有磁盤IO的操作,內存的讀寫速度遠比磁盤快得多。(選用存儲介質,提高訪問速度:內存>>磁盤;減少磁盤IO的操作,減少重復查詢,提高吞吐量)

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

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