大型WEB網(wǎng)站架構(gòu)深入分析_緩存_第1頁
大型WEB網(wǎng)站架構(gòu)深入分析_緩存_第2頁
大型WEB網(wǎng)站架構(gòu)深入分析_緩存_第3頁
大型WEB網(wǎng)站架構(gòu)深入分析_緩存_第4頁
大型WEB網(wǎng)站架構(gòu)深入分析_緩存_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、緩存 1介紹 緩存就是利用本地參考原則:當(dāng)CPU要讀取一個數(shù)據(jù)時,首先從緩存中查找,找到就立即讀取并送給CPU處理; 沒有找到,就用相對慢的速率從存中讀取并送給CPU處理,同時把這個數(shù)據(jù)所在的數(shù)據(jù)塊調(diào)入緩存中,可以使得 以后對整塊數(shù)據(jù)的讀取都從緩存中進(jìn)行,不必再調(diào)用存。它們幾乎被用在每一個計算層上:硬件、操作系統(tǒng)、Web 瀏覽器、Web應(yīng)用程序等。一個緩存就相當(dāng)于是一個臨時存:它有一個有限的空間量,但訪問它比訪問原始數(shù)據(jù) 速度要快。緩存也可以存在于各個層的架構(gòu)中,但經(jīng)常在離前端最近的那個層上發(fā)現(xiàn),在那里可以快速實(shí)現(xiàn)并返 回數(shù)據(jù),無需占用下游層數(shù)據(jù)。 那么如何利用緩存使數(shù)據(jù)訪問更快呢?在這種情況

2、下,有許多地方可以插入緩存。一種是在請求層節(jié)點(diǎn)上插入緩 存,如圖1所示。 Leah 毗 LhHJt The R-eqwHtchecks ils.即“I 匚ach 皀 be l1 ewe Querjirrc she tor (he reounted 血財 圖1在請求層節(jié)點(diǎn)插入緩存 在請求層節(jié)點(diǎn)上放置一個緩存,即可響應(yīng)本地的存儲數(shù)據(jù)。當(dāng)對服務(wù)器發(fā)送一個請求時,如果本地存在所請求數(shù) 據(jù),那么該節(jié)點(diǎn)即會快速返回本地緩存數(shù)據(jù)。如果本地不存在,那么請求節(jié)點(diǎn)將會查詢磁盤上的數(shù)據(jù)。請求層節(jié) 點(diǎn)緩存即可以存在于存中(這個非常快速)也可以位于該節(jié)點(diǎn)的本地磁盤上(比訪問網(wǎng)絡(luò)存儲要快)。 Each Request N

3、ode will c?ieck its local csche before requesting data frorri the origin Data 圖2多個緩存 當(dāng)擴(kuò)展到許多節(jié)點(diǎn)的時候,會發(fā)生什么呢?如圖2所示,如果請求層被擴(kuò)展為多個節(jié)點(diǎn),它仍然有可能訪問每個 節(jié)點(diǎn)所在的主機(jī)緩存。然而,如果你的負(fù)載均衡器隨機(jī)分布節(jié)點(diǎn)之間的請求,那么請求將會訪問各個不同的節(jié)點(diǎn), 因此緩存遺漏將會增加。這里有兩種方法可以克服這個問題:全局緩存和分布式緩存。 1.1全局緩存 顧名思義,全局緩存是指所有節(jié)點(diǎn)都使用同一個緩存空間。這包含添加一臺服務(wù)器或某種類型的文件存儲,所有 請求層節(jié)點(diǎn)訪問該存儲要比原始存儲快

4、。每個請求節(jié)點(diǎn)會以同種方式查詢緩存,這種緩存方案可能有點(diǎn)復(fù)雜,隨 著客戶機(jī)和請求數(shù)量的增加,單個緩存(Cache)很容易溢出,但在某些結(jié)構(gòu)中卻是非常有效的(特別是那些特 定的硬件,專門用來提升全局緩存速度,或者是需要被緩存的特定數(shù)據(jù)集)。 在圖3中描述了全局緩存常見的兩種方式。當(dāng)一個Cache響應(yīng)在高速緩存中沒有發(fā)現(xiàn)時,Cache自己會從底層存 儲中檢索缺少的那塊數(shù)據(jù)。如圖4所示,請求節(jié)點(diǎn)去檢索那些在高速緩存中沒有發(fā)現(xiàn)的數(shù)據(jù)。 圖3負(fù)責(zé)檢索數(shù)據(jù)的全局緩存 GlJtisl Cache 伽冋軀if hlodr Request htedf 2 If lhe cim悒 艸利 no外 rhp cahe

5、tfipn IE Recurs NflGf Will IfTiif. r 吐 GpE the a勺5. 2 iJb*ert 活冷詁 s、 rctiicvec from tht ngiri k 1 r. lx K* Q tht? cachii 1 Fa rh ircucil, the RfOueii Mode wmi trwk th* plotNlacht first 圖4全局緩存里負(fù)責(zé)檢索的請求節(jié)點(diǎn) 大多使用全局緩存的應(yīng)用程序都傾向于使用第一種類型,利用Cache本身來驅(qū)逐和獲取數(shù)據(jù)以防止來自客戶端的 同一個數(shù)據(jù)區(qū)發(fā)出大量的請求。然而,在某些情況下,使用第二種實(shí)現(xiàn)反而更有意義。例如,如果該緩存

6、用于存 儲大量的文件,低緩存的命中率會導(dǎo)致高速緩沖區(qū)不堪重負(fù)和緩存遺漏。 1.2分布式緩存 分布式緩存即緩存在分布式系統(tǒng)各節(jié)點(diǎn)存中的緩存數(shù)據(jù)。如圖5所示,每個節(jié)點(diǎn)都有自己的緩存數(shù)據(jù),所以如果 冰箱扮演著緩存雜貨店的角色,那么分布式緩存就是把食物放置在不同的地方一一冰箱、櫥柜和飯盒一一當(dāng)索取 的時候,方便拿哪個就拿哪個,而無需特地往商店跑一趟。通常情況下,會使用一致性哈希函數(shù)對緩存進(jìn)行劃分, 例如,一個請求節(jié)點(diǎn)正在尋找一個特定塊的數(shù)據(jù),在分布式緩存中,它很快就會知道去哪里找,并確保這些數(shù)據(jù) 是可用的。這種情況下,每個節(jié)點(diǎn)都會有一小塊緩存,然后在向另一個節(jié)點(diǎn)發(fā)送數(shù)據(jù)請求。因此分布式緩存的優(yōu) 點(diǎn)之一

7、就是只需向請求池添加節(jié)點(diǎn)即可增加緩存空間,減少對數(shù)據(jù)庫的訪問負(fù)載量。 當(dāng)然,分布式緩存也存在缺點(diǎn),例如單點(diǎn)實(shí)效,當(dāng)該節(jié)點(diǎn)出現(xiàn)故障或宕機(jī),那么該節(jié)點(diǎn)保存的數(shù)據(jù)就會丟失。 Forhmc ctKGks thfl cache based orb lhe ile ms ley Ius-ng 進(jìn)程圍或集群圍的緩存是持久化層的第二級緩存,通常是可選的。 持久化層的緩存的并發(fā)訪問策略 當(dāng)多個并發(fā)的事務(wù)同時訪問持久化層的緩存的相同數(shù)據(jù)時,會引起并發(fā)問題,必須采用必要的事務(wù)隔離措施。 在進(jìn)程圍或集群圍的緩存,即第二級緩存,會出現(xiàn)并發(fā)問題。因此可以設(shè)定以下四種類型的并發(fā)訪問策略,每一 種策略對應(yīng)一種事務(wù)隔離級別。

8、事務(wù)型:僅僅在受管理環(huán)境中適用。它提供了 Repeatable Read事務(wù)隔離級別。對于經(jīng)常被讀但很少修改的數(shù)據(jù), 可以采用這種隔離類型,因為它可以防止臟讀和不可重復(fù)讀這類的并發(fā)問題。 讀寫型:提供了 Read Committed事務(wù)隔離級別。僅僅在非集群的環(huán)境中適用。對于經(jīng)常被讀但很少修改的數(shù)據(jù), 可以采用這種隔離類型,因為它可以防止臟讀這類的并發(fā)問題。 非嚴(yán)格讀寫型:不保證緩存與數(shù)據(jù)庫中數(shù)據(jù)的一致性。如果存在兩個事務(wù)同時訪問緩存中相同數(shù)據(jù)的可能,必須 為該數(shù)據(jù)配置一個很短的數(shù)據(jù)過期時間,從而盡量避免臟讀。對于極少被修改,并且允許偶爾臟讀的數(shù)據(jù),可以 采用這種并發(fā)訪問策略。只讀型:對于從來

9、不會修改的數(shù)據(jù),如參考數(shù)據(jù),可以使用這種并發(fā)訪問策略。 事務(wù)型并發(fā)訪問策略是事務(wù)隔離級別最高,只讀型的隔離級別最低。事務(wù)隔離級別越高,并發(fā)性能就越低。 什么樣的數(shù)據(jù)適合存放到第二級緩存中? 1、很少被修改的數(shù)據(jù) 2、不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù) 3、不會被并發(fā)訪問的數(shù)據(jù) 4、參考數(shù)據(jù) 不適合存放到第二級緩存的數(shù)據(jù)? 1、經(jīng)常被修改的數(shù)據(jù) 2、財務(wù)數(shù)據(jù),絕對不允許出現(xiàn)并發(fā) 3、與其他應(yīng)用共享的數(shù)據(jù)。 Hibernate 的二級緩存 如前所述,Hibernate提供了兩級緩存,第一級是Session的緩存。由于 Session對象的生命周期通常對應(yīng)一個 數(shù)據(jù)庫事務(wù)或者一個應(yīng)用事務(wù),因此

10、它的緩存是事務(wù)圍的緩存。第一級緩存是必需的,不允許而且事實(shí)上也無法 比卸除。在第一級緩存中,持久化類的每個實(shí)例都具有唯一的OID。 第二級緩存是一個可插拔的的緩存插件,它是由 SessionFactory 負(fù)責(zé)管理。由于 SessionFactory 對象的生命周 期和應(yīng)用程序的整個過程對應(yīng),因此第二級緩存是進(jìn)程圍或者集群圍的緩存。這個緩存中存放的對象的松散數(shù)據(jù)。 第二級對象有可能出現(xiàn)并發(fā)問題,因此需要采用適當(dāng)?shù)牟l(fā)訪問策略,該策略為被緩存的數(shù)據(jù)提供了事務(wù)隔離級 別。緩存適配器用于把具體的緩存實(shí)現(xiàn)軟件與Hibernate集成。第二級緩存是可選的,可以在每個類或每個集合 的粒度上配置第二級緩存。

11、 Hibernate的二級緩存策略的一般過程如下: 1)條件查詢的時候,總是發(fā)出一條select * from table_name where .(選擇所有字段)這樣的 SQL語句查 詢數(shù)據(jù)庫,一次獲得所有的數(shù)據(jù)對象。 2)把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。 3)當(dāng)Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候,首先從Session 一級緩存中查;查不到,如果配置了二級緩存, 那么從二級緩存中查;查不到,再查詢數(shù)據(jù)庫,把結(jié)果按照ID放入到緩存。 4)刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。 Hibernate的二級緩存策略,是針對于 ID查詢的緩存策略,對于條件查詢則毫無作用。

12、為此,Hibernate提供了 針對條件查詢的 Query緩存。 Hibernate的Query緩存策略的過程如下: 1) Hibernate首先根據(jù)這些信息組成一個Query Key, Query Key包括條件查詢的請求一般信息:SQL, SQL需要 的參數(shù),記錄圍(起始位置rowStart,最大記錄個數(shù) maxRows),等。 2) Hibernate 根據(jù)這個Query Key到Query緩存中查找對應(yīng)的結(jié)果列表。如果存在,那么返回這個結(jié)果列表;如 果不存在,查詢數(shù)據(jù)庫,獲取結(jié)果列表,把整個結(jié)果列表根據(jù)Query Key放入到Query緩存中。 3) Query Key中的SQL涉及到

13、一些表名,如果這些表的任何數(shù)據(jù)發(fā)生修改、刪。 :Hibernate 【 sioiFatlohQ. 啟渤Hibg科訓(xùn)電 Tiansacljon a -=ainKansi 炊頭0 加藍(lán)Fh-rn彳爐rfa kTii 件至謹(jǐn)安例f內(nèi)存) f f r-nritn 如;tiri;_T 徉中it”紳p I n :節(jié)點(diǎn)配養(yǎng) 并加戟膽noKmit件蔓壇 丈側(cè)曲尋) 由上直褐到的e日汀 工訊此眸爭茍捧口 Tratiw 就 tionfi亍窩懈 h 利用上而虹逹的似 創(chuàng)倔一I se&s I oof ac*n0?M Sessiorr石曲毆駭歐l00;i Hibernate工作原理緩存圖 3.2 SPRING MVC實(shí)

14、現(xiàn)頁面緩存 Spring的MVC是一個非常靈活的框架,可以無縫集成Struts/WebWork以及Velocity/Tapestry 等View技 術(shù)。Spring的DispatherServlet定義極為靈活,由于是開源框架,我們通過源代碼,能輕松定制自己的 處理流程。 為了實(shí)現(xiàn)頁面緩存,可以改寫DispatherServlet 的doService()方法,這里提出一個解決方案: 利用WrappedResponse獲得handler處理后的容,然后緩存起來,這樣在下次請求時,可以直接輸出緩存 容。 由于在DispatherServlet 層實(shí)現(xiàn)了緩存,因此不管采用jsp或velocity都

15、可以正常工作。 之所以不在Filter 一層實(shí)現(xiàn),是因為 Filter 無法得知Request相關(guān)上下文。 Java中有很多框架都用到緩存技術(shù),這里就不一一舉例了。 3.3幾個著名的Java緩存技術(shù) OSCache OSCache是個一個廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何java應(yīng)用程序 的普通的緩存解決方案。 OSCache有以下特點(diǎn): 1, 緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可 以緩存。 2, 擁有全面的API-OSCache API給你全面的程序來控制所有的OSCache特性。 3, 永久緩存-緩存能隨意的寫入硬盤

16、,因此答應(yīng)昂貴的創(chuàng)建 (eXPensive-to-create)數(shù)據(jù) 來保持緩存,甚至能讓應(yīng)用重啟。 4, 支持集群-集群緩存數(shù)據(jù)能被單個的進(jìn)行參數(shù)配置,不需要修改代碼。 5, 緩存記錄的過期-你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略 (假如默認(rèn)性能不需要時)。 Java Cach ing System JSC(Java Caching System)是一個用分布式的緩存系統(tǒng),是基于服務(wù)器的java應(yīng)用程序。 它是通過提供治理各種動態(tài)緩存數(shù)據(jù)來加速動態(tài)web應(yīng)用。 JCS和其他緩存系統(tǒng)一樣,也是一個用于高速讀取,低速寫入的應(yīng)用程序。 動態(tài)容和報表系統(tǒng)能夠獲得更好的性能。 假

17、如一個,有重復(fù)的結(jié)構(gòu),使用間歇性更新方式的數(shù)據(jù)庫(而不是連續(xù)不斷的更新數(shù)據(jù)庫), 被重復(fù)搜索出相同結(jié)果的,就能夠通過執(zhí)行緩存方式改進(jìn)其性能和伸縮性。 官方 /turbine/jcs/ EHCache EHCache是一個純java的在進(jìn)程中的緩存,它具有以下特性:快速,簡單,為Hibernate2.1 充當(dāng)可插入的緩存,最小的依靠性,全面的文檔和測試。 官方 JCache JCache是個開源程序,正在努力成為JSR-107開源規(guī),JSR-107規(guī)已經(jīng)很多年沒改變了。這 個版本仍然是構(gòu)建在最初的功能定義上。 官方 Shift One Shift One Ja

18、va Object Cache是一個執(zhí)行一系列嚴(yán)格的對象緩存策略的Java lib ,就像 個輕量級的配置緩存工作狀態(tài)的框架。 官方 SwarmCache SwarmCache是一個簡單且有效的分布式緩存,它使用ip multicast 與同一個局域網(wǎng)的其他 主機(jī)進(jìn)行通訊,是非凡為集群和數(shù)據(jù)驅(qū)動web應(yīng)用程序而設(shè)計的。SwarmCache能夠讓典型 的讀操作大大超過寫操作的這類應(yīng)用提供更好的性能支持。 SwarmCache使用JavaGroups來治理從屬關(guān)系和分布式緩存的通訊。 官方 TreeCache / JBossCache JBossCache是一個復(fù)制的事務(wù)處理緩存,它答應(yīng)你緩存企業(yè)級應(yīng)用數(shù)據(jù)來更好的改善性能。 緩存數(shù)據(jù)被自動復(fù)制,讓你輕松進(jìn)行JBoss服務(wù)器之間的集群工作。JBossCache能夠通過 JBoss應(yīng)用服務(wù)或其他 J2EE容器來運(yùn)行一個 MBean服務(wù),當(dāng)然,它也能獨(dú)立運(yùn)行。 JBossCache 包括兩個模塊:TreeCache 和 TreeCacheAOP。 Tr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論