我要啦免费统计

          微藍領域

          我的學習檔案館
          posts - 19, comments - 57, trackbacks - 0, articles - 57
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          用oscache+lucene2.2.0加快頁面訪問速度(轉)

          Posted on 2008-01-22 11:38 hilor 閱讀(619) 評論(0)  編輯  收藏 所屬分類: J2EE
          大家都知道用lucene2.2.0全文檢索速度很快,但是當并發量的大的時候,lucene也會吃不消的,所以我們可以用到緩存,我給大家介紹的是oscache-2.4.1,先到官方網站下載一個.,然后把oscache-2.4.1.jar導入你的工程中.然后在下載解壓后的文件里有個重要的文件,那就是oscache.properties,oscache.tld文件,oscache.properties是對oscache的配置,這兩個文件放在classes文件下.,打開oscache.properties文件,里面可以自己進行相關配置.
             先介紹用硬盤緩存.
                  1.打開oscache.properties文件. 改成,cache.memory=false(表示硬盤緩存.true表示內存緩存),然后是路徑,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選一個,第一會當緩存數據在硬盤后,會產品一個文件夾.第二是存數據在硬盤后,會產生分步的件夾,不會像第一種那樣把緩存數據放在一個文件夾里.
          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.執行方法:
          在方法里,indexCache = new BaseCache(3600),hii = new cache.Hits(hits),這個類是自己寫的,下面的詳細代碼,然后調用put(String key,Object value)方法,key是關鍵字.下次取的時候就直接get(key),key我是用的查詢參數組成的,只要下次當別人用到相同條件搜索時,就可以直接從緩存讀數據,這里所提到的是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,大家都知道搜索用戶訪問都是幾頁,大家可以針對自己項目進行規化..
          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;
           }
          }
          我這里是如果有緩存數據,就讀緩存,沒有,就lucene然后放在緩存里.大家可以調用indexCache.get(key),大家每一次訪問的時候會相對很慢.如果緩存已經建立了,那么速度會很快,大家在用的時候,針對自己項目的數據要求,進行緩存.下面介紹內存緩存.
            2.內存緩存可以相對要快點.但是針對服務器的本身內存大小,大家針對自己的項目和服務器的配置選擇好的緩存方式.,把cache.memory=true,這樣就可以了.
          3.還可以實現頁面級緩存
          你可以在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)作緩存處理.
          我這里介紹的不全,只是我在項目中用到了這些.如果有什么問題,虛心接受....

          主站蜘蛛池模板: 阜康市| 柳州市| 湟源县| 雅江县| 承德市| 太仆寺旗| 桐乡市| 衢州市| 醴陵市| 广饶县| 永胜县| 郓城县| 石狮市| 阜宁县| 额敏县| 汉中市| 新巴尔虎左旗| 通州市| 瓮安县| 榆社县| 应城市| 防城港市| 灵石县| 福清市| 泗水县| 宣汉县| 泾源县| 甘孜| 涞水县| 新晃| 临汾市| 北宁市| 高碑店市| 大丰市| 赤峰市| 宜川县| 紫金县| 拜泉县| 前郭尔| 仁怀市| 龙岩市|