jcs開源緩存框架介紹

JCS是Jakarta的項目Turbine的子項目。它是一個複合式的緩衝工具。能夠將對象緩衝到內存、硬盤。具備緩衝對象時間過時設定。還能夠經過JCS構建具備緩衝的分佈式構架,以實現高性能的應用。對於一些須要頻繁訪問而每訪問一次都很是消耗資源的對象,能夠臨時存放在緩衝區中,這樣能夠提升服務的性能。而JCS正是一個很好的緩衝工具。緩衝工具對於讀操做遠遠多於寫操做的應用性能提升很是顯著。html

JCS除了簡單的將對象緩衝在內存中之外,還具備幾個特性,以適應企業級緩衝系統的須要。這些特性包括時間過時、索引式硬盤緩衝、並行式的分佈緩衝等。java

內存緩衝web

JCS如今支持兩種內存緩衝算法LRU和MRU。一般都是使用LRU算法。算法

org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache數據庫

使用內存緩衝區須要定義緩衝區大小,當超過緩衝區限制時,會將緩衝內容拋棄掉。若是有配硬盤緩衝,則將擠出來的緩衝內容寫入硬盤緩衝區。apache

時間過時編程

JCS對於緩衝的對象,能夠設定緩衝過時時間,一個對象在緩衝區中停留的時間超過這個時間,就會被認爲是「不新鮮」而被放棄。api

索引式硬盤緩衝

  一方面,爲了不緩衝區過大,撐爆虛擬機的內存,另外一方面又但願可以緩衝更多的對象,JCS能夠將超出緩衝區大小的對象緩存到硬盤上。配置上也比較方便,只須要指定緩衝臨時文件的存放目錄位置。硬盤緩衝將緩衝對象的內容寫到文件上,可是將訪問索引保存在內存中,所以也可以達到儘量高的訪問效率。緩存

並行式的分佈緩衝(Lateral)

  一般,將對象緩衝在內存中,一方面提升了應用的性能,而另外一方面卻使得應用不能夠分佈式發佈。由於假設一個應用配置在兩臺服務器上並行運行,而兩臺服務器單獨緩衝,則很容易致使兩個緩衝區內容出現版本上的不一致而出錯。一個機器上修改了數據,這個動做會影響到本地內存緩衝區和數據庫服務器,可是卻不會通知到另外一臺服務器,致使另外一臺上緩衝的數據實際上已經無效了。服務器

  並行式的分佈緩衝就是解決這個問題。能夠經過配置,將幾臺服務器配成一個緩衝組,組內每臺服務器上有數據更新,會橫向將更新的內容經過TCP/IP協議傳輸到其餘服務器的緩衝層,這樣就能夠保證不會出現上述狀況。這個的缺點是若是組內的並行的服務器數量增大後,組內的數據傳輸量將會迅速上升。這種方案適合並行服務器的數量比較少的狀況。

Client/Server式的緩衝(Remote)

  客戶/服務端式的緩衝集羣。這種方式支持一個主服務器和最高達到256個客戶端。客戶端的緩衝層會嘗試鏈接主服務器,若是鏈接成功,就會在主服務器上註冊。每一個客戶端有數據更新,就會通知到主服務器,主服務器會將更新通知到除消息來源的客戶端之外的全部的客戶端。

  每一個客戶端能夠配置超過一個服務器,第一個服務器是主服務器,若是與第一個服務器鏈接失敗,客戶端會嘗試與備用的服務器鏈接,若是鏈接成功,就會經過備用服務器與其餘客戶端對話,同時會按期繼續嘗試與主服務器取得鏈接。若是備用服務器也鏈接失敗,就會按照配置順序嘗試與下一個備用服務器鏈接。

  這種方式下,更新通知是一種輕量級的,一個機器上的數據更新,不會把整個數據傳輸出去,而只是通知一個ID,當遠程的其餘機器收到更新通知後,就會把對應ID的緩衝對象從本地的內存緩衝區中移除,以保證不會在緩衝區內出現錯誤數據。

  這種構造須要分別配置客戶端和服務器,配置比較麻煩。

 

配置方法

  JCS的好處之一,就是應用在開發的時候,能夠不用去構思底層的緩衝配置構架。同一個應用,只須要修改配置,就能夠改變緩衝構架,不須要修改應用的源代碼。配置方法也比較簡單,就是修改配置文件cache.ccf。這個文件放置在WEB-INF/classes目錄下。配置格式相似log4j的配置文件格式。下面介紹一下使用各類緩衝結構的配置方法。

內存緩衝

#WEB-INF/classes/cache.ccf(如下內容不要換行)  
  
jcs.default=  
  
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes  
  
jcs.default.cacheattributes.MaxObjects=1000  
  
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache

  上面配置了默認緩衝屬性。一個應用中,因爲對象類型的不一樣,可能會使用多個緩衝區,每一個緩衝區都會有一個名字,若是在配置文件中沒有指明特定的緩衝區的屬性,全部的緩衝區都會根據默認屬性來構建。上面的內容,指明緩衝區的大小爲存放1000個對象,內存緩衝器使用LRUMemoryCache對象。可選的還有MRUMemoryCache,應該能夠自定義新的內存緩衝區。1000個緩衝對象這個容量,是指每一個緩衝區都緩衝1000個,而不是指全部緩衝區總容量。以上配置,就可讓應用運行起來。

時間過時

  若是須要引入時間過時機制,則須要加上

  jcs.default.cacheattributes.cacheattributes.UseMemoryShrinker=true

  jcs.default.cacheattributes.cacheattributes.MaxMemoryIdleTimeSeconds=3600

  jcs.default.cacheattributes.cacheattributes.ShrinkerIntervalSeconds=60

  這裏指明對象超過3600秒則過時,每隔60秒檢查一次。

索引式硬盤緩衝

  索引式硬盤緩衝是輔助緩衝的一種,使用時須要作如下事情

#定義一個硬盤緩衝區產生器(Factory),取名爲DC  
  
jcs.auxiliary.DC=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory  
  
jcs.auxiliary.DC.attributes=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes  
  
jcs.auxiliary.DC.attributes.DiskPath=g:/dev/jakarta-turbine-stratum/raf  
  
#這裏其實就是指明瞭緩衝文件存放到那裏去。  
  
#而後,作如下修改  
  
jcs.default=DC  
  
#這樣,全部未特別指定屬性的緩衝區都會本身使用一個硬盤緩衝區,緩衝文件會以緩衝區的名字來命名。存放在指定的目錄下。  
  
#橫向式的並行緩衝  
  
#並行式的配置以下  
  
jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.LateralCacheFactory  
  
jcs.auxiliary.LTCP.attributes=org.apache.jcs.auxiliary.lateral.LateralCacheAttributes  
  
jcs.auxiliary.LTCP.attributes.TransmissionTypeName=TCP  
  
jcs.auxiliary.LTCP.attributes.TcpServers=192.168.10.129:1121,192.168.10.222:1121  
  
jcs.auxiliary.LTCP.attributes.TcpListenerPort=1121  
  
jcs.auxiliary.LTCP.attributes.PutOnlyMode=false

  這裏的配置是在41,129,221三臺機器上實現並行緩衝的。

  你們都在1121端口上監聽,同時與另外兩臺機器鏈接。若是鏈接失敗,就會等待一個時間後再鏈接一次,直到鏈接成功爲止。三臺機器中任意一臺的緩衝區發生更新,好比put和remove動做,就會把更新傳遞給另外兩臺。

單獨指明某個緩衝區的屬性

  若是,針對某個緩衝區,好比叫作TestCache1,須要單獨配置屬性,能夠以下配置。

jcs.region.testCache1=DC,LTCP  
  
jcs.region.testCache1.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes  
  
jcs.region.testCache1.cacheattributes.MaxObjects=1000  
  
jcs.region.testCache1.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache  
  
jcs.region.testCache1.cacheattributes.UseMemoryShrinker=true  
  
jcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=3600  
  
jcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=60  
  
system.GroupIdCache  
  
#這個概念我也不是很清楚。不過JCS文檔中指出配置如下內容會比較好。  
  
jcs.system.groupIdCache=DC  
  
jcs.system.groupIdCache.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes  
  
jcs.system.groupIdCache.cacheattributes.MaxObjects=10000  
  
jcs.system.groupIdCache.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache  
  
#這多是JCS本身的組管理體系上的緩衝區。


Client/Server式的緩衝(Remote)

  這種構架須要單獨配置客戶端和服務端,若是要研究,能夠查看http://jakarta.apache.org/turbine/jcs/RemoteAuxCache.html

 

 

這裏給出一個以前系統配置的例子:cache.cff配置

# DEFAULT CACHE REGION  
  
# sets the default aux value for any non configured caches  
jcs.default=DC  
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes  
jcs.default.cacheattributes.MaxObjects=1  
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache  
jcs.default.elementattributes.IsEternal=true  
jcs.default.elementattributes.MaxLifeSeconds=360000  
jcs.default.elementattributes.IdleTime=1800  
jcs.default.elementattributes.IsSpool=true  
jcs.default.elementattributes.IsRemote=true  
jcs.default.elementattributes.IsLateral=true  
  
# CACHE REGIONS AVAILABLE  
  
# AUXILIARY CACHES AVAILABLE  
  
# Primary Disk Cache -- faster than the rest because of memory key storage  
jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory  
jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes  
jcs.auxiliary.DC.attributes.DiskPath=./kpicache  
jcs.auxiliary.DC.attributes.MaxPurgatorySize=100000000  
jcs.auxiliary.DC.attributes.MaxKeySize=10000000  
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000  
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=7500


一些方法的操做:

package com.zyujie.util;  
  
import org.apache.jcs.JCS;  
  
public class JCSManagerDTO {  
    private static JCSManagerDTO instance;  
    private static int checkedOut = 0;  
    public static JCS ObjCache;  
  
    private JCSManagerDTO() {  
        try {  
            ObjCache = JCS.getInstance("ObjCache");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    public static JCSManagerDTO getInstance() {  
        synchronized (JCSManagerDTO.class) {  
            if (instance == null) {  
                instance = new JCSManagerDTO();  
            }  
  
        }  
        synchronized (instance) {  
            instance.checkedOut++;  
        }  
        return instance;  
    }  
  
    public Object getObj(Object key) {  
        Object obj = null;  
        obj = (Object) ObjCache.get(key);  
        return obj;  
    }  
  
    public void storeObject(Object key, Object obj) {  
        try {  
            if (!key.equals("")) {  
                // ObjCache.remove(key);  
            }  
            ObjCache.put(key, obj);  
  
        } catch (Exception e) {  
        }  
    }  
  
    public void clearObject(Object key) {  
        try {  
            ObjCache.remove(key);  
        } catch (Exception e) {  
        }  
    }  
  
    public void clear() {  
        try {  
            ObjCache.clear();  
        } catch (Exception e) {  
        }  
    }  
  
    public void clearMatchObject(String key) {  
  
        // CacheAccess access1=CacheAccess.getAccess("DC");  
        // java.util.Map map=access1.get.getMatchingCacheElements(key);  
    }  
  
    public static void main(String[] args) {  
        JCSManagerDTO dto = JCSManagerDTO.getInstance();  
        dto.storeObject("test1", "111");  
        dto.storeObject("test2", "222");  
        dto.storeObject("test3", "333");  
        dto.storeObject("test4", "444");  
  
        System.out.println("test1 is  " + dto.getObj("test1"));  
        System.out.println("test2 is  " + dto.getObj("test2"));  
        System.out.println("test3 is  " + dto.getObj("test3"));  
        System.out.println("test4 is  " + dto.getObj("test4"));  
    }  
  
}

 

依賴jar包

jcs-1.3.jar

commons-lang-2.3.jar

commons-collections-2.1.1.jar

concurrent-1.3.4.jar


補充說明:

1.     使用jcs的通常步驟

使用jcs的通常步驟包括:jcs包下載、得到須要的jar包、配置jcs的配置文件、進行jcs的編程。詳見(http://commons.apache.org/jcs/getting_started/intro.html

Jcs包的下載,官網上有鏈接,在下載不下來時,如下地址是備選網址:

http://olex.openlogic.com/packages/jcs

jcs運行須要的Jar包,官網上有詳細的解說。如下是手動編譯時,本人遇到的找不到符號問題的解決方法:

http://blog.csdn.net/shuilan0066/article/details/5627179

2.     Jcs配置文件

Jcs的配置文件官網上的例子講的很詳細,結合上面的組織架構就會明白。

如下地址是對一些元配置信息做用的理解:

http://bokix.com/archives/29.html

http://shoko.iteye.com/blog/1758235

 

3.     jcs編程

Jcs源代碼採用Class.getResourceAsStream(/cache.ccf)的方式來加載配置文件,因此項目的cache.ccf要放在字節碼文件所在的根目錄下面,在web項目中,則要放在classes文件夾下。

具體例子詳見http://commons.apache.org/jcs/UsingJCSBasicWeb.html

 

其它參考資料以下:

http://www.ibm.com/developerworks/cn/java/j-jcs.html

http://wenku.baidu.com/view/a47220232f60ddccda38a026.html###

http://www.360doc.com/content/09/1019/17/397210_7519829.shtml

jcs緩存系統api

http://commons.apache.org/jcs/apidocs/index.html

相關文章
相關標籤/搜索