JCS学习(1)

原创 2009年04月27日 18:02:00

最近一段时间比较空,看了一下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的学习与应用四:索引式硬盘缓冲

非常感谢 http://blog.csdn.net/lfsfxy9/article/details/22696459  索引式硬盘缓冲,作为内存缓存的一个辅助,它主要的目的提供一个二级缓存,...

JCS的学习与应用三:内存缓存应用

非常感谢http://blog.csdn.net/lfsfxy9/article/details/22692249        JCS内存缓存应用          前面重点...

JCS的学习与应用二:cache.ccf配置说明

非常感谢http://blog.csdn.net/lfsfxy9/article/details/22171493     JCS比较关键的部分就是缓存配置文件,它支持自定义缓存区域...

JCS的学习与应用二:cache.ccf配置说明

JCS比较关键的部分就是缓存配置文件,它支持自定义缓存区域(region),也就是多区域缓存,可以根据不同业务要求,来对不同缓存区域进行特殊设定。还有,默认提供了辅助缓存(索引式硬盘缓存和分布式缓存)...
  • lfsfxy9
  • lfsfxy9
  • 2014年03月26日 14:13
  • 3134

浅谈我对JCS 的理解

JCS 是Java 中缓存的一种实现,支持将数据缓存到内存和硬盘中,支持设置缓存对象的有效时长。 我认为可以这么理解JCS:客户端向服务器发出请求,服务器就先去缓存中查一下有没有客户端请求的数据,...
  • N199109
  • N199109
  • 2015年03月11日 14:13
  • 365

JCS 实践

  • 2008年04月10日 17:37
  • 36KB
  • 下载

shiftone-cache swarmcache ehcache jcs 源码

  • 2011年07月11日 21:13
  • 10.65MB
  • 下载

JCS的学习与应用一:JCS谓何?

近期客户经常因为系统响应慢、甚至服务器宕机来发信给我们,当然这做为高优先级的任务,需要立即解决。通过分析应用日志和was日志,发现是出现了并发请求某些复杂数据资源的时候,造成的线程挂起、系统不响应。既...
  • lfsfxy9
  • lfsfxy9
  • 2014年03月25日 22:16
  • 1846

jcs、ehcache的配置及使用

Java 缓存系统(Java Caching System,JCS) 是一个用于 Java 应用程序的强大分布式缓存系统,它是拥有简单 API 的高度可配置的工具。具体使用方法如下: 首先需要一个...

JCS的初步探究

公司的项目一直用的是jcs来管理缓存的,最近老板让我们研究一下jcs2.0的使用。小弟不才,研究了一下,虽只学到了一点皮毛,但还是写出来和大家分享一下吧,希望可以给有兴趣的读者提供一些帮助。 首先不会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JCS学习(1)
举报原因:
原因补充:

(最多只允许输入30个字)