大家都知道用lucene2.2.0全文檢索速度很快,但是當并發(fā)量的大的時候,lucene也會吃不消的,所以我們可以用到緩存,我給大家介紹的是oscache-2.4.1,先到官方網(wǎng)站下載一個.,然后把oscache-2.4.1.jar導(dǎo)入你的工程中.然后在下載解壓后的文件里有個重要的文件,那就是oscache.properties,oscache.tld文件,oscache.properties是對oscache的配置,這兩個文件放在classes文件下.,打開oscache.properties文件,里面可以自己進行相關(guān)配置.
先介紹用硬盤緩存.
1.打開oscache.properties文件. 改成,cache.memory=false(表示硬盤緩存.true表示內(nèi)存緩存),然后是路徑,cache.path=/home/search/index/cache(我這個不是win下)然后cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener選一個,第一會當緩存數(shù)據(jù)在硬盤后,會產(chǎn)品一個文件夾.第二是存數(shù)據(jù)在硬盤后,會產(chǎn)生分步的件夾,不會像第一種那樣把緩存數(shù)據(jù)放在一個文件夾里.
2.寫方法進行緩存.
1.寫個類extends GeneralCacheAdministrator,
public class BaseCache extends GeneralCacheAdministrator {
// 過期時間(單位為秒);
private int refreshPeriod;
public BaseCache(int refreshPeriod){
super();
this.refreshPeriod=refreshPeriod;
}
// 添加被緩存的對象;
public void put(String key,Object value){
this.putInCache(key,value);
}
// 刪除被緩存的對象;
public void remove(String key){
this.flushEntry(key);
}
// 刪除所有被緩存的對象;
public void removeAll(Date date){
this.flushAll(date);
}
public void removeAll(){
this.flushAll();
}
// 獲取被緩存的對象;
public Object get(String key) throws Exception{
try{
return this.getFromCache(key,this.refreshPeriod);
} catch (NeedsRefreshException e) {
this.cancelUpdate(key);
throw e;
}
}
}
2.執(zhí)行方法:
在方法里,indexCache = new BaseCache(3600),hii = new cache.Hits(hits),這個類是自己寫的,下面的詳細代碼,然后調(diào)用put(String key,Object value)方法,key是關(guān)鍵字.下次取的時候就直接get(key),key我是用的查詢參數(shù)組成的,只要下次當別人用到相同條件搜索時,就可以直接從緩存讀數(shù)據(jù),這里所提到的是org.apache.lucene.search.Hits這個對像是不能被緩存的,沒有被序例化,我查了下源碼,也不能被繼承,所以大家自己寫個類implements Serializable
public class Hits implements Serializable {
private org.apache.lucene.search.Hits hits;
private Document[] docs=null;
private boolean flag=true;
/**
* sundc 2007-11-20
*/
public Hits(org.apache.lucene.search.Hits hits) {
this.docs=new Document[hits.length()];
int length=0;
//我這里是定義記錄有只緩存前710多記錄,如果大于710還是查lucene,大家都知道搜索用戶訪問都是幾頁,大家可以針對自己項目進行規(guī)化..
if(hits.length()>=710){
length=710;
}
else{
length=hits.length();
}
for(int i=0;i<length;i++){
try {
this.docs[i]=hits.doc(i);
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public Hits( Document[] doc){
this.docs=doc;
}
public Document doc(int i){
if(!this.flag){
try {
return this.hits.doc(i);
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return this.docs[i];
}
public int length(){
if(this.flag){
return docs.length;
}
return this.hits.length();
}
public Document[] getDocs() {
return this.docs;
}
public void setDocs(Document[] docs) {
this.docs = docs;
}
public org.apache.lucene.search.Hits getHits() {
return this.hits;
}
public void setHits(org.apache.lucene.search.Hits hits) {
this.hits = hits;
}
}
我這里是如果有緩存數(shù)據(jù),就讀緩存,沒有,就lucene然后放在緩存里.大家可以調(diào)用indexCache.get(key),大家每一次訪問的時候會相對很慢.如果緩存已經(jīng)建立了,那么速度會很快,大家在用的時候,針對自己項目的數(shù)據(jù)要求,進行緩存.下面介紹內(nèi)存緩存.
2.內(nèi)存緩存可以相對要快點.但是針對服務(wù)器的本身內(nèi)存大小,大家針對自己的項目和服務(wù)器的配置選擇好的緩存方式.,把cache.memory=true,這樣就可以了.
3.還可以實現(xiàn)頁面級緩存
你可以在web.xml中定義緩存過濾器,定義特定資源的緩存。
<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>60</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>
上面定義將緩存所有.jsp頁面,緩存刷新時間為60秒,緩存作用域為Session,
注意,CacheFilter只捕獲Http頭為200的頁面請求,即只對無錯誤請求作緩存,
而不對其他請求(如500,404,400)作緩存處理.
我這里介紹的不全,只是我在項目中用到了這些.如果有什么問題,虛心接受....
青菜貓(孫宇)
posted on 2007-12-08 21:36
青菜貓(孫宇) 閱讀(1635)
評論(2) 編輯 收藏 所屬分類:
java