許多朋友學(xué)習(xí)Java聽說緩存這個(gè)名詞有點(diǎn)懵,不知道怎么回事,Java的緩存是什么東西?該怎么理解?今天小編就這個(gè)問題帶大家來了解一番,什么是Java的緩存。
一、什么是緩存
1、Cache是高速緩沖存儲(chǔ)器一種特殊的存儲(chǔ)器子系統(tǒng),其中復(fù)制了頻繁使用的數(shù)據(jù)以利于快速訪問
2、凡是位于速度相差較大的兩種硬件/軟件之間的,用于協(xié)調(diào)兩者數(shù)據(jù)傳輸速度差異的結(jié)構(gòu),均可稱之為Cache
二、緩存的分類
1、基于web應(yīng)用的系統(tǒng)架構(gòu)圖
2、在系統(tǒng)架構(gòu)的不同層級(jí)之間,為了加快訪問速度,都可以存在緩存
操作系統(tǒng)磁盤緩存->減少磁盤機(jī)械操作
數(shù)據(jù)庫緩存->減少文件系統(tǒng)I/O
應(yīng)用程序緩存->減少對(duì)數(shù)據(jù)庫的查詢
Web服務(wù)器緩存->減少應(yīng)用服務(wù)器請求
客戶端瀏覽器緩存->減少對(duì)網(wǎng)站的訪問
三、操作系統(tǒng)緩存
1、文件系統(tǒng)提供的DiskCache:操作系統(tǒng)會(huì)把經(jīng)常訪問到的文件內(nèi)容放入到內(nèi)存當(dāng)中,由文件系統(tǒng)來管理
2、當(dāng)應(yīng)用程序通過文件系統(tǒng)訪問磁盤文件的時(shí)候,操作系統(tǒng)從DiskCache當(dāng)中讀取文件內(nèi)容,加速了文件讀取速度
3、DiskCache由操作系統(tǒng)來自動(dòng)管理,一般不用人工干預(yù),但應(yīng)當(dāng)保證物理內(nèi)存充足,以便于操作系統(tǒng)可以使用盡量多的內(nèi)存充當(dāng)DiskCache,加速文件讀取速度
4、特殊的應(yīng)用程序?qū)ξ募到y(tǒng)DiskCache有很高的要求,會(huì)繞開文件系統(tǒng)DiskCache,直接訪問磁盤分區(qū),自己實(shí)現(xiàn)Disk
5、Cache策略
Oracle的rawdevice(裸設(shè)備)–直接拋棄文件系統(tǒng)
MySQL的InnoDB:innodb_flush_method=O_DIRECT
四、數(shù)據(jù)庫緩存
1、重要性
數(shù)據(jù)庫通常是企業(yè)應(yīng)用系統(tǒng)很核心的部分
數(shù)據(jù)庫保存的數(shù)據(jù)量通常非常龐大
數(shù)據(jù)庫查詢操作通常很頻繁,有時(shí)還很復(fù)雜
以上原因造成數(shù)據(jù)庫查詢會(huì)引起非常頻繁的磁盤I/O讀取操作,迫使CPU掛起等待,數(shù)據(jù)庫性能極度低下
2、緩存策略
a、QueryCache
以SQL作為key值緩存查詢結(jié)果集
一旦查詢涉及的表記錄被修改,緩存就會(huì)被自動(dòng)刪除
設(shè)置合適的QueryCache會(huì)很大程度提高數(shù)據(jù)庫性能
QueryCache并非越大越好,過大的QqueryCache會(huì)浪費(fèi)內(nèi)存。
MySQL:query_cache_size=128M
b、DataBuffer
databuffer是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的容器
databuffer的命中率直接決定了數(shù)據(jù)庫的性能
databuffer越大越好,多多益善
MySQL的InnoDBbuffer:innodb_buffer_pool_size=2G
MySQL建議bufferpool開大到服務(wù)器物理內(nèi)存60-80%
五、應(yīng)用程序緩存
1、對(duì)象緩存
由O/RMapping框架例如Hibernate提供,透明性訪問,細(xì)顆粒度緩存數(shù)據(jù)庫查詢結(jié)果,無需業(yè)務(wù)代碼顯式編程,是很省事的緩存策略當(dāng)軟件結(jié)構(gòu)按照O/RMapping框架的要求進(jìn)行針對(duì)性設(shè)計(jì),使用對(duì)象緩存將會(huì)很大程度降低Web系統(tǒng)對(duì)于數(shù)據(jù)庫的訪問請求良好的設(shè)計(jì)數(shù)據(jù)庫結(jié)構(gòu)和利用對(duì)象緩存,能夠提供很高的性能,對(duì)象緩存適合OLTP(聯(lián)機(jī)事務(wù)處理)應(yīng)用。
2、查詢緩存
對(duì)數(shù)據(jù)庫查詢結(jié)果集進(jìn)行緩存,類似數(shù)據(jù)庫的QueryCache適用于一些耗時(shí),但是時(shí)效性要求比較低的場景。查詢緩存和對(duì)象緩存適用的場景、不一樣,是互為補(bǔ)充的當(dāng)查詢結(jié)果集涉及的表記錄被修改以后,需要注意清理緩存
3、頁面緩存
a、作用
針對(duì)頁面的緩存技術(shù)不但可以減輕數(shù)據(jù)庫服務(wù)器壓力,還可以減輕應(yīng)用服務(wù)器壓力好的頁面緩存可以很大程度提高頁面渲染速度頁面緩存的難點(diǎn)在于如何清理過期的緩存
b、分類
I、動(dòng)態(tài)頁面靜態(tài)化
利用模板技術(shù)將訪問過一次的動(dòng)態(tài)頁面生成靜態(tài)html,同時(shí)修改頁面鏈接,下一次請求直接訪問靜態(tài)鏈接頁面動(dòng)態(tài)頁面靜態(tài)化技術(shù)的廣泛應(yīng)用于互聯(lián)網(wǎng)CMS/新聞?lì)怶eb應(yīng)用,但也有BBS應(yīng)用使用該技術(shù),例如Discuz!無法進(jìn)行權(quán)限驗(yàn)證,無法顯示個(gè)性化信息可以使用AJAX請求彌補(bǔ)動(dòng)態(tài)頁面靜態(tài)化的某些缺點(diǎn)
II、Servlet緩存
針對(duì)URL訪問返回的頁面結(jié)果進(jìn)行緩存,適用于粗粒度的頁面緩存,例如新聞發(fā)布可以進(jìn)行權(quán)限的檢查OScache提供了簡單的Servlet緩存(通過web.xml中的配置)也可以自己編程實(shí)現(xiàn)Servlet緩存
III、頁面內(nèi)部緩存
針對(duì)動(dòng)態(tài)頁面的局部片斷內(nèi)容進(jìn)行緩存,適用于一些個(gè)性化但不經(jīng)常更新的頁面(例如博客)OSCache提供了簡單的頁面緩存可以自行擴(kuò)展JSPTag實(shí)現(xiàn)頁面局部緩存
六、web服務(wù)器端緩存
基于代理服務(wù)器模式的Web服務(wù)器端緩存,如squid/nginxWeb服務(wù)器緩存技術(shù)被用來實(shí)現(xiàn)CDN(內(nèi)容分發(fā)網(wǎng)絡(luò)contentdeliverynetwork)被國內(nèi)主流門戶網(wǎng)站大量采用不需要編程,但僅限于新聞發(fā)布類網(wǎng)站,頁面實(shí)時(shí)性要求不高
七、基于ajax的瀏覽器緩存
使用AJAX調(diào)用的時(shí)候,將數(shù)據(jù)庫在瀏覽器端緩存只要不離開當(dāng)前頁面,不刷新當(dāng)前頁面,就可以直接讀取緩存數(shù)據(jù)只適用于使用AJAX技術(shù)的頁面
以上就是緩存的講解,希望對(duì)大家有所幫助,如果您還有什么不理解不明白的地方敬請灌入動(dòng)力節(jié)點(diǎn)官方網(wǎng)站或微信平臺(tái),我們?yōu)槟峁└喔玫淖稍儎?dòng)態(tài)。