JCS 是Jakarta 的项目Turbine的子项目。它是一个复合式的缓冲工具。可以将对象缓冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。对于一种需要频繁访问而每访问一次都非常消耗资源的对象,可以临时存放在缓冲区中,这样可以提高服务的性能。而JCS正是一个很好的缓冲工具。缓冲工具对于读操作远远多于写操作的应用性能提高非常显著。
JCS 除了可以将对象缓冲在内存中以外,还具有几个特性。如时间过期、索引式硬盘缓冲、并行式的分布缓冲等。
内存缓冲
JCS现在支持两种内存缓冲算法LRU和MRU。通常都是使用LRU(Least Recently Used),最近最少算法。当内存缓存区域满时,LRU会首先删除最近最少使用的缓存数据。使用内存缓冲区需要定义缓冲区大小,当超过缓冲区限制时,会将缓冲内容抛弃掉。如果有配硬盘缓冲,则将挤出来的缓冲内容写入硬盘缓冲区。
时间过期
JCS对于缓冲的对象,可以设定缓冲过期时间,一个对象在缓冲区中停留的时间超过这个时间,就会被认为是“不新鲜”而被放弃。
索引式硬盘缓冲
一方面,为了避免缓冲区过大,撑爆虚拟机的内存,另一方面又希望能够缓冲更多的对象,JCS可以将超出缓冲区大小的对象缓存到硬盘上。配置上也比较方便,只需要指定缓冲临时文件的存放目录位置 。硬盘缓冲将缓冲对象的内容写到文件上,但是将访问索引保存在内存中,因此也能够达到尽可能高的访问效率。
并行式的分布缓冲(Lateral)
通常,将对象缓冲在内存中,一方面提高了应用的性能,而另一方面却使得应用不可以分布式发布。因为假设一个应用配置在两台服务器上并行运行,而两台服务器单独缓冲,则很容易导致两个缓冲区内容出现版本上的不一致而出错。一个机器上修改了数据,这个动作会影响到本地内存缓冲区和数据库服务器,但是却不会通知到另一台服务器,导致另一台上缓冲的数据实际上已经无效了。
并行式的分布缓冲就是解决这个问题。可以通过配置,将几台服务器配成一个缓冲组,组内每台服务器上有数据更新,会横向将更新的内容通过TCP/IP协议传输到其他服务器的缓冲层,这样就可以保证不会出现上述情况。这个的缺点是如果组内的并行的服务器数量增大后,组内的数据传输量将会迅速上升。这种方案适合并行服务器的数量比较少的情况。
更多详细信息,请搜索<JCS(Java Caching System)简介以及相关文档>
JCS 配置
配置JCS 就是简单地创建和填充一个cache.ccf 文件,这个文件定义缓存应该使用哪些区域,以及这些区域的属性或选项。根据应用程序的需求,配置这个文件可以快速扩展缓存。在JCS的配置文件中(WEB-INF/classes/cache.ccf),有一个默认配置(default),也可以对每个缓冲区(region)单独配置,没有单独配置特性的缓冲区将使用默认的配置。
配置文件cache.ccf
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 这样,所有未特别指定属性的缓冲区都会自己使用一个硬盘缓冲区,缓冲文件会以缓冲区的名字来命名。存放在指定的目录下。
配置文件 cache.ccf
#默认缓冲
#Fri Jan 23 22:22:01 CST 2009
#这里是设定使用什么 Auxiliaries 可以不填,使用默认值
#设定使用的 cache 属性管理类别
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
#设定cache 内对象的上限
jcs.default.cacheattributes.MaxObjects=1000
#设定memory cahce 的算法
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
# 设定 element 可闲置的时间,IsEternal=false时有效
jcs.default.elementattributes.IdleTime=1800
#设置element 是否永久(即不会过期)
jcs.default.elementattributes.IsEternal=false
jcs.default.elementattributes.IsLateral=true
jcs.default.elementattributes.IsRemote=true
jcs.default.elementattributes.IsSpool=true
#设定element建立后能存活多久,IsEternal=false时有效
jcs.default.elementattributes.MaxLifeSeconds=3600
#索引式磁盘缓冲
jcs.auxiliary.DC.attributes.DiskPath=D:/apps/cache/jbbs
jcs.auxiliary.DC.attributes.MaxKeySize=10000
jcs.auxiliary.DC.attributes.MaxPurgatorySize=10000
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=7500
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000
jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.default=DC
#单独指明某个缓冲区的属性,如针对缓冲区RMCache单独配置属性
jcs.region.RMCache.cacheattributes.MaxMemoryIdleTimeSeconds=600
jcs.region.RMCache.cacheattributes.MaxObjects=1200
jcs.region.RMCache.cacheattributes.MaxSpoolPerRun=100
jcs.region.RMCache.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.RMCache.cacheattributes.ShrinkerIntervalSeconds=60
jcs.region.RMCache.cacheattributes.UseMemoryShrinker=true
jcs.region.RMCache.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.RMCache.elementattributes.IdleTime=1800
jcs.region.RMCache.elementattributes.IsEternal=false
jcs.region.RMCache.elementattributes.IsLateral=true
jcs.region.RMCache.elementattributes.IsRemote=true
jcs.region.RMCache.elementattributes.IsSpool=true
jcs.region.RMCache.elementattributes.MaxLifeSeconds=7200
jcs.region.RMCache=DC
该贴被panpan.nie编辑于2014-11-10 15:48:50