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能夠將超出緩衝區大小的對象緩存到硬盤上。配置上也比較方便,只須要指定緩衝臨時文件的存放目錄位置。硬盤緩衝將緩衝對象的內容寫到文件上,可是將訪問索引保存在內存中,所以也可以達到儘量高的訪問效率。緩存
一般,將對象緩衝在內存中,一方面提升了應用的性能,而另外一方面卻使得應用不能夠分佈式發佈。由於假設一個應用配置在兩臺服務器上並行運行,而兩臺服務器單獨緩衝,則很容易致使兩個緩衝區內容出現版本上的不一致而出錯。一個機器上修改了數據,這個動做會影響到本地內存緩衝區和數據庫服務器,可是卻不會通知到另外一臺服務器,致使另外一臺上緩衝的數據實際上已經無效了。服務器
並行式的分佈緩衝就是解決這個問題。能夠經過配置,將幾臺服務器配成一個緩衝組,組內每臺服務器上有數據更新,會橫向將更新的內容經過TCP/IP協議傳輸到其餘服務器的緩衝層,這樣就能夠保證不會出現上述狀況。這個的缺點是若是組內的並行的服務器數量增大後,組內的數據傳輸量將會迅速上升。這種方案適合並行服務器的數量比較少的狀況。
客戶/服務端式的緩衝集羣。這種方式支持一個主服務器和最高達到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本身的組管理體系上的緩衝區。
這種構架須要單獨配置客戶端和服務端,若是要研究,能夠查看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