首页 > 代码库 > JCS(Java Cache System)基本结构分析和使用

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的大体组成结构:


wKioL1RwIRnw2oDaAAGEW-o4M_M323.jpg


    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及其以上,因而变化较大。文档更新缓慢,这个时候推荐查看源代码比较靠谱。

  


wKiom1RwIOrTB1qbAAI0qipe1D4509.jpg


      虽然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),一个辅助器DCjcs.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);
    }

  

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

       如图:

    wKioL1RwIomBlnRqAAAgWJqo24w328.jpg


 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


 

本文出自 “野马红尘” 博客,谢绝转载!

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