OSCache的使用:web
一,環境的搭建:算法
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放進類路徑下windows
注意: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,使你可以很容易的緩存你網站的整個頁面,甚至是二進制數據,二進制文件的緩存很是有用當他們被動態產生。session
配置Filter:app
Example1:時間是10minutes scope:Sessionjsp
<filter>ide
<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>
三 標籤:
<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>
主要的標籤有:
· 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主要的標籤。根據指定的屬性,標籤的體將被緩存。之後每次運行標籤,它會檢查,看看緩存的內容是否過時,若是下列條件成立的話,標籤體的內容將被認爲是過期的:
1:標籤體的內容超過了指定的緩存時間;默認爲一小時,指定時以s爲單位。
2:超多了cron屬性指定的日期或時間;
3:經過flush標籤,清除了指定的scope做用域的緩存。
若是緩存的主體內容是過時的,標籤會再次執行和緩存新的主體內容。
屬性:
① Key:這應該是爲給定的範圍內惟一的,由於重複的鍵映射到相同的緩存條目,由於緩存存放在map集合裏面。key的默認值爲使用URI轉義版本和當前頁面的查詢字符串(默認值使用的URI轉義版本和當前頁面的查詢字符串)。
② scope:緩存存放的做用域,默認爲application。可選的值爲session和application。
③ time:指定緩存存放的時間,以秒爲單位,默認爲3600s,即一個小時。若是爲負值表示永遠不過時。
④ duration:這是和time屬性二選一的。Duration能夠經過simple date format指定。
⑤ cron:cron表達式肯定緩存的內容何時過時,它容許緩存的內容在特殊的日期或時間過時,而不是當緩存的內容達到某個年齡。
介紹cron表達式:cron表達式的語法:
cron表達式由下面5個字段組成:
Minute:指定緩存的內容在小時的第幾分鐘過時,取值範圍是0-59;
Hour:指定緩存的內容在一天的第幾個小時將過時,這是指定使用24小時制,所以取值範圍是:0(午夜)-23(上午11點)。
DOM:一個月的第幾天。這是一個從1到31的數,它表示緩存的內容什麼日子過時,如:在每個月的10號過時,應該把值設爲10。
Month:一年的第幾月使內容過時,它能夠經過數字1-12或者月的英文名字(eg 'January')指定。月的名稱對大小寫是不敏感的,只考慮前三個字符,其餘部分忽略。
DOW:一週的第幾天使緩存的內容過時,它能夠是數字(0-6,0=星期天,6=星期六)或者是英文的星期名稱。和月份同樣大小寫是不敏感的,只考慮前三個字符,其餘部分忽略。
注意:當你不想給某個字段給定特定的值,你可使用"*"代替。
OSCache的也容許你選擇性地指定每一個字段內的列表,範圍和時間間隔(甚至是三者的結合)
List:集合中的列表項經過","分隔,緩存過時的時間和每一個列表項匹配,例如:"0,15,30,45 * * * *",表示緩存中的內容每隔15分鐘過時一次。
Ranges:使用"-"指定範圍。一個範圍將包括全部值從開始到結束值(包括起始值)例如: "* * * Jan-June *"表示一年的前六個月緩存將過時。 Intervals:一個間隔經過"/"指定。左邊的「/」字符的值表示的出發點或範圍值應遞增超過,而右邊的值表示間隔的時間長度。例如:"10/20 * * * *" 至關於 "10,30,50 * * * *", 而"10-45/20 * * * *" 只匹配過去每一個小時的10-30分鐘,由於50已經超過了範圍。
⑥ refresh:布爾值,如爲true緩存將被刷新,無論緩存的內容是否過時。使你能決定是否從新緩存內容。
⑦ mode:若是把值設置爲"silent",將防止標籤體被寫入到輸出流。
⑧ groups:用逗號分隔組裏面的名稱,根據你的須要容許把緩存的條目分組。分組是很是有用的當你的緩存內容依賴應用或數據的其餘部分,當這些依賴發生變化,flush相關的組將將致使全部緩存的條目在組中過時。
假設咱們有一個類別的動態清單,咱們從數據庫中拉,咱們也偶爾獲得更新,經過調用一個WebService存儲外幣兌換利率。假設,咱們也有一些
內容,顯示有關類別和當前的匯率值的信息。下面緩存緩存主體內容的例子分配給2個緩存組 "currencyData"和"categoryList"。當匯率和類別
列表發生更新,相關的組將被flush由於這些內容(與任何其餘與該組相關的內容)被過時了,而後當頁面被訪問的時候,再次創建緩存。
<cache:cache key="<%= product.getId() %>" time="-1" group="currencyData, categories">
... display category list ...
... display currency information ...
</cache:cache>
2,usecached 這個標籤內嵌在一個<cache>標籤中,表示<cache>標籤是否使用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.這是很好的容錯例子,當異常發生緩存的內容將不會被輸出。
<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則會輸出當前時間,當flush時,時間會改變。接着把use改成true,即便flush,時間也不會改變,它還會使用之前的緩存。
3,flush
這個標籤是用來在運行時刷新緩存。這是特別有用,由於它能夠將您的網站的管理部分編碼,以便管理員能夠決定什麼時候刷新緩存。
屬性:
Scope:這決定哪些範圍將被刷新。有效值是「application」,「session」和null。空範圍將刷新全部緩存,不論其範圍。默認爲all。
Key:當同時指定了key和scope,表示一個緩存條目被標記爲flush。當他下次被訪問的時候緩存將被refresh。當僅指定了key而沒有指定scope這是無效的。
group :指定一組將致使組中的全部緩存項被flush,若是僅僅指定group沒有指定scope這是無效的。
4,addgroup 必須內嵌在<cache:cache>標籤內部,它容許一個組名,動態地添加到緩存的塊中,
這將以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 必須內嵌在<cache:cache>標籤內部,
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文件,下面的屬性可以被設置在oscache.properties文件中:
Cache.memory:
有效值是真的仍是假的,默認值爲true。若是你想禁用內存緩存,只須要註釋掉或刪除此行。
禁用內存和磁盤緩存是可能的,並且至關愚蠢。
Cache.capacity:
緩存支持緩存條目的最大數量,默認狀況下,容量是無限的。緩存將不會刪除任何緩存條目。負的值也將意味着無限容量。
Cache.algorithm:
使用默認的緩存算法。請注意,爲了使用一種算法,還必須指定緩存的大小,若是未指定緩存的大小,緩存算法將是無限的緩存,而無論這個屬性的值,若是你指定了大小,但沒有指定算法,所使用的緩存算法將爲com.opensymphony.oscache.base.algorithm.LRUCache。
OSCache的目前帶有三種算法:
com.opensymphony.oscache.base.algorithm.LRUCache --------最近最少使用。這是一個默認值當cache.capacity設置了值。
com.opensymphony.oscache.base.algorithm.FIFOCache --------先進先出。
com.opensymphony.oscache.base.algorithm.UnlimitedCache---------添加到緩存中的內容,是毫不會被丟棄的,這是默認值當 cache.capacity屬性沒有設置值。
Cache.blocking:
當一個請求一個過時的緩存條目,它可能被另外一個線程正在重建該緩存的過程當中。
此設置指定OSCache如何處理後來的「非重建緩存」的線程。
默認行爲(cache.blocking = FALSE)是把過時內容給後面的線程,直到緩存條目已更新。這提供最佳的性能(僅僅花費稍微過期的數據服務的成本)。
當阻塞被啓用,線程反而會阻塞,直到新的緩存條目準備提供,一旦新的條目放進了緩存中,阻塞的線程將從新啓動並給予最新的緩存內容。
請注意,即便阻塞被禁用,當沒有過時的數據可提供,線程將被阻塞直到經過線程把創建緩存的數據放進緩存內。
Cache.unlimited.disk:
指示磁盤緩存是否應無限制。默認值是false,在這種狀況下,磁盤緩存也能夠和內存緩存同樣經過 cache.capacity屬性設置緩存大小
Cache.persistence.class:
指定一個類用於持久化緩存條目。這個樣的類必須實現PersistenceListener 接口。OSCache 有一個這樣的實現提供了一個基於持久化的文件系統。設置這樣的屬性給com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener類去啓用這個實現。你應該能夠保存緩存數據使用像JDBC, LDAP. NOTE經過指定你本身的類。這個類的對象的哈希碼和toString方法返回的值將被緩存用來生成緩存條目的文件名稱。若是你喜歡可讀的文件名稱,父DiskPersistenceListener能夠被使用,但那將產生一個問題,因爲非法的文件系統字符和長長的名字。
注意:HashDiskPersistenceListener和DiskPersistenceListener類須要cache.path的設置,以便知道在哪裏能夠保存文件到磁盤。
Cache.path:
這指定緩存將存儲在磁盤上的哪一個目錄,該目錄將被建立,若是它不存在,可是要記住OSCache 必需要有權限往這個路徑寫內容。避免不一樣的緩存共享相同的緩存路徑,由於OSCache沒有被設計來處理這些問題。
注意:對於windows系統,反斜槓字符「\」須要被轉義。(反斜槓\backslash ;斜槓/forwardslash)。例如:cache.path=c:\\myapp\\cache 。
cache.persistence.overflow.only (NEW! Since 2.1):
指示的持久性是否應該只發生一次內存緩存容量已達到。爲了向後兼容默認值是false,可是推薦值是true當memory.cache被啓用。這個屬性大大改變了緩存的行爲,在保存的緩存中將變的不一樣,那麼內存中有什麼。