Oscache使用手冊(cè)_第1頁(yè)
Oscache使用手冊(cè)_第2頁(yè)
Oscache使用手冊(cè)_第3頁(yè)
Oscache使用手冊(cè)_第4頁(yè)
Oscache使用手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、、簡(jiǎn)介Cache是一種用于提高系統(tǒng)響應(yīng)速度、改善系統(tǒng)運(yùn)行性能的技術(shù)。尤其是在 Web應(yīng)用中,通過(guò)緩存頁(yè)面的輸出結(jié)果,可以很顯著的改善系統(tǒng)運(yùn)行性能。OSCache標(biāo)記庫(kù)由OpenSymphony設(shè)計(jì),它是一種開(kāi)創(chuàng)性的緩存方案,它提供了在現(xiàn)有JSP頁(yè)面之內(nèi)實(shí)現(xiàn)內(nèi)存緩存的功能。OSCache是個(gè)一個(gè)被廣泛采用的高性能的J2EE緩存框架,OSCache還能應(yīng)用于任何 Java應(yīng)用程序的普通的緩存解決方案。OSCache是當(dāng)前運(yùn)用最廣的緩存方案,JBoss,Hibernate,Spring等都對(duì)其有支持。Oscache的使用非常方便,特別是jsp cache用的非常廣泛。Oscache的文檔中也對(duì)jsp

2、 cache tag的配置有詳細(xì)說(shuō)明。相關(guān)內(nèi)容請(qǐng)參考OSCache的在線文檔對(duì)使用Cache的測(cè)試結(jié)論:使用cache,隨著循環(huán)的增多,用時(shí)增長(zhǎng)較緩慢,而不使用cache基本是等比例增長(zhǎng)。在循環(huán)次數(shù)較多時(shí),使用 cache cpu利用率顯著提高,能達(dá)到90%以上。不使用cache則只能上到50%左右,更多是在等待數(shù)據(jù)庫(kù)返回結(jié)果。所以使用cache能大大減輕數(shù)據(jù)庫(kù)的壓力,提高應(yīng)用服務(wù)器的利用率,符合我們對(duì)應(yīng)用服務(wù)器進(jìn)行水平擴(kuò)展的要求。二、OSCache的特點(diǎn)和主要特征(一)、OSCache有以下特點(diǎn)1緩存任何對(duì)象:你可以不受限制的緩存部分jsp頁(yè)面或HTTP請(qǐng)求,任何java對(duì)象都可以緩存。2、

3、 擁有全面的 API : OSCache API允許你通過(guò)編程的方式來(lái)控制所有的OSCache特性。3、永久緩存:緩存能被配置寫(xiě)入硬盤(pán),因此允許在應(yīng)用服務(wù)器的多次生命周期間緩存創(chuàng)建 開(kāi)銷(xiāo)昂貴的數(shù)據(jù)。4、支持集群:集群緩存數(shù)據(jù)能被單個(gè)的進(jìn)行參數(shù)配置,不需要修改代碼。5、緩存過(guò)期:你可以有最大限度的控制緩存對(duì)象的過(guò)期,包括可插入式的刷新策略(如果 默認(rèn)性能不能滿足需要時(shí))。(二八主要特征1. 兼容多種支持JSP的web服務(wù)器已經(jīng)通過(guò)兼容測(cè)試的 web服務(wù)器包括 Orion Server (1.4.0或者以上版本)、Macromedia JRun (3.0或者以上版本)、BEA Weblogic (

4、7.x或者以上版本)、IBM Websphere (5.0版本)、 Silverstream (3.7.4 版本)、Caucho Res in (1.2.3 或者以上版本)、Tomcat (4.0 或者以上版本), 其他支持servlet2.3、jsp1.2的web服務(wù)器應(yīng)該都是完全兼容 OSCache的。2. 可選的緩存區(qū)你可以使用內(nèi)存、硬盤(pán)空間、同時(shí)使用內(nèi)存和硬盤(pán)或者提供自己的其他資源(需要自己提供適配器)作為緩存區(qū)。使用內(nèi)存作為緩存區(qū)將可以提供更好的性能使用硬盤(pán)作為緩存區(qū)可以在服務(wù)器重起后迅速恢復(fù)緩存內(nèi)容同時(shí)使用內(nèi)存和硬盤(pán)作為緩存區(qū)則可以減少對(duì)內(nèi)存的占用3. 靈活的緩存系統(tǒng)OSCache

5、支持對(duì)部分頁(yè)面內(nèi)容或者對(duì)頁(yè)面級(jí)的響應(yīng)內(nèi)容進(jìn)行緩存,編程者可以根據(jù)不同的需求、不同的環(huán)境選擇不同的緩存級(jí)別。4. 容錯(cuò)在一般的web應(yīng)用中,如果某個(gè)頁(yè)面需要和數(shù)據(jù)庫(kù)打交道,而當(dāng)客戶請(qǐng)求到達(dá)時(shí),web應(yīng)用和數(shù)據(jù)庫(kù)之間無(wú)法進(jìn)行交互, 那么將返回給用戶”系統(tǒng)出錯(cuò)”或者類(lèi)似的提示信息, 如果使 用了 OSCache的話,你可以使用緩存提供給用戶,給自己贏得維護(hù)系統(tǒng)或者采取其他補(bǔ)救的時(shí)間。其它特性還包括對(duì)集群的支持、 緩存主動(dòng)刷新等特性, 大家可以參考 OpenSymphony 網(wǎng)站上 的其他資源獲取更多的信息。、 OSCache 使用指南一、下載安裝OSCache 是一個(gè)基于 web 應(yīng)用的組件,他的安

6、裝工作主要是對(duì) web 應(yīng)用進(jìn)行配置,大概的 步驟如下:1. 下載、解壓縮 OSCache從 下載合適的 OSCache 版本, 解壓縮 下載的文件到指定目錄 。2、新建立一個(gè) web 應(yīng)用3、將 OSCache 集成到 web 項(xiàng)目當(dāng)中。(1)從解壓縮目錄取得 oscache.jar 文件放到 /WEB-INF/lib 或相應(yīng)類(lèi)庫(kù)目錄中, jar 文件名 可能含有版本號(hào)和該版本的發(fā)布日期信息等。( 2)將 perties、 oscache.tld 放入 WEB-INFclass 目錄(確切說(shuō)是放在項(xiàng)目的 src 目錄下,編譯的時(shí)候會(huì)自動(dòng)生成在 WEB-INFclass

7、目錄)。( 3)配置項(xiàng)目對(duì)應(yīng)的 perties 參數(shù)信息。(4)具體使用A、 緩存對(duì)象:直接調(diào)用API的接口即可(詳見(jiàn)Java用OSCache進(jìn)行緩存對(duì)象)B、 部分頁(yè)面緩存:使用 OSCache提供的taglib (修改 web.xml文件,在 web.xml文件中增 加 下 面 的 內(nèi) 容 , 增 加 對(duì) OSCache 提 供 的 taglib 的 支 持 : <taglib><taglib-uri>oscache</taglib-uri><taglib-location>/WEB-INF/classes/oscach

8、e.tld</taglib-location></taglib> 或者在 jsp 頁(yè)面使用以下標(biāo)簽<% taglib uri="/WEB-INF/classes/oscache.tld" prefix="cache"%> )C、整個(gè)頁(yè)面的緩存:用CashFilter實(shí)現(xiàn)頁(yè)面級(jí)緩存,可緩存單個(gè)文件、緩存URL pattern和自己設(shè)定緩存屬性的緩存。<filter> <filter-name>CacheFilter</filter-name><filter-class>co

9、m.opensymphony.oscache.web.filter.CacheFilter</filter-class><init-param><param-name>time</param-name><param-value>600</param-value></init-param><init-param><param-name>scope</param-name> <param-value>session</param-value> </i

10、nit-param></filter><filter-mapping><filter-name>CacheFilter</filter-name><!- 對(duì)所有 jsp 頁(yè)面內(nèi)容進(jìn)行緩存 -><url-pattern>*.jsp</url-pattern></filter-mapping> 注 只有客戶訪問(wèn)時(shí)返回 http 頭信息中代碼為 200(也就是訪問(wèn)已經(jīng)成功) 的頁(yè)面信息才能 夠被緩存4、配置日志輸出信息。二、 perties 文件配置向?qū)

11、erties 中的配置項(xiàng)詳解 :1、cache.memory:是否使用內(nèi)存緩存;true或false。默認(rèn)為true;如設(shè)置為false,那cache只能緩存到數(shù)據(jù)庫(kù) 或硬盤(pán)中。2、cache.capacity緩存的最大數(shù)量。默認(rèn)是不限制,cache不會(huì)移走任何緩存內(nèi)容。負(fù)數(shù)被視不限制。3、cache.algorithm運(yùn)算規(guī)則。為了使用規(guī)則,cache的size必須是指定的。如果cache的size不指定的話,將不會(huì)限制緩存對(duì)象的大小。如果指定了cache的size,但不指定 algorithm ,那它會(huì)默認(rèn)使用 :com.opensymphony.oscache.base.algorith

12、m.LRUCache 有下面三種規(guī)則:com.opensymphony.oscache.base.algorithm.LRUCache:last in first out( 最后插入的最先調(diào)用)。默認(rèn)選項(xiàng)。com.opensymphony.oscache.base.algorithm.FIFOCache:first int first out( 最先插入的最先調(diào)用 )。 com.opensymphony.oscache.base.algorithm.UnlimitedCache :cache中的內(nèi)容將永遠(yuǎn)不會(huì)被丟棄。如果 cache.capacity 不指定值的話,它將被設(shè)為默認(rèn)選項(xiàng)。4、ca

13、che.blocking是否同步。true或者false。一般設(shè)為true,避免讀取臟數(shù)據(jù)。5、cache.unlimited.disk指定硬盤(pán)緩存是否要作限制。默認(rèn)值為false。 false 的狀況下, disk cache capacity 和cache.capacity 的值相同。6、cache.persistence.class指定類(lèi)是被持久化緩存的類(lèi)。class必須實(shí)現(xiàn) PersistenceListener接口。作為硬盤(pán)持久,可以實(shí)現(xiàn)com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListen

14、er 接口。它把class的toString()輸出的hash值作為文件的名稱(chēng)。如果你要想文件名易讀些(自己設(shè)定),DiskPersistenceListener 的父類(lèi)也能使用,但其可能有非法字符或者過(guò)長(zhǎng)的名字。注意:HashDiskPersistenceListener 禾口 DiskPersistenceListener 需要設(shè)定硬盤(pán)路徑:cache.path7、cache.path指定硬盤(pán)緩存的路徑。目錄如果不存在將被建立。同時(shí)注意oscache應(yīng)該要有權(quán)限寫(xiě)文件系統(tǒng)。例:cache.path=c:myappcache cache.path=/opt/myapp/cache8、cach

15、e.persistence.overflow.only (NEW! Since 2.1) 指定是否只有在內(nèi)存不足的情況下才使用硬盤(pán)緩存。默認(rèn)值false。但推薦是true如果內(nèi)存cache被允許的話。這個(gè)屬性徹底的改變了cache的行為,使得 persisted cache禾口 memory 是完全不同。9、cache.event.listenersclass名列表(用逗號(hào)隔開(kāi))。每個(gè)class必須實(shí)現(xiàn)以下接口中的一個(gè)或者幾個(gè)CacheEntryEventListener :接收 cache add/update/flush and remove 事件 CacheMapAccessEventL

16、istener :接收cache訪問(wèn)事件。這個(gè)可以讓你跟蹤cache怎么工作。默認(rèn)是不配置任何 class的。當(dāng)然你可以使用一下的class:*com.opensymphony.oscache.plugins.clustersupport.BroadcastingCacheEventListener : 分 布 式 的監(jiān)聽(tīng)器。可以廣播到局域網(wǎng)內(nèi)的其他cache實(shí)例。* com.opensymphony.oscache.extra.CacheEntryEventListenerImpl : 一個(gè)簡(jiǎn)單的監(jiān)聽(tīng)器。 在 cache 的生命周期中記錄所有 entry 的事件。* com.opensymp

17、hony.oscache.extra.CacheMapAccessEventListenerImpl : 記錄 count of cache map events( cache hits, misses and state hits).10、cache.key在application和session的作用域時(shí) 用于標(biāo)識(shí)cache對(duì)象的,用于ServletCacheAdministrator;此屬性不是指定為 "_oscache_cache"格式時(shí)為默認(rèn)值,如果代碼中需要用到默認(rèn)值時(shí)可以通使用com.opensymphony.oscache.base.Const.DEFAUL

18、T_CACHE_KEY 來(lái)取得 ;11、cache.use.host.domain.in.key當(dāng)配置多個(gè)服務(wù)器時(shí),想通過(guò)服備器名稱(chēng)自動(dòng)生成cache key時(shí),可將此屬性設(shè)為true.默認(rèn)值為 false;12、Additional Properties在以上基礎(chǔ)選項(xiàng)之上可以加入一些額外的屬性到此文件中 .例: JavaGroupsBroadcastingListener 便是額外的 .13、cache.cluster.multicast.ip用于緩存集群 . 默認(rèn)為 3214、perties指集群中的額外配置項(xiàng) . 以下是默認(rèn)設(shè)置 :

19、(此屬性的相關(guān)說(shuō)將在集群文檔中說(shuō)明)UDP(mcast_addr=32;mcast_port=45566;ip_ttl=32; mcast_send_buf_size=150000;mcast_recv_buf_size=80000):PING(timeout=2000;num_initial_members=3):MERGE2(min_interval=5000;max_interval=10000):FD_SOCK:VERIFY_SUSPECT(timeout=1500):pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,6

20、00,1200,2400,4800;max_xmit_size=8192):UNICAST(timeout=300,600,1200,2400):pbcast.STABLE(desired_avg_gossip=20000):FRAG(frag_size=8096;down_thread=false;up_thread=false): pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)三、OSCache的基本用法(緩存JSP頁(yè)面中部分)(一): Cache-OSCache

21、提供的緩存標(biāo)簽這是 OSCache 提供的標(biāo)簽庫(kù)中最重要的一個(gè)標(biāo)簽,包括在標(biāo)簽中的內(nèi)容將應(yīng)用緩存機(jī)制進(jìn) 行處理,處理的方式將取決于編程者對(duì)cache 標(biāo)簽屬性的設(shè)置。第一次請(qǐng)求到達(dá)時(shí), 標(biāo)簽中的內(nèi)容被處理并且緩存起來(lái), 當(dāng)下一個(gè)請(qǐng)求到達(dá)時(shí), 緩存系統(tǒng)會(huì) 檢查這部分內(nèi)容的緩存是否已經(jīng)失效,主要是以下幾項(xiàng):1. 緩存時(shí)間超過(guò)了 cache 標(biāo)簽設(shè)置的 time 或者 duration 屬性規(guī)定的超時(shí)時(shí)間2. cron 屬性規(guī)定的時(shí)間比緩存信息的開(kāi)始時(shí)間更晚3. 標(biāo)簽中緩存的內(nèi)容在緩存后又被重新刷新過(guò)4. 其他緩存超期設(shè)定如果符合上面四項(xiàng)中的任何一項(xiàng), 被緩存的內(nèi)容視為已經(jīng)失效, 這時(shí)被緩存的內(nèi)容將

22、被重新 處理并且返回處理過(guò)后的信息, 如果被緩存的內(nèi)容沒(méi)有失效, 那么返回給用戶的將是緩存中 的信息。cache 標(biāo)簽的屬性說(shuō)明 :key -標(biāo)識(shí)緩存內(nèi)容的關(guān)鍵詞。在指定的作用范圍內(nèi)必須是唯一的。默認(rèn)的key是被訪問(wèn)頁(yè)面的 URI 和后面的請(qǐng)求字符串。你可以在同一個(gè)頁(yè)面中使用很多 cache標(biāo)簽而不指定他的key屬性,這種情況下系統(tǒng)使用該 頁(yè)面的 URI 和后面的請(qǐng)求字符串,另外再自動(dòng)給這些 key 增加一個(gè)索引值來(lái)區(qū)分這些緩存 內(nèi)容。但是不推薦采用這樣的方式。scope - 緩存發(fā)生作用的范圍,可以是 application或者sessiontime -緩存內(nèi)容的時(shí)間段,單位是秒,默認(rèn)是36

23、00秒,也就是一個(gè)小時(shí),如果設(shè)定一個(gè)負(fù)值,那么這部分被緩存的內(nèi)容將永遠(yuǎn)不過(guò)期。duration -指定緩存內(nèi)容失效的時(shí)間,是相對(duì) time的另一個(gè)選擇,可以使用簡(jiǎn)單日期格式或者符合 USO-8601 的日期格式。如:duration= ” PT5M ” duration= ” 5s” 等 refresh false 或者 true。如果refresh屬性設(shè)置為true,不管其他的屬性是否符合條件,這部分被緩存的內(nèi)容都將被 更新,這給編程者一種選擇,決定什么時(shí)候必須刷新。mode -如果編程者不希望被緩存的內(nèi)容增加到給用戶的響應(yīng)中,可以設(shè)置mode屬性為"silent"其它可

24、用的屬性還包括: cron 、groups、language、refreshpolicyclass、refreshpolicyparam 。 上面的這些屬性可以單獨(dú)使用, 也可以根據(jù)需要組合使用, 下面的例子將講解這些常用屬性 的使用方式。(二)Cache標(biāo)簽實(shí)例分析:1. 最簡(jiǎn)單的 cache 標(biāo)簽用法使用默認(rèn)的關(guān)鍵字來(lái)標(biāo)識(shí) cache內(nèi)容,超時(shí)時(shí)間是默認(rèn)的 3600秒<cache:cache><% /自己的JSP代碼內(nèi)容 %></cache:cache>2. 用自己指定的字符串標(biāo)識(shí)緩存內(nèi)容,并且設(shè)定作用范圍為session。<cache:cache

25、 key="foobar" scope="session"><% /自己的JSP代碼內(nèi)容 %></cache:cache>3. 動(dòng)態(tài)設(shè)定 key 值,使用自己指定的 time 屬性設(shè)定緩存內(nèi)容的超時(shí)時(shí)間,使用動(dòng)態(tài) refresh 值決定是否強(qiáng)制內(nèi)容刷新。因?yàn)?OSCache 使用 key 值來(lái)標(biāo)識(shí)緩存內(nèi)容,使用相同的 key 值將會(huì)被認(rèn)為使用相同的的緩 存內(nèi)容, 所以使用動(dòng)態(tài)的 key 值可以自由的根據(jù)不同的角色、 不同的要求決定使用不同的緩 存內(nèi)容。<cache:cache key="<%= prod

26、uct.getId() %>" time="1800" refresh="<%= needRefresh %>"><% / 自己的 JSP 代碼內(nèi)容 %></cache:cache>4. 設(shè)置 time 屬性為負(fù)數(shù)使緩存內(nèi)容永不過(guò)期<cache:cache time="-1"><% / 自己的 JSP 代碼內(nèi)容 %></cache:cache>5. 使用 duration 屬性設(shè)置超期時(shí)間<cache:cache duration=”

27、PT5M”><% / 自己的 JSP 代碼內(nèi)容 %></cache:cache>6. 使用 mode 屬性使被緩存的內(nèi)容不加入給客戶的響應(yīng)中<cache:cache mode= '' silent ”><% / 自己的 JSP 代碼內(nèi)容 %></cache:cache>(三)緩存過(guò)濾器 CacheFilter用 CashFilter 實(shí)現(xiàn)頁(yè)面級(jí)緩存在 OSCache 組件中提供了一個(gè) CacheFilter 用于實(shí)現(xiàn)頁(yè)面級(jí)的緩存,主要用于對(duì) web 應(yīng)用中 的某些動(dòng)態(tài)頁(yè)面進(jìn)行緩存,尤其是那些需要生成 pdf 格式

28、文件 /報(bào)表、圖片文件等的頁(yè)面, 不僅減少了數(shù)據(jù)庫(kù)的交互、減少數(shù)據(jù)庫(kù)服務(wù)器的壓力,而且對(duì)于減少 web 服務(wù)器的性能消 耗有很顯著的效果。這種功能的實(shí)現(xiàn)是通過(guò)在 web.xml 中進(jìn)行配置來(lái)決定緩存哪一個(gè)或者一組頁(yè)面, 而且還可以 設(shè)置緩存的相關(guān)屬性,這種基于配置文件的實(shí)現(xiàn)方式對(duì)于 J2EE 來(lái)說(shuō)應(yīng)該是一種標(biāo)準(zhǔn)的實(shí)現(xiàn) 方式了。 注 只有客戶訪問(wèn)時(shí)返回 http 頭信息中代碼為 200(也就是訪問(wèn)已經(jīng)成功) 的頁(yè)面信息才能 夠被緩存1. 緩存單個(gè)文件修改 web.xml ,增加如下內(nèi)容,確定對(duì) /testContent.jsp 頁(yè)面進(jìn)行緩存。<filter> <filter-n

29、ame>CacheFilter</filter-name><filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> </filter> <filter-mapping><filter-name>CacheFilter</filter-name><!-對(duì)/testContent.jsp頁(yè)面內(nèi)容進(jìn)行緩存-><url-pattern>/testContent.jsp</url-patte

30、rn></filter-mapping>2. 緩存 URL pattern修改 web.xml ,增加如下內(nèi)容,確定對(duì) *.jsp 頁(yè)面進(jìn)行緩存。<filter> <filter-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> </filter> <filter-mapping><filter-name>CacheF

31、ilter</filter-name><!-對(duì)所有jsp頁(yè)面內(nèi)容進(jìn)行緩存-><url-pattern>*.jsp</url-pattern></filter-mapping>3. 自己設(shè)定緩存屬性在頁(yè)面級(jí)緩存的情況下, 可以通過(guò)設(shè)置 CacheFilter 的初始屬性來(lái)決定緩存的一些特性: time 屬性設(shè)置緩存的時(shí)間段,默認(rèn)為 3600 秒,可以根據(jù)自己的需要只有的設(shè)置,而 scope 屬性 設(shè)置,默認(rèn)為 application ,可選項(xiàng)包括 application 、session<filter> <filter

32、-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <param-name>time</param-name><param-value>600</param-value></init-param><init-param><param-name>scope</par

33、am-name><param-value>session</param-value></init-param></filter><filter-mapping> <filter-name>CacheFilter</filter-name><!-對(duì)所有 jsp 頁(yè)面內(nèi)容進(jìn)行緩存 -><url-pattern>*.jsp</url-pattern></filter-mapping>四、 demo一、對(duì)象緩存1、Cache 操作類(lèi)import java.util.

34、Date;import com.opensymphony.oscache.base.NeedsRefreshException;import com.opensymphony.oscache.general.GeneralCacheAdministrator;public class BaseCache extends GeneralCacheAdministrator private int refreshPeriod; / 過(guò)期時(shí)間 (單位為秒 );private String keyPrefix; / 關(guān)鍵字前綴字符 ;private static final long serialVe

35、rsionUID = -4397192926052141162L;public BaseCache(String keyPrefix,int refreshPeriod) super();this.keyPrefix = keyPrefix; this.refreshPeriod = refreshPeriod;/添加被緩存的對(duì)象 ;public void put(String key,Object value)this.putInCache(this.keyPrefix+&quot;_&quot;+key,value); /刪除被緩存的對(duì)象 ; public void rem

36、ove(String key) this.flushEntry(this.keyPrefix+&quot;_&quot;+key); /刪除所有被緩存的對(duì)象 ; public void removeAll(Date date) this.flushAll(date);public void removeAll() this.flushAll();/獲取被緩存的對(duì)象 ;public Object get(String key) throws Exception tryreturn this.getFromCache(this.keyPrefix+&quot;_&q

37、uot;+key,this.refreshPeriod); catch (NeedsRefreshException e) this.cancelUpdate(this.keyPrefix+&quot;_&quot;+key);throw e;2、Cache 管理類(lèi)public class CacheManager private BaseCache newsCache; private static CacheManager instance; private static Object lock = new Object(); private CacheManager()

38、/這個(gè)根據(jù)配置文件來(lái),初始 BaseCache 而已 ; newsCache = new BaseCache("news",120);public static CacheManager getInstance() if (instance = null) synchronized( lock ) if (instance = null) instance = new CacheManager(); return instance;public void putUser(User news) newsCache.put(news.getId()+"",n

39、ews); public void removeUser(String newsID) newsCache.remove(newsID); public User getUser(int newsID) try return (User) newsCache.get(newsID+""); catch (Exception e) System.out.println("getNews>>newsID"+newsID+">>"+e.getMessage(); User news = new User(newsID

40、);this.putUser(news);return news;public void removeAllNews() newsCache.removeAll();3、對(duì)象 Bean public class User private int id;private String name;private String sex;private int age;private Date accessTime; public User(int id) super();this.id = id;this.accessTime = new Date(System.currentTimeMillis()

41、;public String toString() return "User info is : id=" + id + " accessTime="+ accessTime.toString();public User(String name, String sex, int age) super(); = name; this.sex = sex; this.age = age;public User() public int getAge() return age;public void setAge(int age) this.

42、age = age;public String getName() return name;public void setName(String name) = name;public String getSex() return sex;public void setSex(String sex) this.sex = sex;public int getId() return id;public void setId(int id) this.id = id;public Date getAccessTime() return accessTime;public voi

43、d setAccessTime(Date accessTime) this.accessTime = accessTime;4、測(cè)試類(lèi)public class TestObjectCache public static void main(String args) CacheManager cm=CacheManager.getInstance();TestObjectCache test=new TestObjectCache(); test.print(cm);public void print(CacheManager cm)User user=null;for (int i = 0;

44、i < 1000; i+) user=cm.getUser(100);System.out.println("<<"+i+">>: "+user); if(i=10)/刪除緩存 id 的對(duì)象 cm.removeUser(100+"");if(i=20)/刪除所有緩存的對(duì)象 cm.removeAllNews();/ 睡眠部分try Thread.sleep(30000); catch (Exception e) 五、小結(jié)及引申緩存是在提升系統(tǒng)響應(yīng)時(shí)常用的一種技術(shù), 在系統(tǒng)緩存上通常采用的是有頁(yè)面緩存、 處理

45、緩 存和數(shù)據(jù)緩存這三種具體的類(lèi)別, 應(yīng)該說(shuō)這三種緩存在實(shí)現(xiàn)上還是稍有不同, 盡管底層的緩 存實(shí)現(xiàn)是一樣的。頁(yè)面緩存 頁(yè)面緩存是指對(duì)頁(yè)面中的內(nèi)容片斷進(jìn)行緩存的方案。 比如頁(yè)面中有一個(gè)部分是顯示欄目中的 內(nèi)容的, 那么就可以緩存這個(gè)部分, 在進(jìn)行第二次請(qǐng)求的時(shí)候就直接從緩存中取出這部分的 內(nèi)容 (其實(shí)就是這部分的 html 了 ) ,這種情況下,緩存的作用其實(shí)非常明顯,在典型的 action+service+dao 這樣的結(jié)構(gòu)中,在采用頁(yè)面緩存后就意味著不需要經(jīng)過(guò)action 、 service、dao這些層次的處理了,而是直接就返回了,對(duì)于系統(tǒng)響應(yīng)速度的提升來(lái)說(shuō)是非常明顯的。頁(yè)面緩存通常采用 o

46、scache來(lái)進(jìn)行實(shí)現(xiàn),oscache提供了一個(gè)jsp tag,可通過(guò)這個(gè)tag來(lái)包 含需要緩存的內(nèi)容部分, 當(dāng)然,緩存的這個(gè)內(nèi)容部分需要有對(duì)服務(wù)器的請(qǐng)求或邏輯計(jì)算等的, 可想而知,去緩存一段靜態(tài) html 是沒(méi)有意義的。其次需要定義緩存的這段內(nèi)容的key,例如我們要去緩存頁(yè)面中某個(gè)欄目的某頁(yè)的內(nèi)容,對(duì)于這段內(nèi)容而言唯一的key就是欄目ID以及當(dāng)前頁(yè)數(shù),這樣就組成了這段緩存的key 了,其實(shí)這個(gè)部分看起來(lái)好像是很簡(jiǎn)單, 但有些時(shí)候會(huì)很麻煩, 要仔細(xì)的想清楚這段內(nèi)容的唯一 的標(biāo)識(shí)的key到底是什么,A_A,通常的做法其實(shí)可以從action中需要獲取的參數(shù)或 service接口的參數(shù)來(lái)決定.頁(yè)面緩

47、存中還需要做的一個(gè)步驟就是通知緩存需要更新,頁(yè)面緩存和其他緩存稍有不同, 需要告訴它, 這個(gè)時(shí)候不能再使用緩存中的內(nèi)容了, 需要從后臺(tái)再重新獲取來(lái)生成新的緩存內(nèi) 容,這個(gè)其實(shí)很簡(jiǎn)單, 因?yàn)楹茈y在后臺(tái)發(fā)生變化的時(shí)候自己來(lái)更新緩存的內(nèi)容,只能是去通知它,然后讓它再次發(fā)起請(qǐng)求來(lái)生成新的內(nèi)容放入緩存中。頁(yè)面的緩存的使用對(duì)于系統(tǒng)的響應(yīng)速度確實(shí)會(huì)有很大的提升,在實(shí)現(xiàn)頁(yè)面緩存時(shí)最麻煩的主要是緩存的 key 的定義以及緩存更新的通知,緩存 key 的定義這個(gè)自然框架是沒(méi)法解決的, 不過(guò)緩存更新的通知其實(shí)在框架中可以考慮一種通知模型的,a_a ,就像事件通知那樣 .在實(shí)際的項(xiàng)目中, 可以自己去實(shí)現(xiàn)一個(gè)這樣的通知

48、模型或者就是簡(jiǎn)單的采用單例方式來(lái)標(biāo)識(shí) 某個(gè) key 是否需要更新。頁(yè)面緩存在實(shí)際的項(xiàng)目中使用非常的多。處理緩存處理緩存是指對(duì)于 action、service、dao 或者系統(tǒng)層次中的某方法進(jìn)行緩存,說(shuō)直接點(diǎn),就 是對(duì)某個(gè)類(lèi)的某個(gè)方法的結(jié)果做緩存, 這樣在下次進(jìn)行完全相同的請(qǐng)求的時(shí)候就可以直接取 緩存了,這種響應(yīng)速度的提升也是非常明顯的。處理緩存在現(xiàn)在的情況下其實(shí)采用任務(wù)的緩存工具包都可以實(shí)現(xiàn),如oscache、ehcache、jbosscache 等,但目前還沒(méi)有處理緩存框架的出現(xiàn),這個(gè)和處理緩存是否應(yīng)該存在的意義也是有關(guān)系的,處理緩存框架要做到的其實(shí)就像攔截一樣的方式,和 oscache t

49、ag 類(lèi)似。 同樣,處理緩存的麻煩也在于怎么樣去定義這個(gè)key,很多情況下可以根據(jù)方法的輸入作為key,方法的輸出作為 key的值,但也會(huì)有其他一些復(fù)雜的情況,這個(gè)時(shí)候定義key就會(huì)變得復(fù)雜些了。處理緩存同樣有通知更新緩存的情況,和頁(yè)面緩存基本是一樣的。應(yīng)該說(shuō), 處理緩存和頁(yè)面緩存非常的相似, 從實(shí)現(xiàn)上來(lái)說(shuō)基本是完全一致的, 在使用上來(lái)講 處理緩存使用的好像不多。數(shù)據(jù)緩存數(shù)據(jù)緩存估計(jì)大家都很熟悉,就是對(duì)系統(tǒng)的數(shù)據(jù)進(jìn)行緩存的方式,典型的就是Hibernate 的一級(jí)、二級(jí)數(shù)據(jù)緩存。數(shù)據(jù)緩存在實(shí)現(xiàn)上如果是用 hibernate 的話更多的是直接使用 hibernate 的一級(jí)、二級(jí)以及查 詢緩存,

50、如果自己要實(shí)現(xiàn)的話可以去參考 hibernate 的實(shí)現(xiàn)機(jī)制。數(shù)據(jù)緩存的 key 在一級(jí)、 二級(jí)緩存中采用的都是數(shù)據(jù)的標(biāo)識(shí)鍵的值的方式, 查詢緩存采用的 是查詢參數(shù)、查詢語(yǔ)句的方式。數(shù)據(jù)緩存的更新則是 hibernate 在進(jìn)行存儲(chǔ)時(shí)直接更新緩存的內(nèi)容,而對(duì)于查詢緩存則是采 用全部直接清除的方式,這樣在下次進(jìn)行查詢時(shí)自然會(huì)重新去查詢,A_A,大家可能會(huì)想,為什么頁(yè)面緩存和處理緩存不采用這樣的方式來(lái)實(shí)現(xiàn)緩存的更新,稍微想想就知道了, 在后臺(tái)發(fā)生改變的時(shí)候其實(shí)是不知道需要移除哪些 key 的,所以 hibernate 為了避免這個(gè)麻煩, 采用的就是當(dāng)數(shù)據(jù)一旦發(fā)生改變的時(shí)候就清除全部的查詢緩存,而不是只去清除相關(guān)的緩 存,其實(shí)這里可以采用一種訂閱式的模型,呵呵,當(dāng)然,也增加了框架的復(fù)雜度。 數(shù)據(jù)緩存使用的應(yīng)該是最多的,效果也是很明顯的。以上三種緩存是目前緩存實(shí)現(xiàn)時(shí)通常碰到的三種狀況,里面按使用的多少來(lái)排序應(yīng)該是: 數(shù)據(jù)緩存、頁(yè)面緩存和處理緩存; 實(shí)現(xiàn)的難度上從難到易的順序應(yīng)該是: 處理緩存、 頁(yè)面緩存、 數(shù)據(jù)緩存; 對(duì)于系統(tǒng)響應(yīng)速度提升的效果來(lái)說(shuō)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論