oscache的JSP應用

OSCache是一個基於web應用的組件,他的安裝工作主要是對web應用進行配置,大概的步驟如下:

1. 下載、解壓縮OSCache

請到OSCache的主頁http://www.opensymphony.com/oscache/download.html下載Oscache的最新版本,作者下載的是OSCache的最新穩定版本2.0。

將下載後的。Zip文件解壓縮到c:\oscache(後面的章節中將使用%OSCache_Home%來表示這個目錄)目錄下

2. 新建立一個web應用

3. 將主要組件%OSCache_Home%\oscache.jar放入WEB-INF\lib目錄

4. commons-logging.jar、commons-collections.jar的處理

  • OSCache組件用Jakarta Commons Logging來處理日誌信息,所以需要commons-logging.jar的支持,請將%OSCache_Home%\lib\core\commons-logging.jar放入classpath(通常意味着將這個文件放入WEB-INF\lib目錄)  
  • 如果使用JDK1.3,請將%OSCache_Home%\lib\core\commons-collections.jar放入classpath,如果使用JDK1.4或者以上版本,則不需要了  

5. 將oscache.properties、oscache.tld放入WEB-INF\class目錄

  • %OSCache_Home%\oscache.properties包含了對OSCache運行特徵值的設置信息  
  • %OSCache_Home%\oscache.tld包含了OSCache提供的標籤庫的定義內容  

6. 修改web.xml文件

在web.xml文件中增加下面的內容,增加對OSCache提供的taglib的支持:

<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location>
</taglib> 

OSCache中按照緩存範圍的不同分爲兩種不同的方式:一種是緩存JSP頁面中部分或者全部內容,一種是基於整個頁面文件的緩存。

4.1 JSP部分內容緩存


4.1.1 Cache-OSCache提供的緩存標籤


這是OSCache提供的標籤庫中最重要的一個標籤,包括在標籤中的內容將應用緩存機制進行處理,處理的方式將取決於編程者對cache標籤屬性的設置。

第一次請求到達時,標籤中的內容被處理並且緩存起來,當下一個請求到達時,緩存系統會檢查這部分內容的緩存是否已經失效,主要是以下幾項:

  • 1. 緩存時間超過了cache標籤設置的time或者duration屬性規定的超時時間  
  • 2. cron屬性規定的時間比緩存信息的開始時間更晚  
  • 3. 標籤中緩存的內容在緩存後又被重新刷新過  
  • 4. 其他緩存超期設定  

如果符合上面四項中的任何一項,被緩存的內容視爲已經失效,這時被緩存的內容將被重新處理並且返回處理過後的信息,如果被緩存的內容沒有失效,那麼返回給用戶的將是緩存中的信息。

cache標籤的屬性說明:

key - 標識緩存內容的關鍵詞。在指定的作用範圍內必須是唯一的。默認的key是被訪問頁面的URI和後面的請求字符串。

你可以在同一個頁面中使用很多cache標籤而不指定他的key屬性,這種情況下系統使用該頁面的URI和後面的請求字符串,另外再自動給這些key增加一個索引值來區分這些緩存內容。但是不推薦採用這樣的方式。

scope - 緩存發生作用的範圍,可以是application或者session

time - 緩存內容的時間段,單位是秒,默認是3600秒,也就是一個小時,如果設定一個負值,那麼這部分被緩存的內容將永遠不過期。 

duration - 指定緩存內容失效的時間,是相對time的另一個選擇,可以使用簡單日期格式或者符合USO-8601的日期格式。如:duration='PT5M' duration='5s'等

refresh - false 或者true。

如果refresh屬性設置爲true,不管其他的屬性是否符合條件,這部分被緩存的內容都將被更新,這給編程者一種選擇,決定什麼時候必須刷新。 

mode - 如果編程者不希望被緩存的內容增加到給用戶的響應中,可以設置mode屬性爲"silent"

其它可用的屬性還包括:cron 、groups、language、refreshpolicyclass、refreshpolicyparam。

上面的這些屬性可以單獨使用,也可以根據需要組合使用,下面的例子將講解這些常用屬性的使用方式。

4.1.2 Cache標籤實例分析:


1. 最簡單的cache標籤用法

使用默認的關鍵字來標識cache內容,超時時間是默認的3600秒

<cache:cache>
<%
//自己的JSP代碼內容
%>
</cache:cache> 

2. 用自己指定的字符串標識緩存內容,並且設定作用範圍爲session。

<cache:cache key="foobar" scope="session">
<%
//自己的JSP代碼內容
%>
</cache:cache> 

3.動態設定key值,使用自己指定的time屬性設定緩存內容的超時時間,使用動態refresh值決定是否強制內容刷新。

因爲OSCache使用key值來標識緩存內容,使用相同的key值將會被認爲使用相同的的緩存內容,所以使用動態的key值可以自由的根據不同的角色、不同的要求決定使用不同的緩存內容。

<cache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>">
<%
//自己的JSP代碼內容
%>
</cache:cache> 

4. 設置time屬性爲負數使緩存內容永不過期

<cache:cache time="-1">
<%
//自己的JSP代碼內容
%>

5. 使用duration屬性設置超期時間

<cache:cache  duration='PT5M'>
<%
//自己的JSP代碼內容
%>

6. 使用mode屬性使被緩存的內容不加入給客戶的響應中

<cache:cache  mode='silent'>
<%
//自己的JSP代碼內容
%>

4.2 用CashFilter實現頁面級緩存


在OSCache組件中提供了一個CacheFilter用於實現頁面級的緩存,主要用於對web應用中的某些動態頁面進行緩存,尤其是那些需要生成pdf格式文件/報表、圖片文件等的頁面,不僅減少了數據庫的交互、減少數據庫服務器的壓力,而且對於減少web服務器的性能消耗有很顯著的效果。

這種功能的實現是通過在web.xml中進行配置來決定緩存哪一個或者一組頁面,而且還可以設置緩存的相關屬性,這種基於配置文件的實現方式對於J2EE來說應該是一種標準的實現方式了。

[注] 只有客戶訪問時返回http頭信息中代碼爲200(也就是訪問已經成功)的頁面信息才能夠被緩存

1. 緩存單個文件

修改web.xml,增加如下內容,確定對/testContent.jsp頁面進行緩存。

<filter>
      <filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-對/testContent.jsp頁面內容進行緩存-->
      <url-pattern>/testContent.jsp</url-pattern>
</filter-mapping>

2. 緩存URL pattern

修改web.xml,增加如下內容,確定對*.jsp頁面進行緩存。

<filter>
      <filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-對所有jsp頁面內容進行緩存-->
      <url-pattern>*.jsp</url-pattern>
</filter-mapping>

3. 自己設定緩存屬性

在頁面級緩存的情況下,可以通過設置CacheFilter的初始屬性來決定緩存的一些特性:time屬性設置緩存的時間段,默認爲3600秒,可以根據自己的需要只有的設置,而scope屬性設置,默認爲application,可選項包括application、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>
<!-對所有jsp頁面內容進行緩存-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
 

5 配置

Configuration:配置oscache.properties
1、cache.memory: true 或者 false。默認爲true 不使用內存緩存而使用硬盤緩存是很愚蠢的事情。
2、cache.capacity 緩存object的最大數量值。默認是不限制,cache不會移走任何緩存內容。負數被當作不限制。
3、cache.algorithm 運算規則。爲了使用規則,cache的size必須是指定的。 如果cache的size不指定的話,法則將不會限制緩存對象的大小。 如果你指定了cache的size,但不指定algorithm,那它會默認使用:com.opensymphony.oscache.base.algorithm.LRUCache 有下面三種規則: com.opensymphony.oscache.base.algorithm.LRUCache-last in first out,最遲插入的最先調用。默認值。 com.opensymphony.oscache.base.algorithm.FIFOCache -first int first out。 com.opensymphony.oscache.base.algorithm.UnlimitedCache -cache中的內容將永遠不會被丟棄。 如果cache.capacity不指定值的話,它將被設爲默認。
4、cache.blocking 是否同步化。true 或者 false。一般設爲true,避免讀取髒數據。
5。cache.unlimited.disk 指定硬盤緩存是否要作限制。默認值爲false。false的狀況下,disk cache capacity 將和cache.capacity的值相同。
6、cache.persistence.class 指定類是被持久化的類。class必須實現PersistenceListener接口。 作爲硬盤持久,可以實現com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener接口。 它把class的toString()輸出的hash值作爲文件的名稱。如果你要把文件名易讀(自己設定),DiskPersistenceListener 的父類也 能使用,但其可能有非法字符或者過長的名字。 注意:HashDiskPersistenceListener 和 DiskPersistenceListener 需要設定硬盤路徑:cache.path
7、cache.path 指定硬盤緩存的路徑。目錄如果不存在將被建立。同時注意oscache應該要有權限寫文件系統。 cache.path=c:\\myapp\\cache or *ix: cache.path=/opt/myapp/cache
8、cache.persistence.overflow.only (NEW! Since 2.1) 指定是否只有在內存不足的情況下才使用硬盤緩存。 默認值false。但推薦是true如果內存cache被允許的話。這個屬性徹底的改變了cache的行爲,使得persisted cache 和memory完全不同。
9、cache.event.listeners 用逗號分離的class名列表。每個class必須實現以下接口之一,或者幾個 CacheEntryEventListener:接收cache add/update/flush and remove事件 CacheMapAccessEventListener :接收cache訪問事件。這個可以讓你跟蹤cache怎麼工作。 默認是不配置任何class的。當然你可以使用一下的class: com.opensymphony.oscache.plugins.clustersupport.BroadcastingCacheEventListener -分佈式的監聽器。可以廣播到局域網內的其他cache實例。 com.opensymphony.oscache.extra.CacheEntryEventListenerImpl -一個簡單的監聽器。在cache的生命週期中記錄count of 所有entry的事件。 com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl -記錄count of cache map events(cache hits,misses and state hits).
10、cache.key This is the key that will be used by the ServletCacheAdministrator (and hence the custom tags) to store the cache object in the application and session scope. The default value when this property is not specified is "__oscache_cache". If you want to access this default value in your code, it is available as com.opensymphony.oscache.base.Const.DEFAULT_CACHE_KEY.
11、cache.use.host.domain.in.key If your server is configured with multiple hosts, you may wish to add host name information to automatically generated cache keys. If so, set this property to true. The default value is false.
12、Additional Properties In additon to the above basic options, any other properties that are specified in this file will still be loaded and can be made available to your event handlers. For example, the JavaGroupsBroadcastingListener supports the following additional properties:
13、cache.cluster.multicast.ip The multicast IP to use for this cache cluster. Defaults to 231.12.21.132.
14、cache.cluster.properties Specifies additional configuration options for the clustering. The default setting is UDP(mcast_addr=231.12.21.132;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,600,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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章