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

简介:

 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的缓存配置


下面是一个简单的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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)对象类配置其属性的值(阅读源代码是个好办法)。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     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+)。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1581248,如需转载请自行联系原作者

相关文章
|
24天前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
42 5
|
5天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
14 1
|
12天前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
30 4
|
14天前
|
小程序 Java 程序员
【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系
【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系
28 0
|
14天前
|
Java
Java中的条件语句结构在编程中的应用
Java中的条件语句结构在编程中的应用
20 0
|
14天前
|
Java
JAVA循环结构分析与设计
JAVA循环结构分析与设计
20 1
|
16天前
|
网络协议 物联网 Java
Go与Java:在物联网领域的适用性分析
本文对比分析了Go和Java在物联网领域的适用性。Go语言因其轻量级、高效和并发特性,适合资源受限的物联网设备,特别是处理并发连接和数据流。Java则凭借跨平台性、丰富的生态系统和企业级应用能力,适用于大型物联网系统和复杂业务场景。两者在物联网领域各有优势,开发者可根据项目需求选择合适的语言。
|
18天前
|
SQL Java 关系型数据库
java 递归返回树形组织结构(附带树形菜单的搜索)
java 递归返回树形组织结构(附带树形菜单的搜索)
15 0
|
19天前
|
存储 人工智能 Java
Java 构建树型结构
Java 构建树型结构
|
19天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式