当前位置: 主页 > JAVA语言

java 堆外缓存框架-java ehcache堆外缓存

发布时间:2023-04-04 22:09   浏览次数:次   作者:佚名

PAGE 13Java缓存框架及其在ASS中的应用本文从缓存机制入手,先介绍当前Java语言中最常见的几种缓存框架,然后重点剖析了其中的Ehcache,最后以ASS(档案服务系统,影像及电子档案平台IASP的子系统)数据缓存的设计及实现作为实例,说明如何在应用系统中搭建和使用数据缓存框架。关键字:缓存、缓存框架、Ehcache缓存、Java缓存框架缓存缓存是这样的一种机制:它是介于应用程序和物理数据源之间,通过降低应用程序对物理数据源访问的频次,提高应用程序的运行性能。缓存内的数据是对物理数据源中数据的复制,应用程序在运行时直接从缓存读取数据,在特定的时刻或事件会同步缓存和物理数据源的数据。缓存是在提升系统响应时常用的一种技术,按照其实现方式,通常可以分为页面缓存、处理缓存和数据缓存这三种具体的类别。页面缓存是指对页面中的内容片断进行缓??的方式;处理缓存是指对于系统层次中的某方法进行缓存,也就是对某个类的某个方法的处理结果做缓存,这样在下次处理相同请求时就可以直接取缓存中的结果;数据缓存就是对系统的数据进行缓存的方式。Java缓存框架Java中有许多开源的缓存框架,如OSCache、Java Caching system、Ehcache等。

OSCacheOSCache是一个被广泛采用的高性能的J2EE缓存框架,它是能用于任何Java应用程序的缓存解决方案。 OSCache有以下特点:能缓存任何对象,OSCache可以不受限制地缓存jsp页面或HTTP请求,任何Java对象都可以缓存;拥有全面的API,OSCache API支持通过程序来控制所有的OSCache特性;永久缓存,缓存能轻松地写入硬盘,且支持应用重启;支持集群,集群缓存数据能被独立地进行参数配置,不需要修改代码;缓存记录的过期及失效管理,可以最大限度地控制缓存对象的过期及失效,包括可插入式的设置刷新策略;OSCache官方网站: HYPERLINK "/oscache/" /oscache/。JCSJava Caching System,一个支持分布式的缓存框架,它是通过缓存各种动态数据来加速动态web应用的。JCS和其他缓存系统一样,也是一个用于高速读取,低速写入的应用程序。对于动态内容和动态报表,系统使用JCS能够获得更好的性能。如:一个网站,有重复的网站结构,使用间歇性更新方式的数据库(而不是连续不断的更新数据库),在一定时间内对于重复请求会返回相同的结果,此时就能够通过使用JCS改进其性能和伸缩性。

java 堆外缓存框架_java ehcache堆外缓存_java缓存框架 redis

JCS的官方网站: /turbine/jcs/ 。EhcacheEhcache是一个纯Java的进程中的缓存,它具有如下特性:快速,简单,低消耗,依赖性小,扩展性强;支持对象或序列化缓存;支持缓存或元素的失效,提供LRU、LFU和FIFO三种缓存策略;支持两级缓存数据:内存和磁盘,无需担心容量问题;支持虚拟机重启过程对磁盘中缓存数据的读写;提供RMI、可插入API等多种实现分布式缓存的方式;具有缓存和缓存管理器的侦听接口;支持多缓存管理器实例,以及一个实例的多个缓存区域;提供Hibernate的缓存实现,对Spring,MyBatis等多种开源框架提供了较好的支持。Ehcache的官方网站为 HYPERLINK "/" /。ASS将采用Ehcache缓存框架,这主要是从以下几方面考虑的:Ehcache快速、简单,学习和使用成本相对较低;Ehcache具有低消耗、依赖性小、扩展性强的特点,不会对现有系统造成太大的影响和负担;提供了RMI的集群配置方式,RMI是java内置支持的,无需引入第三方的jar包依赖,且相对稳定、实现简单;ASS是基于Spring、IBatis框架的,而Ehcache对Spring,MyBatis等多种开源框架提供了较好的支持。

Ehcache剖析本章将重点对Ehcache做相对深入的剖析。ehcache.xmlehcache.xml是Ehcache的核心配置文件,其所有特性都可以在该文件中体现和设置,如下所示的一个Ehcache配置文件:标签diskStore标签,配置cache文件的存放目录 ,其属性path的参数可以为如下值:user.home用户主目录; user.dir用户当前的工作目录 ;java.io.tmpdirjava默认的临时文件目录 ;任意一个指定的文件目录,2.1中的配置文件就是这种情况。defaultCache标签,默认缓存的配置信息。cache标签,一个自定义缓存的配置信息。属性cache标签中的各关键属性说明如表1所示:表1 Ehcache属性说明表属性名说明eternal设置元素是否永久生效的maxElementsInMemory内存中最大缓存对象数overflowToDisk当memory中的数量达到限制后,是否保存到Disk可选的属性timeToIdleSeconds设置元素过期前的空闲时间timeToLiveSeconds设置元素过期前的活动时间diskPersistentdisk store在虚拟机启动时是否持久化diskExpiryThreadIntervalSeconds运行disk终结线程的时间,默认为120秒cacheEventListenerFactory注册相应的缓存监听类,用于处理缓存事件,如put,remove,update,和expirebootstrapCacheLoaderFactory通过指定该类,可以实现初始化缓存及自动设置属性的功能memoryStoreEvictionPolicy数据存储与释放策略清除策略清除策略定义了缓存和缓存元素的失效机制,Ehcache支持如下三种清除策略:FIFO,first in first out,先进先出;LFU, Less Frequently Used,一直以来最少被使用的先出,缓存的元素有一个hit属性(对象命中次数),hit值最小的将会最先被清出缓存;LRU,Least Recently Used,最近最少使用的,缓存的元素有一个使用时间戳,当缓存需要清理时,现有缓存元素中使用时间戳离当前时间最远的元素将被清出缓存。

java缓存框架 redis_java 堆外缓存框架_java ehcache堆外缓存

EhCache的集群支持Ehcache从1.2版开始支持集群,从1.7版开始,支持如下的五种集群方案:Terracotta、RMI、JMS、Jgroups、Ehcache Server。本文介绍其中最为常用的三种集群方式:RMI、JGroups和Ehcache Server。在集群环境中,Ehcache所有缓存对象的键和值都必须是可序列化的,也就是必须实现 java.io.Serializable 接口。RMIRMI是Java内置的一种远程方法调用技术,是一种点对点的基于 Java 对象的通讯方式。Ehcache从1.2版开始就支持RMI方式的缓存集群。采用 RMI 集群模式时,集群中的每个节点都是对等关系的,并不存在主节点或者从节点的概念,因此节点间必须有一个机制能够互相认识对方,必须知道其它节点的信息,包括:主机地址、端口号等。EhCache提供两种节点发现方式:手工配置和自动发现。手工配置要求在每个节点中配置其它所有节点的连接信息,一旦集群中的节点发生变化时,需要对缓存进行重新配置。自动发现是通过多播(multicast)来维护集群中的所有有效节点。这也是最为简单和灵活的方式,与手工模式不同的是,每个节点上的配置信息都相同,大大方便了节点的部署,也避免人为错漏的出现。

由于RMI是Java中内置支持的技术,因此使用RMI集群模式时,无需引入其它Jar包,Ehcache本身就带有支持RMI集群的功能。JGroupsEhcache从1.5版开始增加了JGroups的分布式集群模式。与RMI方式相比较,JGroups提供了非常灵活的协议栈、可靠的单播和多播消息传输机制,但其主要的缺点是配置复杂以及一些协议栈对第三方jar包的依赖。JGroups也提供了基于TCP的单播( Unicast )和基于UDP的多播(Multicast),对应于RMI的手工配置和自动发现。Ehcache Server与前面介绍的两种集群方案不同的是,Ehcache Server 是一个独立的缓存服务器,其内部使用 Ehcache做为缓存系统,可利用前面提到的两种方式进行内部集群。对外提供编程语言无关的基于HTTP的RESTful或SOAP的数据缓存操作接口。应用实例本文将以ASS为例,说明在应用系统中如何应用缓存框架。和绝大多数应用系统类似,ASS的业务处理流程依赖于系统配置,需要在处理过程中一次或多次读取相关的系统配置信息。而为了保证系统的灵活性和可维护性,配置信息存放于数据库中,这就相当于:针对每一次处理,都有至少一次读数据库配置信息的操作,以致增加了系统处理的时间开销、且在大并发的情况下会造成对数据库同一张表的频繁访问,从而影响系统的处理效率。

java ehcache堆外缓存_java 堆外缓存框架_java缓存框架 redis

显然,通过使用缓存框架可以解决上述问题。下面介绍ASS系统数据缓存的设计与实现。设计方案ASS主要针对的是数据缓存,后续提到的缓存也都是指数据缓存。ASS基于Ehcache实现的数据缓存机制是:系统启动的时候调用缓存初始化方法先将数据加载至缓存中;运行过程中当需要使用这些数据的时候,首先从缓存中读取,当缓存中不存在时再从数据源中获取;当系统修改调整数据源时,触发缓存同步机制,将变化信息及时同步至缓存中,使缓存中的信息同数据源保持一致。如图1所示。图1 ASS缓存机制示意图主键生成规则对象类名 + “_” + 属性名1 + “@” + 属性值1 + “_” + 属性名2 + “@” + 属性值2 + …EhCache中缓存的数据是以键值对的形式存储的,为了便于读取,需要为每个缓存的数据对象生成唯一的主键。ASS中采用如下规则生成主键:其中涉及的多个属性是该对象的联合唯一标识,由此保证该主键在整个缓存域中唯一。缓存管理系统启动的时候调用初始化方法完成缓存加载。缓存同步机制,采用spring AOP的后处理机制,对已缓存对象的相关操作方法(增、删、改)进行后处理,当获取到方法调用成功信息之后再调用缓存更新方法将更新信息同步到缓存中。

如图2所示:图2 数据维护流程图为提高查询效率,采用spring AOP 的环绕处理机制,对已缓存对象的查询操作进行代理,先调用缓存的查询方法,若返回结果不为空则直接返回java 堆外缓存框架,若为空则调用真正的数据查询方法从数据源中获取数据。如图3所示。图3 数据访问流程图前台提供缓存查看界面,支持查看缓存中的数据,同时实现手动刷新缓存的操作按钮。缓存配置ASS中的缓存配置如2.1中的ehcache.xml所示。由于缓存中的数据需要在系统的整个运行过程中一直生效,故eternal="true"。当前条件下,timeToIdleSeconds和timeToLiveSeconds属性将失效。使用的清理策略为LFU。集群数据同步由于ASS最终运行在WAS集群环境下,故在ASS中的缓存需要做集群配置。采用RMI多播的方式实现集群配置,具体配置方式可参见2.1中的ehcache.xml。cacheManagerPeerProviderFactory定义了在集群环境中查询有效缓存节点的方式为自动发现;cacheManagerPeerListenerFactory定义了集群中同步信息的监听器为RMICacheManagerPeerListenerFactory;自定义缓存assCache通过cacheEventListenerFactory属性注册了RMI事件监听器RMICacheReplicatorFactory,监听assCache的增、删、改和过期操作。

java 堆外缓存框架_java缓存框架 redis_java ehcache堆外缓存

当CACHE1监听被触发之后,先查询集群下的所有缓存节点,然后往这些节点发送同步信息;CACHE2通过监听获取CACHE1的同步信息之后,将同步信息更新至CACHE2的内存中,从而保持CACHE1、CACHE2的数据同步。如图4所示:图4 集群缓存数据RMI同步方式实现本节主要介绍结合Spring,在ASS中基于Ehcache应用数据缓存的实现方式,其中缓存配置方式如3.1.3节所述,在此不再赘述。缓存对象在集群环境中,Ehcache所有缓存对象的键和值都必须是可序列化的java 堆外缓存框架,也就是必须实现 java.io.Serializable接口,同时其还需要按照3.1.1中设计的主键生成规则生成相应的主键,故针对所有的待缓存对象,抽象出缓存基类:CacheBaseObject,所有的缓存对象都继承自该缓存基类,并实现自己的主键生成方法genCacheKey()。CacheBaseObject的实现代码如附件5.1 CacheBaseObject.java所示。缓存操作接口实现缓存操作工具类ASSCacheUtil,在该工具类中对缓存及缓存的所有操作方法进行封装,然后通过Spring的初始化使ASSCacheUtil在整个JVM运行环境中是单例模式的,从而使应用系统中所有缓存相关操作都是通过同一个对象实例实现的,这样进一步保证缓存数据的一致性和完备性。ASSCacheUtil的代码如附件5.2 ASSCacheUtil.java所示。Spring中配置Ehcache通过Spring 来实现Ehcache的配置及加载,其配置文件片段如下所示:

classpath:ehcache.xml

java ehcache堆外缓存_java 堆外缓存框架_java缓存框架 redis

assCache

Spring AOP使用Spring AOP 的后处理机制,在ASS中实现CacheAfterAspect类,为数据源的所有维护类操作方法(新增、修改、删除)增加后处理,实现缓存数据的同步机制。使用Spring AOP 的环绕处理机制,在ASS中实现CacheAroundAspect类,代理ASS的查询操作:先在缓存中查找,当缓存中数据为空时再调用查询接口从数据源中获取数据。CacheAfterAspect、CacheAroundAspect实现代码分别如附件5.3 CacheAfterAspect.java,附件5.4 CacheAroundAspect.java所示。Spring AOP 相关配置如下:

测试结果从理论上分析,ASS基于Ehcache实现缓存机制之后,应解决当前ASS系统中存在的问题,且其处理性能、系统吞吐量等都应该有一定程度的提高,如表2所示。表2 ASS缓存机制实现前后对照表比较项实现前实现后数据库访问每次请求至少访问一次请求几乎无需访问数据, 数据库连接每次请求至少占用一个数据库连接几乎不占用数据库连接消耗时间取决于数据库响应时间消耗时间同内存中读取数据时间一致热表现象大并发情况下会出现不会通过实际测试,发现优化后的ASS确实达到了上述效果,且通过对后台日志的监控和分析,可以得出:集群下的缓存数据,能在0.1秒内同步到其所有有效节点。总结Ehcache是Java语言中一个相对成熟和稳定的缓存框架,本文以Ehcache为基础,结合Spring框架,提供了一个相对通用的数据缓存设计方案,并通过ASS中的具体实现,验证了该方案的可行性和可用性。该方案对应用系统搭建、使用数据缓存具有一定的指导意义,同时,文中谈及的主键生成规则、基类抽象、工具类封装、单例模式及Spring AOP的应用等设计方式,对其它方案的设计,也具有一定的参考价值。