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 的理解

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

JCS 缓存

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

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

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

JCS和Redis

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

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

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

jcs、ehcache的配置及使用

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

jcs开源缓存框架介绍

JCS是Jakarta的项目Turbine的子项目。它是一个复合式的缓冲工具。可以将对象缓冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。对于一...
  • HUXU981598436
  • HUXU981598436
  • 2015年07月23日 11:15
  • 457

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

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

jcs缓存机制

JCS缓存介绍 1.     概要  JCS是Jakarta的项目Turbine的子项目,它是复合式的缓冲工具,具有配置灵活的特点。JCS提供内存、硬盘、分布式架构、构建缓存服务器四种方式来实现对...
  • wby__2005
  • wby__2005
  • 2013年11月27日 15:14
  • 454

JCS学习

转载自:     http://blog.csdn.net/iamaboyy/article/details/8481885            http://www.iteye.com/...
  • zero__007
  • zero__007
  • 2015年01月09日 13:52
  • 648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JCS学习(1)
举报原因:
原因补充:

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