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和Redis

在执行应用程序的时候,若数据库进行读操作时,在中间增加一些缓存来提高效率。 一般将配置数据进行加入缓存,缓存一般有两种类型 A:JCS B:Redis...
  • u011344885
  • u011344885
  • 2016-07-30 11:30:42
  • 314

JCS实现分布式缓存共享

由于要做一个产品,并想希望产品实现分布式,不得不研究下分布式缓存。缓存的开源项目很多,通过测试,JCS配置及使用最为容易,所以就选用它做为产品缓存管理器。 JCS是Apache的一个开源项目,项目网址...
  • zjjsgwm
  • zjjsgwm
  • 2009-11-13 22:35:00
  • 1230

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

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

JCS 缓存

JCS 概述 JCS 是一个用 Java 语言编写的缓存系统,可以使用它来创建 Java 桌面和 Web 应用程序。它提供了在缓存器中存储数据、从缓存器中删除数据等方便机制。 使用 JCS...
  • sjzs5590
  • sjzs5590
  • 2012-08-21 19:58:39
  • 1297

JCS的学习与应用四:索引式硬盘缓冲

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

五步教你使用JCS快速搭建缓存环境

JCS是Jakarta的项目Turbine的子项目。它是一个复合式的缓冲工具。可以将对象缓冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。对于一...
  • u010405751
  • u010405751
  • 2013-05-22 19:43:32
  • 599

JCS的初步探究

公司的项目一直用的是jcs来管理缓存的,最近老板让我们研究一下jcs2.0的使用。小弟不才,研究了一下,虽只学到了一点皮毛,但还是写出来和大家分享一下吧,希望可以给有兴趣的读者提供一些帮助。 首先不会...
  • zhang995001862
  • zhang995001862
  • 2016-04-16 09:49:47
  • 293

java 缓存jcs

java 缓存jcs: 有时候我们需要频繁的访问数据库获得某些数据,这样大大的增加了访问数据库方面的开销,降低了系统的性能。 一 解决办法: 将数据放进缓存中。 二 适用条件: 1 需要经常使用 2 ...
  • hahaxiaozhuanfeng
  • hahaxiaozhuanfeng
  • 2014-02-07 15:33:04
  • 452

ORACLE云,JCS应用部署常见问题

Jar包找不到问题   Jar包找不到问题   在WEB-INF目录下的weblogic.xml中加入:             true    换JDK 有时候J...
  • xcjing
  • xcjing
  • 2017-03-15 18:14:11
  • 156

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

非常感谢http://blog.csdn.net/lfsfxy9/article/details/22692249        JCS内存缓存应用          前面重点...
  • HUXU981598436
  • HUXU981598436
  • 2015-07-23 12:55:22
  • 817
收藏助手
不良信息举报
您举报文章:JCS学习(1)
举报原因:
原因补充:

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