JCS(Java Cache System)基本结构分析和使用

JCS(Java Caching System)项目: http://commons.apache.org/proper/commons-jcs/index.html

JCS是用java编写的一个分布式缓存系统。它旨在通过提供一种手段来管理各种动态性质的缓存数据加快应用程序,它是一个复合式的缓冲工具,据说是超越简单的对象缓存,可以将对象缓冲到内存、硬盘(本地磁盘,网络地址磁盘,数据库),具有缓冲对象时间过期设定,还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。

对于一些需要频繁访问而每访问一次都非常消耗资源的对象,读操作远远多于写操作的应用,JCS提供缓冲区,这样可以提高服务的性能,并且JCS提供多种辅助器用来配合缓存区,使其不仅仅是对象缓存那么简单。

1.关于JCS的版本问题

JCS1.3是第一个官方正式版本,目前(2014年11月22日)2014年3月25日发布了Version: 2.0-SNAPSHOT。

本文基于JCS1.3的文档作说明,可以结合最新文档,基本用法和整体的结构变化相似。

JCS 1.3工作在JDK1.3及其以上,依赖Commons Logging和Doug Lea‘s(《Java并发编程实战》作者之一) Util Concurrent

JCS 2.0工作在JDK1.6及其以上,仅依赖Commons Logging。

目前JCS1.3是稳定版,JCS的基本构成没有多大变化,只是JCS1.3支持较低版本的JDK,这样会有一些顾及的东西,而JCS2.0则支持JDK1.6及以上,算是一个新的开始。可以关注其后续版本,尽可能的使用JCS2.0.

2.JCS的基本构成

JCS通过配置属性值来描述如何缓存数据的具体信息,可以很容易的将JCS应用到系统中,而且只需要调整配置属性的值,既可以达到不同缓存的实现和效果。

下图是JCS的大体组成结构:

JCS通过组合式缓存管理器来管理缓存。通过类似于Log4j的配置文件方式配置不同的缓存区,在JCS中默认提供了名称为default的缓存区。对于每一个缓存存都有且仅有一个Memory的Auxiliary(辅助器),其他诸如磁盘辅助器,横向分布辅助器等可以通过组合来增强每个缓存区。

JCS根据配置中不同的缓存区获得实例对象如cacheAccess和GroupCacheAcess,这两个对象来进行数据的缓存和获取等操作。另外,JCS高度灵活,可以通过编码的方式来定义新的缓存区。

3.JCS的辅助器描述

下图是JCS辅助器的简单描述,由于JCS1.3的文档陈旧,现JCS2.0的文档有更新(http://commons.apache.org/proper/commons-jcs/index.html)描述方面有出入,并且JCS1.3文档中提到的部分特性在发布版本中没有具体实现,但是JCS2.0文档又未曾提及。鉴于JCS2.0以后将支持JDK1.6及其以上,因而变化较大。文档更新缓慢,这个时候推荐查看源代码比较靠谱。

虽然JCS提供了较为丰富的辅助器,依照个人观点,内存辅助和磁盘辅助器的IndexedCacahe能常用一些。相反其中横向扩展和构建分布式结构的一些特性往往可以采用其他替代。(PS:上图如不能完整显示,可以点击查看完整图)

3.JCS的缓存配置

下面是一个简单的配置:

# DEFAULT CACHE REGION
jcs.default=
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.default.cacheattributes.UseMemoryShrinker=false
jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.ShrinkerIntervalSeconds=60
jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes
jcs.default.elementattributes.IsEternal=true
jcs.default.elementattributes.MaxLifeSeconds=21600
jcs.default.elementattributes.IdleTime=1800
jcs.default.elementattributes.IsSpool=true
jcs.default.elementattributes.IsRemote=true
jcs.default.elementattributes.IsLateral=true

# PRE-DEFINED CACHE REGIONS
jcs.region.icache=DC
jcs.region.icache.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.region.icache.cacheattributes.MaxObjects=1000
jcs.region.icache.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.icache.cacheattributes.UseMemoryShrinker=false
jcs.region.icache.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.region.icache.cacheattributes.ShrinkerIntervalSeconds=60
jcs.region.icache.cacheattributes.MaxSpoolPerRun=500
jcs.region.icache.elementattributes=org.apache.jcs.engine.ElementAttributes
jcs.region.icache.elementattributes.IsEternal=false

jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=${user.dir}/jcs_swap
jcs.auxiliary.DC.attributes.MaxPurgatorySize=10000000
jcs.auxiliary.DC.attributes.MaxKeySize=1000000
jcs.auxiliary.DC.attributes.MaxRecycleBinSize=5000
jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000
jcs.auxiliary.DC.attributes.ShutdownSpoolTimeLimit=60

上面配置有两个缓存区dafult(jcs.default)和icache(jcs.region.icache),一个辅助器DC(jcs.auxiliary.DC),其中缓存区icache使用了DC辅助器(jcs.region.icache=DC)。

由此可见icache缓存区可以通过磁盘索引来缓存数据。

另外关于配置中的内容如何去写,可以参考文档:

http://commons.apache.org/proper/commons-jcs/LocalCacheConfig.html

http://commons.apache.org/proper/commons-jcs/JCSPlugins.html

PS:另外一个办法是通过API查看对应的缓存属性对象(CacheAttributes)和元素属性(ElementAttributes)对象类配置其属性的值(阅读源代码是个好办法)。

根据上面的缓存区配置一段使用示例代码:

    public static void main(String[] args) throws CacheException {

        CacheAccess cacheAccess = JCS.getAccess("icache");
        for (int i = 0; i < 10000; i = i + 2) {
            cacheAccess.put("id" + i, i);
        }
        int count = 0;
        for (int i = 0; i < 10000; i++) {
            Object o = cacheAccess.get("id" + i);
            if (null == o) {
                cacheAccess.put("id" + i, i);
                count++;
            }
        }
        System.out.println("缓存次数:"+count);
        count = 0;
        for (int i = 0; i < 10000; i++) {
            Object o = cacheAccess.get("id" + i);
            if (null == o) {
                cacheAccess.put("id" + i, i);
                count++;
            }
        }
        System.out.println("缓存次数:"+count);
    }

运行上面测试代码之后,在当前工作目录下生成了缓存文件。

如图:

4.最后

由于本文依JCS1.3而写,必然和未来JCS2.0的稳定版有较大出入,不过JCS的基本结构和用法基本相似,辅助器的方式扩展缓存的思想依然支撑着JCS,可以继续关注JCS的后续发展,今早使用最新的JCS2.0的版本(该版本支持JDK1.6+)。

拓展资料:

JCS配置项备忘:http://favccxx.blog.51cto.com/2890523/1204907

JCS使用过程中的注意事项:http://99307064.blog.51cto.com/718663/1432996

五步教你使用JCS快速搭建缓存环境:http://favccxx.blog.51cto.com/2890523/1204907

Doug Lea‘s Util Concurrent: http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html

时间: 2024-08-09 21:59:30

JCS(Java Cache System)基本结构分析和使用的相关文章

java Cache框架

Cache框架乱炖 各类开源的缓存解决方案 JBossCache/TreeCacheJBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让你轻松进行Jboss服务器之间的集群工作.JBossCache能够通过Jboss应用服务或其他J2EE容器来运行一个Mbean服务,当然,它也能独立运行. JBossCache包括两个模块:TreeCache和TreeCacheAOP. TreeCache --是一个树形结构复制的事务处理缓存. Tre

java中System.getenv和System.getProperties的区别

System.getenv获取的是系统的环境变量(就是用户在操作系统中设置的环境变量),windows和linux下环境变量的设置就不说了哦. System.getProperties获取的是系统的相关属性.在java api文档中已经列出了如下属性 如果我们要在java程序启动就能获取自定义的系统属性我们可以使用 java –Dname=zhuhui 这样我们就在系统属性中设置了名称为myname值为zhuhui的系统属性,那么就可以通过System.getProperty("name&quo

android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V 提醒,google后在网上说是因为sdk版本的问题. 解决方法: 修改选择不同的API就好了,降低版本即可

How to solve Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V in Android

android开发打开别人的项目的时候,手机面板上的控件有时候不能显示,还显示错误信息: Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V Exception details are logged in Window > Show View > Error Log 原因是目前采用的API版本与原来的API版本不匹配,把API版本改一下即可.

Android的布局文件遇到Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V问题

打开xml的布局文件,发现布局无法显示预览,而且报错:Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V.原来是因为用了最新的API 20.这个是Android用于开发可穿戴设备的,不支持EditText.将API改为20之前的就行了.

java的System.getProperty()方法能够获取的值

java.version Java 执行时环境版本号 java.vendor Java 执行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装文件夹 java.vm.specification.version Java 虚拟机规范版本号 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specification.name Java 虚拟机规范名称 java.vm.version Jav

【转载】Java中System.loadLibrary() 的执行过程

最近复习JNI,通过AndroidStudio导入源码一点点的跟踪分析so库的加载过程. 在网上发现有其他同学做了同样的工作,对比文章看起来更加轻松.感谢他们的工作!下面是其中比较好的一篇的转载. 原文链接:http://my.oschina.net/wolfcs/blog/129696 未经许可转载,如有侵权,请联系我删除. 目录[-] 系统的library path Native 层load library的过程 System.loadLibrary()是我们在使用Java的JNI机制时,会

java的System.getProperty()方法可以获取的值

java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specification.name Java 虚拟机规范名称 java.vm.version Java 虚

java的System.getProperty()值的方法可以得到

java.version Java 执行时环境版本号 java.vendor Java 执行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装文件夹 java.vm.specification.version Java 虚拟机规范版本号 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specification.name Java 虚拟机规范名称 java.vm.version Jav