JCS 实践

(此文转载自CSDN)

1    使用方法
1.1    缓冲区(region)的概念
缓冲区可以理解为内存中临时存放缓冲对象的一个区域,使用缓冲区可以改善某些应用的性能。每个应用根据自身需要,可以定义多个缓冲区,各个缓冲区具有不同的属性,比如缓冲区大小、缓冲过期时间、缓冲区构架等等。不同类型的对象放在不同的缓冲区中以满足不同的需要。
缓冲区在JCS中以一个String对象来标示,以方便配置和编程。虽然可以使用中文来作为缓冲区的名称,不过还是推荐使用英文字符,而且不要有空格或者特殊字符。
1.2    缓冲编程
缓冲区的概念清晰后,缓冲编程非常简单。
首先通过缓冲区的名称拿到缓冲对象。比如,有一个用户对象的缓冲区被预先定义为AccountObjectCache,那么通过一个语句就可以拿到缓冲区对象:
JCS accountObjectCache = JCS.getInstance(“AccountObjectCache”);
这时,可以将读取消耗资源非常大的对象根据关键字临时存放在缓冲区中,
accountObjectCache.put(key, value);
需要时,又可以通过accountObjectCache.get(key);拿回缓冲对象。
类JCS是缓冲编程时唯一涉及到的类,使用方法可以查看javadoc。
Put和get方法与Map的接口非常相似,区别在于Map可以保证你put进去的东西可以拿回来,而缓冲区不会保证这一点。缓冲区会根据配置以一定方式运作,比如时间过期,或者缓冲区占满时,会自动将缓冲对象清除。外部程序再用key来获取对象时,就会返回null。
编程时,不会涉及到缓冲区的构架,这使得一个应用写好之后只需要修改配置,而不需要修改源代码就可以改变应用的缓冲构架。
1.3    缓冲区(region)的配置
JCS是一个比较完善的组合式的缓冲工具,可以根据配置来改变其缓冲区的结构。
在JCS的配置文件中(WEB-INF/classes/cache.ccf),有一个默认配置(default),也可以对每个缓冲区(region)单独配置,没有单独配置特性的缓冲区将使用默认的配置。
根据修改配置,可以构建JCS提供的各种特性。最基本的,可以配置内存缓冲区大小,缓冲过期时间。还可以配置加挂的辅助缓冲,包括缓冲到硬盘,缓冲到并行服务器,或者缓冲到其他存储介质。具体的配置方法,可以参照JCS的官方文档或者《JCS简介》。
不过,现在的服务器内存很大,而且硬盘相对还是太慢,所以个人感觉还没有必要使用硬盘缓冲。单机运行的情况下内存缓冲就足以解决问题。多台机器的情况下,也没有使用硬盘缓冲。
JCS目前在Turbine、Torque、Hibernate等几个工具中作为底层的缓冲器。但是JCS的分布式缓冲还不是很稳定,所以Hibernate并没有使用它的分布功能。
1.4    JCS后台控制
JCS提供了一个内置的后台控制Servlet
org.apache.jcs.admin.servlet.JCSAdminServlet
可以配置使用这个Servlet来查看JCS缓冲区的使用情况,以及清除缓冲区,或者清除缓冲区中的某个缓冲对象。
  <servlet>
      <servlet-name>JCSAdminServlet</servlet-name>
      <servlet-class>org.apache.jcs.admin.servlet.JCSAdminServlet</servlet-class>
      <init-param>
          <param-name>properties</param-name>
          <param-value>WEB-INF/conf/JCSAdminServlet.velocity.properties</param-value>
      </init-param>
  </servlet>
2    内部构造
    JCS整体框架主要分为三个大的部分。访问接口(access)、缓冲引擎(engine)以及辅助缓冲(auxiliary)。下面对这三个层面单独描述。
2.1    访问接口
java.lang.Object
  |
  +--org.apache.jcs.access.CacheAccess
        |
        +--org.apache.jcs.access.GroupCacheAccess
              |
              +--org.apache.jcs.JCS
JCS是CacheAccess和GroupCacheAccess的子类,实现接口有
org.apache.jcs.access.behavior.IcacheAccess
org.apache.jcs.access.behavior.IGroupCacheAccess
这些接口定义了JCS的行为,主要是以关键字为检索条件的缓冲,还有以关键字为条件的分组缓冲。
2.2    缓冲引擎
    JCS缓冲体系的缓冲引擎的结构很完善,并且具有良好的可扩展性。主体结构是一个组合式缓冲器(CompositeCache),其中有一个内存缓冲器(MemoryCache)和若干个辅助缓冲器(AuxiliaryCache)。
    构建缓冲器时,首先向组合式缓冲管理器(CompositeCacheManager)申请,组合式缓冲管理器会构建一个缓冲配置器(CompositeCacheConfigurator)来从配置文件读取缓冲的配置,然后根据配置来构建组合式缓冲器(CompositeCache)。
    配置好的组合式缓冲器会单独工作,管理读写自己缓冲区。
    写入组合式缓冲器的对象首先会写入内存缓冲器,内存缓冲器的管理算法受具体实现的影响,已经提供的有LRU算法和MRU算法。也可以自定义新的算法。然后组合式缓冲器会检查自己的所有的辅助缓冲器,通知每个辅助缓冲器更新缓冲区。辅助缓冲器的写入动作都是异步的,因此不会因为辅助缓冲器的响应较慢而阻塞写入线程。
    当从组合式缓冲器读取对象时,会首先检查内存缓冲器,如果命中对象,则直接返回。如果配置中声明了过期时间,还会检查对象是否过期。当然,还有一个后台线程隔一段时间自动将过期数据从内存缓冲区内清扫出去,以使得内存缓冲区达到尽可能高的利用率。如果内存缓冲器中没有指定关键字的对象,则会依次去各个辅助缓冲器中查找。如果都没有找到,则返回null。这是缓冲区的特性,缓冲区不是Map,放入的对象过一段时间可能就被挤出缓冲区了。
    当通知组合式缓冲器去除某个关键字的对象时,也是先通知内存缓冲器去除,然后依次通知各个辅助缓冲器移除该关键字的对象。
2.3    辅助缓冲
    目前提供的辅助缓冲器有以下三种,硬盘缓冲,并行式的分布缓冲,星状的客户/服务式的缓冲。如果有新的构思,还可以自定义新的辅助缓冲器。
2.3.1    索引式硬盘缓冲(Indexed Disk Cache)
    其实,硬盘缓冲还有另外两种,可能都不如索引式硬盘缓冲,所以在JCS的文档中没有描述。他们是
    org.apache.jcs.auxiliary.disk.jisp.JISPCache
    org.apache.jcs.auxiliary.disk.hsql.HSQLCache
    这两个只是提一下,我也没有研究过。
    文档中称索引式硬盘缓冲可能是性能最好的硬盘缓冲方式,缓冲对象放置在缓冲文件中,但是所有的缓冲入口都放在内存中,也就是说,在索引式硬盘缓冲器中定位缓冲对象就像从Map对象中查找一样快,而从硬盘上读取缓冲对象需要2个物理读取。由于辅助缓冲的写入动作是异步的,所以不会写入也是非常快的。
    索引式硬盘缓冲器在正常关闭的情况下会把内存中的对象索引写入到硬盘,下次启动时会从索引文件中恢复缓冲数据的索引。
2.3.2    横向式的并行缓冲(Lateral Cache)
    横向式的并行缓冲方式下,每个物理机器上的横向缓冲器会榜定一个socket端口,监听其他机器来的信息。同时向其他配置中描述的所有物理机器的监听端口创建连接。如果连接失败,就会进入修复模式,每隔一段时间再次尝试连接。直到所有的连接都恢复正常为止。
    当发生写入动作时,会将写入的缓冲对象包装成缓冲元素(ICacheElement),然后通过TCP连接发送到其他机器。
    当发生去除动作时,会将关键字发送到其他机器,通知他们删除。
    当发生读取动作时,如果PutOnlyMode设为true,那么将简单返回null。如果PutOnlyMode设为false,那么将会从远程的并行缓冲区读取。
2.3.3    Client/Server式的缓冲(Remote Cache)
    RemoteCache的内部构造我也没有研究过,如果需要英文版文档,javadoc,以及源代码,可以在http://jakarta.apache.org/turbine/jcs找到。
3    相关资料
http://jakarta.apache.org/turbine/jcs/index.html
上述链接可以下载了JCS的官方文挡以及源代码(HTML)
http://hibernate.bluemars.net/61.html?cowiki=04ebcdc71e10026c3440002ebff8c1ad
JCS在Hiberate中的使用说明

你可能感兴趣的:(apache,编程,应用服务器,servlet,配置管理)