前陣子對公司網站進行了性能優化,其中,有一項就是使用OSCache添加頁面的緩存,開始還不以為然,做完緩存后,發現服務器的負載大大減小了,看來還真不能小瞧OSCache。
OSCache 主要用于頁面緩存,當然它也可用于數據層緩存,但數據層緩存一般使用ehcache比較成熟。OSCache對于更新較慢的頁面(比如一天或半天更新一次)緩存效果比較好,能大幅降低數據庫和服務器的壓力,而且OSCache簡單易用,是一個非常不錯的緩存框架。
OSCache的配置和使用
一、oscache 環境搭建
1, 從 https://oscache.dev.java.net/files/documents/629/61427/oscache-2.4.1-full.zip 下載 oscache-2.4.1-full版本,并從壓縮包中分別拷貝oscache-2.4.1.jar、oscache.properties、 oscache.tld放入本地項目的應用目錄,如下:
$WEB-APP"WEB-INF"lib"oscache.jar
$WEB-APP"WEB-INF"classes"oscache.properties
$WEB-APP"WEB-INF"classes"oscache.tld
2, 在web.xml 中加入如下配置
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>
3, 如果需要日志輸出,可在log4j.properties文件中加入如下配置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=oscache.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[start]%d{yyyy/MM/dd/HH:mm:ss}
二、oscache.properties
主要配置
1,cache.memory = true
設置是否使用內存緩存
可設置為true 或者 false ,默認為true
2,cache.capacity =10000
設置緩存對象的最大數量值
默認是不限制,cache不會移走任何緩存內容,負數被當作不限制
3,cache.unlimited.disk
指定硬盤緩存是否要作限制,默認值為false
false的狀況下,硬盤緩存容量將和cache.capacity的值相同
4,cache.path
指定硬盤緩存的路徑,目錄如果不存在將被建立,同時注意oscache應該要有權限寫文件系統。
設置如:cache.path=d:""myapp""cache
5,cache.persistence.overflow.only
指定是否只有在內存不足的情況下才使用硬盤緩存。默認值false,推薦使用true如果內存cache被允許的話
三、標簽參數介紹
使用了oscache:cache 的屬性:
key 緩沖的key,可以是任何的字符串,也可以動態生成。在一個范圍內必須唯一。默認使用請求的URI和請求的字符串(問號后面的部分)
scope 范圍,有application和session, 默認為 application
time 緩沖內容的時間(秒),默認為1小時,3600秒,如果為-1則內容永遠不過期
refresh 強制刷新緩存,false 或者true,可以使用此屬性受動刷新需立即更新的數據
groups 設置分組,可以同組的緩沖數據進行控制
language 語言,默認為當前頁面的語言
還有許多其他的屬性,在這里不一一列舉
四、oscache 基本用法
1,設置緩存
<%@ taglib uri="/WEB-INF/tlds/oscache.tld" prefix="oscache" %>
<oscache:cache key=”cacheKey” time=”300” scope=”application”>被緩存的列表 </oscache:cache> 其中,cacheKey和time可以自己動態構件,scope(緩存范圍) 可以是ession、application
注意:cacheKey或者time如果是jsp表達式時,如:key=”<%=”string”+variable%>”而不是:key=”string<%=variable%>”,寫法要注意,否則頁面會報錯
2,刷新緩存
<%@ taglib uri="/WEB-INF/tlds/oscache.tld" prefix="oscache" %>
<oscache:flush key=”cacheKey” scope=”application” />
3,分組緩存
<cache:flush group='b' scope='application'/>
<cache:cachekey='cacheKey_1' groups='a,b' duration='5s'>
這里面的內容被緩存到鍵值為cacheKey_1,組名為a和b的緩存中,正常情況下,每隔5秒鐘刷新一 次,但受上面標簽“<cache:flush group='b' scope='application'/>”的影響,它將隨每次頁面的刷新而刷新
</cache:cache>
<cache:cachekey='cacheKey_2' groups='a' duration='5s'>
這里面的內容被緩存到鍵值為cacheKey_2,組名為a的緩存中,它將每隔5秒中刷新一次
</cache:cache>
<cache:cachekey='cacheKey_3' duration='20s'>
這里面的內容被緩存到cacheKey_3,組a,b中,組是通過標簽<cache: addgroup>而添加的,它也會受本頁開頭標簽“<cache:flush group='b' scope='application'/>”的影響而隨頁面刷新而刷新
<cache:addgroup group='a'/>
<cache:addgroup group='b'/>
</cache:cache>
<cache:cachekey='cacheKey_4' duration='20s'>
這里面的內容被緩存到cacheKey_4,組a,b中,組是通過標簽<cache: addgroups>而添加的,它也會受本頁開頭標簽“<cache:flush group='b' scope='application'/>”的影響而隨頁面刷新而刷新
<cache:addgroups groups='a,b'/>
</cache:cache>
五、參考資料
1,oscache-2.4.1-full 中的demo,下在地址:
https://oscache.dev.java.net/files/documents/629/61427/oscache-2.4.1-full.zip
2,oscache API:http://www.opensymphony.com/oscache/api/
---------------------------------
假到真時真亦假,真到假時假亦真
---------------------------------