JCS学习(1)

最近一段时间比较空,看了一下JCS的用法,特将学习过程记录在此。

JCS是指java caching system,项目主页:http://jakarta.apache.org/jcs/index.html

看了jcs的源码,才发现原来缓存还可以这么写:之前在项目中用到的缓存(主要是LRU缓存,当然还有expiringLRU缓存,其实ExpiringLRU就是把LRU缓存再包装一下,加了个时间控制而已),它们的核心实现都是基于LinkedHashMap的,通过覆写removeEldestEntry来做到失效算法:

lrucache

但是jcs的缓存却不是这么简单实现的,jcs的缓存核心是一个双端列表(参见jcs源码中的LRUMemoryCache和DoubleLinkedList),然后通过一个控制器(这是我自己的叫法,等同于配置文件中的MemoryShrinker)来实现缓存的一些过期、持久化等操作。

下面来说说jcs的配置,先说region的配置,对于每一个region实例,主要是2方面的配置:cacheattributes和elementattributes,其实我觉得它们在某些配置项上是含糊不清的,也可能是我没有理解清楚吧,比如说cacheattributes中有MaxMemoryIdleTimeSeconds,这个是用来配置缓存项的最大空闲时间,如果在这个空闲时间内没有读取该缓存,那么就把它清理掉,比如说,我们把MaxMemoryIdleTimeSeconds配置为10秒,然后在应用中每隔2秒访问一下:cache.get(key),那这个key将一直存在,但我们如果超过10秒没有调用cache.get(key),那么再调用cache.get(key)的时候就是null了。但是elementattributes中也有个配置项:IdleTime,也是用来干这个事的(至少从名字上看是如此,去掉cacheattributes中的MaxMemoryIdleTimeSeconds,然后把IdleTime配置为10秒,可以得到一样的效果),当cacheattributes和elementattributes都配置这个选项时,elementattributes中的IdleTime其实是不起作用的。

当然,要让IdleTime和MaxMemoryIdleTimeSeconds起作用,首先要让UseMemoryShrinker=true。说到这里,就是我要说的第二个问题了:我觉得jcs的配置不是很“人性化”。

通常一些应用中的排行榜、xxx排名等,我们都会用缓存将他们保存起来,而且一般是ExpiringCache,这样他们就有一个过期时间,比如说是2分钟,或5分钟,超过这个时间再访问缓存,就会得到null,其实也就对应了jcs中的elementattributes.MaxLifeSeconds,但是在jcs中,你如果仅仅配置了elementattributes.MaxLifeSeconds,你会发现不起作用,为什么?原因就是elementattributes中的IsEternal默认是true!我们看看IsEternal的说明:You can turn off expiration by setting this to true. This causes the cache to bypass both max life and idle time expiration.(如果是true,将会忽略max life 和idle time)。所以说,配置了MaxLifeSeconds,还要将isEternal配置为false。同样的,isSpool,isLateral,isRemote等的默认值都是true,这也就意味着缓存失效时jcs会尝试flushed到硬盘?发送到远程主机上?(还没有去看具体的代码,所以这里是我猜的,但这些都是开关配置,为true的话,应该会做相应的尝试的)这样一来,缓存的效率应该会比较低吧?所以如果是仅仅用到了LRUCache和ExpiringCache,记得一定要在配置文件将isSpool,isLateral,isRemote,isEternal配置为false。

jcs用到了EDU.oswego.cs.dl.util.concurrent这个包(其实这个包都集成到了jdk5里面了,jcs也应该与时俱进了,呵呵),所以上面说到的isSpool,isLateral等操作应该都是另起线程来做的,缓存本身的put、get效率也应该不会有多大影响吧(还没看这部分的源码,所以是猜的,哈哈)。

好了,先写这么多,发现把学习过程写下来好累啊。

阅读更多

JCS配置问题

01-25

我在代码中用到了JCS缓存rnprivate JCS dictCache;rnJCS.setConfigFilename("/cache.ccf");rn try rn dictCache = JCS.getInstance(DictServiceBean.class.getName());rn catch (CacheException e) rn e.printStackTrace();rn rn可能是配置不对原因运行时出现如下信息:rn19:31:58,859 INFO [LRUMemoryCache] initialized LRUMemoryCache for testCache3rn19:31:58,921 INFO [LRUMemoryCache] initialized LRUMemoryCache for testCache2rn19:32:00,671 INFO [IndexedDiskCache] Cache file root directory: target/test-sandbox/rafrn19:32:00,703 INFO [IndexedDiskCache] Set maxKeySize to: '10000'rn19:32:00,750 INFO [IndexedDiskCache] Set recycle max Size to MaxRecycleBinSize: '5000'rn19:32:00,781 INFO [LRUMemoryCache] initialized LRUMemoryCache for testCache1rn19:32:05,265 INFO [STDOUT] inihost for room....rn19:32:27,546 ERROR [RemoteCacheManager] Connection refused to host: localhost; nested exception is: rn java.net.ConnectException: Connection refused: connectrn19:32:57,640 INFO [RemoteCacheRestore] looking up server //localhost:1102/org.apache.jcs.auxiliary.remote.behavior.IRemoteCacheServicernrncache.ccf配置文件内容如下(拷贝原有例子):rn##############################################################rn################## DEFAULT CACHE REGION #####################rn# sets the default aux value for any non configured cachesrnjcs.default=DCrnjcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesrnjcs.default.cacheattributes.MaxObjects=1000rnjcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCachernjcs.default.cacheattributes.UseMemoryShrinker=truernjcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600rnjcs.default.cacheattributes.ShrinkerIntervalSeconds=60rnjcs.default.elementattributes=org.apache.jcs.engine.ElementAttributesrnjcs.default.elementattributes.IsEternal=falsernjcs.default.elementattributes.MaxLifeSeconds=700rnjcs.default.elementattributes.IdleTime=1800rnjcs.default.elementattributes.IsSpool=truernjcs.default.elementattributes.IsRemote=truernjcs.default.elementattributes.IsLateral=truernrnrn##############################################################rn################## CACHE REGIONS AVAILABLE ###################rn# Regions preconfirgured for cachingrnjcs.region.testCache1=RCrnjcs.region.testCache1.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesrnjcs.region.testCache1.cacheattributes.MaxObjects=1000rnjcs.region.testCache1.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCachernjcs.region.testCache1.cacheattributes.UseMemoryShrinker=truernjcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=30rnjcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=300rnjcs.region.testCache1.cacheattributes.MaxSpoolPerRun=100rnjcs.region.testCache1.elementattributes=org.apache.jcs.engine.ElementAttributesrnjcs.region.testCache1.elementattributes.IsEternal=falsernjcs.region.testCache1.elementattributes.MaxLifeSeconds=60000rnjcs.region.testCache1.elementattributes.IsLateral=truernjcs.region.testCache1.elementattributes.IsRemote=truernrnjcs.region.testCache2=DCrnjcs.region.testCache2.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesrnjcs.region.testCache2.cacheattributes.MaxObjects=100rnjcs.region.testCache2.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCachernjcs.region.testCache2.cacheattributes.UseMemoryShrinker=truernjcs.region.testCache2.cacheattributes.MaxMemoryIdleTimeSeconds=1000rnjcs.region.testCache2.cacheattributes.ShrinkerIntervalSeconds=40rnjcs.region.testCache2.elementattributes=org.apache.jcs.engine.ElementAttributesrnjcs.region.testCache2.elementattributes.IsEternal=falsernjcs.region.testCache2.elementattributes.MaxLifeSeconds=600rnjcs.region.testCache2.elementattributes.IsSpool=truernjcs.region.testCache2.elementattributes.IsRemote=truernjcs.region.testCache2.elementattributes.IsLateral=truernrnjcs.region.testCache3=rnjcs.region.testCache3.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributesrnjcs.region.testCache3.cacheattributes.MaxObjects=100000rnjcs.region.testCache3.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCachernjcs.region.testCache3.cacheattributes.UseMemoryShrinker=falsernjcs.region.testCache3.cacheattributes.MaxMemoryIdleTimeSeconds=10rnjcs.region.testCache3.cacheattributes.ShrinkerIntervalSeconds=60rnjcs.region.testCache3.elementattributes=org.apache.jcs.engine.ElementAttributesrnjcs.region.testCache3.elementattributes.IsEternal=falsernjcs.region.testCache3.elementattributes.MaxLifeSeconds=3600rnjcs.region.testCache3.elementattributes.IsSpool=truernjcs.region.testCache3.elementattributes.IsRemote=truernjcs.region.testCache3.elementattributes.IsLateral=truernrnrn##############################################################rn################## AUXILIARY CACHES AVAILABLE ################rnrn# Remote RMI cache without failoverrnjcs.auxiliary.RGroup=org.apache.jcs.auxiliary.remote.RemoteCacheFactoryrnjcs.auxiliary.RGroup.attributes=org.apache.jcs.auxiliary.remote.RemoteCacheAttributesrnjcs.auxiliary.RGroup.attributes.RemoteTypeName=LOCALrnjcs.auxiliary.RGroup.attributes.RemoteHost=localhostrnjcs.auxiliary.RGroup.attributes.RemotePort=1102rnjcs.auxiliary.RGroup.attributes.GetOnly=truernrn# Remote RMI Cache set up to failoverrnjcs.auxiliary.RFailover=org.apache.jcs.auxiliary.remote.RemoteCacheFactoryrnjcs.auxiliary.RFailover.attributes=org.apache.jcs.auxiliary.remote.RemoteCacheAttributesrnjcs.auxiliary.RFailover.attributes.RemoteTypeName=LOCALrnjcs.auxiliary.RFailover.attributes.FailoverServers=localhost:1102rnjcs.auxiliary.RFailover.attributes.GetOnly=falsernrn# Primary Disk Cache-- faster than the rest because of memory key storagernjcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactoryrnjcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributesrnjcs.auxiliary.DC.attributes.DiskPath=target/test-sandbox/rafrnjcs.auxiliary.DC.attributes.MaxPurgatorySize=10000rnjcs.auxiliary.DC.attributes.MaxKeySize=10000rnjcs.auxiliary.DC.attributes.MaxRecycleBinSize=5000rnjcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000

没有更多推荐了,返回首页