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