OScached页面缓存的入门使用
OSCache的使用:
一,環(huán)境的搭建:
?1,把oscache.jar?file放在?/WEB-INF/lib?目錄下(Put?the?oscache.jar?file?in?the?/WEB-INF/lib?directory)
2,如果commons-logging.jar文件不存在,也要把它放進/WEB-INF/lib?目錄下
3,把/etc/oscache.properties放進類路徑下
注意:Remember?to?escape?any?\?characters?in?Windows?paths?-?e.g.?if?you?want?cache?files?to?go?in?c:\cachedir,?the?cache.path?property?should?be?set?to?c:\?\cachedir.
二,OSCache?處理一個servlet?Filter,使你能夠很容易的緩存你網(wǎng)站的整個頁面,甚至是二進制數(shù)據(jù),二進制文件的緩存非常有用當(dāng)他們被動態(tài)產(chǎn)生。
配置Filter:
Example1:時間是10minutes?scope:Session
<filter>
????<filter-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</param-name>
????????<param-value>session</param-value>
????</init-param>
</filter>
<filter-mapping>
????<filter-name>CacheFilter</filter-name>
????<url-pattern>*.jsp</url-pattern>
</filter-mapping>
Example2:默認緩存的scope是application,時間是一個小時
<filter>
????<filter-name>CacheFilterStaticContent</filter-name>
????<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
????<init-param>
????????<param-name>expires</param-name>
????????<param-value>time</param-value>
????</init-param>
</filter>
<filter-mapping>
????<filter-name>CacheFilterStaticContent</filter-name>
????<url-pattern>*.jsp</url-pattern>
</filter-mapping>
三?標(biāo)簽:
<%@?taglib?uri="http://www.opensymphony.com/oscache"?prefix="cache"?%>
主要的標(biāo)簽有:
·?cache-?The?main?caching?tag
·?usecached-?A?nested?tag?to?force?using?a?cached?version.
·?flush-?To?flush?caches?programmatically.
·?addgroup-?It?allows?a?single?group?name?to?be?dynamically?added?to?a?cached?block.?This?tag?must?be?nested?inside?<cache:cache/>.
·?addgroups-?It?allows?a?comma-delimited?list?of?group?names?to?be?dynamically?added?to?a?cached?block.?This?tag?must?be?nested?inside?<cache:cache/>.
1.cache是OSCache主要的標(biāo)簽。根據(jù)指定的屬性,標(biāo)簽的體將被緩存。以后每次運行標(biāo)簽,它會檢查,看看緩存的內(nèi)容是否過期,如果下列條件成立的話,標(biāo)簽體的內(nèi)容將被認為是過時的:
???1:標(biāo)簽體的內(nèi)容超過了指定的緩存時間;默認為一小時,指定時以s為單位。
???2:超多了cron屬性指定的日期或時間;
???3:通過flush標(biāo)簽,清除了指定的scope作用域的緩存。
如果緩存的主體內(nèi)容是過期的,標(biāo)簽會再次執(zhí)行和緩存新的主體內(nèi)容。
屬性:
①?Key:這應(yīng)該是為給定的范圍內(nèi)唯一的,因為重復(fù)的鍵映射到相同的緩存條目,因為緩存存放在map集合里面。key的默認值為使用URI轉(zhuǎn)義版本和當(dāng)前頁面的查詢字符串(默認值使用的URI轉(zhuǎn)義版本和當(dāng)前頁面的查詢字符串)。
②?scope:緩存存放的作用域,默認為application。可選的值為session和application。
③?time:指定緩存存放的時間,以秒為單位,默認為3600s,即一個小時。如果為負值表示永遠不過期。
④?duration:這是和time屬性二選一的。Duration可以通過simple?date?format指定。
⑤?cron:cron表達式確定緩存的內(nèi)容什么時候過期,它允許緩存的內(nèi)容在特殊的日期或時間過期,而不是當(dāng)緩存的內(nèi)容達到某個年齡。
介紹cron表達式:cron表達式的語法:
???????cron表達式由下面5個字段組成:
Minute:指定緩存的內(nèi)容在小時的第幾分鐘過期,取值范圍是0-59;
Hour:指定緩存的內(nèi)容在一天的第幾個小時將過期,這是指定使用24小時制,因此取值范圍是:0(午夜)-23(上午11點)。
DOM:一個月的第幾天。這是一個從1到31的數(shù),它表示緩存的內(nèi)容什么日子過期,如:在每月的10號過期,應(yīng)該把值設(shè)為10。
Month:一年的第幾月使內(nèi)容過期,它可以通過數(shù)字1-12或者月的英文名字(eg?'January')指定。月的名稱對大小寫是不敏感的,只考慮前三個字符,其他部分忽略。
DOW:一周的第幾天使緩存的內(nèi)容過期,它可以是數(shù)字(0-6,0=星期天,6=星期六)或者是英文的星期名稱。和月份一樣大小寫是不敏感的,只考慮前三個字符,其他部分忽略。
注意:當(dāng)你不想給某個字段給定特定的值,你可以使用"*"代替。
OSCache的也允許你選擇性地指定每個字段內(nèi)的列表,范圍和時間間隔(甚至是三者的結(jié)合)
List:集合中的列表項通過","分隔,緩存過期的時間和每個列表項匹配,例如:"0,15,30,45?*?*?*?*",表示緩存中的內(nèi)容每隔15分鐘過期一次。
Ranges:使用"-"指定范圍。一個范圍將包括所有值從開始到結(jié)束值(包括起始值)例如:?"*?*?*?Jan-June?*"表示一年的前六個月緩存將過期。?Intervals:一個間隔通過"/"指定。左邊的“/”字符的值表示的出發(fā)點或范圍值應(yīng)遞增超過,而右邊的值表示間隔的時間長度。例如:"10/20?*?*?*?*"?相當(dāng)于?"10,30,50?*?*?*?*",?而"10-45/20?*?*?*?*"?只匹配過去每個小時的10-30分鐘,因為50已經(jīng)超過了范圍。
⑥?refresh:布爾值,如為true緩存將被刷新,不管緩存的內(nèi)容是否過期。使你能決定是否重新緩存內(nèi)容。
⑦?mode:如果把值設(shè)置為"silent",將防止標(biāo)簽體被寫入到輸出流。
⑧?groups:用逗號分隔組里面的名稱,根據(jù)你的需要允許把緩存的條目分組。分組是非常有用的當(dāng)你的緩存內(nèi)容依賴應(yīng)用或數(shù)據(jù)的其他部分,當(dāng)這些依賴發(fā)生變化,flush相關(guān)的組將將導(dǎo)致所有緩存的條目在組中過期。
假設(shè)我們有一個類別的動態(tài)清單,我們從數(shù)據(jù)庫中拉,我們也偶爾得到更新,通過調(diào)用一個WebService存儲外幣兌換利率。假設(shè),我們也有一些
內(nèi)容,顯示有關(guān)類別和當(dāng)前的匯率值的信息。下面緩存緩存主體內(nèi)容的例子分配給2個緩存組?"currencyData"和"categoryList"。當(dāng)匯率和類別
列表發(fā)生更新,相關(guān)的組將被flush因為這些內(nèi)容(與任何其他與該組相關(guān)的內(nèi)容)被過期了,然后當(dāng)頁面被訪問的時候,再次建立緩存。
<cache:cache?key="<%=?product.getId()?%>"?time="-1"?group="currencyData,?categories">
?????????...?display?category?list?...
?????????...?display?currency?information?...
?</cache:cache>
2,usecached?這個標(biāo)簽內(nèi)嵌在一個<cache>標(biāo)簽中,表示<cache>標(biāo)簽是否使用cached?version
屬性:use:默認值為true,表示使用cached?version,這是有用的對于編程式控制緩存。
例如:
This?is?a?good?example?of?error?tolerance.?If?an?exception?occurs,?the?cached?version?of?this?content?will?be?output?instead.這是很好的容錯例子,當(dāng)異常發(fā)生緩存的內(nèi)容將不會被輸出。
????<cache:cache>
?????????<%?try?{?%>
?????????...?some?jsp?content?...
?????????<%?}?catch?(Exception?e)?{?%>
??????????????<cache:usecached?/>
?????????<%?}?%>
????</cache:cache>
例如:<cache:cache>??
<%out.print(new?Date());?%>?
<cache:usecached?use="true"/>??
??</cache:cache>
第一次訪問的時候頁面輸出:Missing?cached?content?,如果接著把use改為false則會輸出當(dāng)前時間,當(dāng)flush時,時間會改變。接著把use改為true,即使flush,時間也不會改變,它還會使用以前的緩存。
3,flush?
這個標(biāo)簽是用來在運行時刷新緩存。這是特別有用,因為它可以將您的網(wǎng)站的管理部分編碼,以便管理員可以決定何時刷新緩存。
屬性:
Scope:這決定哪些范圍將被刷新。有效值是“application”,“session”和null。空范圍將刷新所有緩存,不論其范圍。默認為all。
Key:當(dāng)同時指定了key和scope,表示一個緩存條目被標(biāo)記為flush。當(dāng)他下次被訪問的時候緩存將被refresh。當(dāng)僅指定了key而沒有指定scope這是無效的。
group?:指定一組將導(dǎo)致組中的所有緩存項被flush,如果僅僅指定group沒有指定scope這是無效的。
4,addgroup?必須內(nèi)嵌在<cache:cache>標(biāo)簽內(nèi)部,它允許一個組名,動態(tài)地添加到緩存的塊中,
這將以key為test1的cache塊增加到組group1和group2:
?<cache:cache?key="test1">
?????????<cache:addgroup?group="group1"?/>
?????????...?some?jsp?content?...
?????????<cache:addgroup?group="group2"?/>
?????????...?some?more?jsp?content?...
????</cache:cache>
5,addgroups?必須內(nèi)嵌在<cache:cache>標(biāo)簽內(nèi)部,
This?will?add?the?cache?block?with?the?key?'test1'?to?groups?'group1'?and?'group2'.
????<cache:cache?key="test1">
?????????...?some?jsp?content?...
?????????<cache:addgroups?groups="group1,group2"?/>
?????????...?some?jsp?content?...
</cache:cache>
四?屬性文件的配置:
介紹僅涵蓋了OSCache的配置,使用的oscache.properties文件,下面的屬性能夠被設(shè)置在oscache.properties文件中:
Cache.memory:
有效值是真的還是假的,默認值為true。如果你想禁用內(nèi)存緩存,只需要注釋掉或刪除此行。
禁用內(nèi)存和磁盤緩存是可能的,而且相當(dāng)愚蠢。
Cache.capacity:
緩存支持緩存條目的最大數(shù)量,默認情況下,容量是無限的。緩存將不會刪除任何緩存條目。負的值也將意味著無限容量。
Cache.algorithm:
使用默認的緩存算法。請注意,為了使用一種算法,還必須指定緩存的大小,如果未指定緩存的大小,緩存算法將是無限的緩存,而不管這個屬性的值,如果你指定了大小,但沒有指定算法,所使用的緩存算法將為com.opensymphony.oscache.base.algorithm.LRUCache。
OSCache的目前帶有三種算法:
com.opensymphony.oscache.base.algorithm.LRUCache?--------最近最少使用。這是一個默認值當(dāng)cache.capacity設(shè)置了值。
com.opensymphony.oscache.base.algorithm.FIFOCache?--------先進先出。
com.opensymphony.oscache.base.algorithm.UnlimitedCache---------添加到緩存中的內(nèi)容,是絕不會被丟棄的,這是默認值當(dāng)?cache.capacity屬性沒有設(shè)置值。
Cache.blocking:
當(dāng)一個請求一個過期的緩存條目,它可能被另一個線程正在重建該緩存的過程中。
此設(shè)置指定OSCache如何處理后來的“非重建緩存”的線程。
默認行為(cache.blocking?=?FALSE)是把過期內(nèi)容給后面的線程,直到緩存條目已更新。這提供最佳的性能(僅僅花費稍微過時的數(shù)據(jù)服務(wù)的成本)。
當(dāng)阻塞被啟用,線程反而會阻塞,直到新的緩存條目準(zhǔn)備提供,一旦新的條目放進了緩存中,阻塞的線程將重新啟動并給予最新的緩存內(nèi)容。
請注意,即使阻塞被禁用,當(dāng)沒有過期的數(shù)據(jù)可提供,線程將被阻塞直到通過線程把建立緩存的數(shù)據(jù)放進緩存內(nèi)。
Cache.unlimited.disk:
指示磁盤緩存是否應(yīng)無限制。默認值是false,在這種情況下,磁盤緩存也可以和內(nèi)存緩存一樣通過?cache.capacity屬性設(shè)置緩存大小
Cache.persistence.class:
指定一個類用于持久化緩存條目。這個樣的類必須實現(xiàn)PersistenceListener?接口。OSCache?有一個這樣的實現(xiàn)提供了一個基于持久化的文件系統(tǒng)。設(shè)置這樣的屬性給com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener類去啟用這個實現(xiàn)。你應(yīng)該可以保存緩存數(shù)據(jù)使用像JDBC,?LDAP.?NOTE通過指定你自己的類。這個類的對象的哈希碼和toString方法返回的值將被緩存用來生成緩存條目的文件名稱。如果你喜歡可讀的文件名稱,父DiskPersistenceListener可以被使用,但那將產(chǎn)生一個問題,由于非法的文件系統(tǒng)字符和長長的名字。
注意:HashDiskPersistenceListener和DiskPersistenceListener類需要cache.path的設(shè)置,以便知道在哪里可以保存文件到磁盤。
Cache.path:
這指定緩存將存儲在磁盤上的哪個目錄,該目錄將被創(chuàng)建,如果它不存在,但是要記住OSCache?必須要有權(quán)限往這個路徑寫內(nèi)容。避免不同的緩存共享相同的緩存路徑,因為OSCache沒有被設(shè)計來處理這些問題。
注意:對于windows系統(tǒng),反斜杠字符“\”需要被轉(zhuǎn)義。(反斜杠\backslash?;斜杠/forwardslash)。例如:cache.path=c:\\myapp\\cache 。
cache.persistence.overflow.only?(NEW!?Since?2.1):
指示的持久性是否應(yīng)該只發(fā)生一次內(nèi)存緩存容量已達到。為了向后兼容默認值是false,但是推薦值是true當(dāng)memory.cache被啟用。這個屬性大大改變了緩存的行為,在保存的緩存中將變的不同,那么內(nèi)存中有什么。
轉(zhuǎn)載于:https://www.cnblogs.com/sbj-dawn/p/7841390.html
總結(jié)
以上是生活随笔為你收集整理的OScached页面缓存的入门使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 systemctl st
- 下一篇: 看京东如何虐待上帝