Ehcache介绍
关键字:Ehcache、缓存
Ehcache是一个缓存库。在开始介绍Ehcache之前,首先介绍一下常规的缓存。
1 关于缓存
以下是维基百科中对于缓存的解释:
在计算机工程领域,缓存是透明的存储以后需要的快速使用的数据的组件。
存储在缓存中的数据可能是先前已经计算好的数据或存储在别处数据的副本。如果数据存储在缓存中,
数据请求可以通过读取缓存快速的被处理。否则(如果不在缓存中),数据不得不被重新计算或从原来存储介质中提取,相比较从缓存中读取而言,处理速度较慢。
因此,缓存可以处理越多的数据请求的话,系统性能就会越好。[译文, 参见参考文献1]
2 关于Ehcache
Ehcache是一个开源、基于标准(JSR107 JCACHE,参考文献3)、用来提高性能、降低数据库压力并简化可伸缩性的缓存库(关于可伸缩性,参见参考文献4)。Ehcache是健全的、经过验证的、全特性的、使用最广泛的基于Java的缓存库。
它可以使用千兆级别的缓存,从处理中的单个或多个节点扩充到处理中/非处理中混合配置。当应用系统需要连贯的分布式缓存时,Ehcache使用开源的Terracotta服务阵列
3 Ehcache特性
3.1快速和轻量级
多年来,各种不同的性能测试已经表明Ehcache是最快的Java缓存之一。Ehcache的线程是为大规模的、高并发的系统设计的。很多
Ehcache用户几乎不知道它们在使用Ehcache,
合理的默认行为不需要初始配置。API非常简单,容易使用,使得Ehcache可以在几分钟内启动和与运行。
3.2可伸缩
为提供扩展到千兆字节,提供内存和磁盘存储。
最大的Ehcache安装在千兆字节范围上使用内存和磁盘存储,Ehcache依内存和磁盘大小被调整。
扩展到几百个缓存。
最大的Ehcache安装使用几百个缓存。
调整大型多CPU服务器的并发负载。
线程安全和性能之间有一种拉力。Ehcache的的线程初始时是粗粒度的,但已越来越多地使用Doug Lea(参见参考文献5)的建议,来实现更高的性能。
每个虚拟机中多个CacheManagers
这使得完全不同的ehcache.xml 配置使用成为可能.
使用Terracotta(开源集群框架,参见参考文献6)扩展到几百个节点(集群节点)
通过添加Terracotta, Ehcache可以扩展到任何使用场景。
3.3灵活
支持对象或序列化缓存
自Ehcache1.2后, 除序列化API外,
提供了对象API。非序列化的对象可以使用Ehcache中除DiskStore(磁盘存储)和复制之外的所有部分。
如果尝试去存储或复制对象,一个警告级别的日志消息会发出。除了元素返回的方法(获取缓存元素,可理解为数据)不同外,对象和序列化的API是一致的。序
列化和对象API的唯一区别是对象元素上的两个新方法:getObjectValue 和
getKeyValue。这使得初始使用对象缓存,然后切换到序列化上变得相当容易。也有很多的Java类未序列化。
支持缓存范围或基于元素的过期策略
每个缓存的在线时间(在线意为处于活动状态,可提供缓存服务)和下线时间(下线意为不可提供服务的状态)是可以设置的。 另外,自Ehcache1.2.1后, 可以设置每个元素的时间配置来覆盖缓存中的配置。
提供 LRU, LFU 和 FIFO缓存置换策略
Ehcache1.2提供LRU-最近最少使用、LFU-较少频率使用和FIFO-先进先出, 三种缓存置换算法。
提供内存和磁盘存储
Ehcache, 像众多的缓存解决方案一样,提供高性能的内存和磁盘存储。
缓存的动态、运行时配置
在线时间、下线时间、内存和磁盘中的最大容量等配置,可以通过变换缓存配置对象在运行时做调整。
3.4基于标准
JSR107 JCACHE API的完整实现
Ehcache提供了至今为止的JSR107 JCACHE 标准的最完整实现。因为JCACHE还没有发布JCACHE API,Ehcache发布net.sf.jsr107cache,并提供实现。
3.5可扩展
可插入监听器
Ehcache 1.2提供CacheManagerEventListener 和 CacheEventListener 接口. 配置在ehcache.xml中的接口实现可以被插入。
同伴发现, 插入复制器和监听器
分布式缓存,在Ehcache1.2中介绍的,包含很多选择和权衡。实现者可以使用内建机制或编写自己的实现。
可插入缓存扩展
可插入缓存加载器
可插入缓存异常处理器
3.6应用持久化
VM重启时,持久化存储到存储数据的磁盘, 当应用启动时,缓存数据可以使用。需要时Flush到磁盘(通过调用cache.flush()方法)
3.7监听器
CacheManager监听器
通过CacheManagerEventListener接口注册CacheManager 监听器, 实现如下事件方法:
notifyCacheAdded() 缓存被添加时监听器会得到通知
notifyCacheRemoved() 缓存被移除时监听器会得到通知
缓存事件监听器
通过CacheEventListener 接口注册缓存事件监听器, 此接口提供很多缓存事件处理后的事件通知:
notifyElementRemoved 元素被移除时监听器会得到通知
notifyElementPut 元素被添加时监听器会得到通知
notifyElementUpdated 元素被更新时监听器会得到通知
notifyElementExpired 元素被过期时监听器会得到通知
3.8JMX
Ehcache可使用JMX管理如下MBeans:
CacheManager 缓存管理器
Cache 缓存
CacheConfiguration 缓存配置
CacheStatistics 缓存统计
3.9分布式缓存
自Ehcache1.2后, 全面支持高性能、灵活、可扩展的分布式缓存。
分布式缓存包含的选项:
通过Terracotta使用集群缓存:在Ehcache中安装和使用Terracotta 只需要两行必须的配置. 缓存发现是自动的, 为调整缓存行为和性能提供很多选项。
通过RMI, JGroups, 或 JMS复制缓存: 通过多点传送(MultiCast)或手动配置实现缓存发现。更新通过习惯的同步或异步RMI连接。
自定义: 为自定义发现和复制实现提供了插件机制。
使用Terracotta 提供集群缓存
简单然而强大的集群缓存, 只需要提供两行必须的配置。
通过RMI, JGroups或JMS复制缓存
无需编程便可使用复制。只需要在ehcache.xml中配置, 可用的复制选项:
Ehcache 1.6+ 支持通过RMI, JGroups, 和 JMS复制
适当时候对于每个缓存异步或同步的复制.
适当时候对于每个缓存复制或使其无效.
可靠投递
内建的投递机制使用TCP连接之上的RMI,不是UDP(广播,不可靠)。
同伴发现
同伴发现可以是手动配置也可以是使用多点传送(MultiCast)自动发现。多点传送简单,添加和移除同伴都是自动化的。手动配置提供更好的控制, 它在多点传送被阻塞时使用。
可扩展
为自定义发现和复制实现提供了插件机制。
自力更生
分布式缓存在不同的时间进入和离开集群。当缓存第一次初始化时,可以被配置成在集群中自管自己。 一个BootstrapCacheLoader
接口的实现类BootstrapCacheLoaderFactory(抽象工厂)提供基于RMI的默认实现。 Distributed caches
enter and leave the cluster at different times.
3.10缓存服务器
Ehcache提供缓存服务器, 通过WAR包(兼容大多数Web容器),或独立服务器。缓存服务器有两套API接口: 面向RESTful 资源(参见参考文献7), 和 SOAP。这两套API均支持客户端使用任何的编程语言。
RESTful 缓存服务器
Ehcache 实现严格遵循RESTful面向资源的架构风格。
特别的:
HTTP方法GET, HEAD, PUT/POST 和 DELETE被用来指定操作方法。URI不包含方法信息。
辖域信息,用以标识在该资源上执行方法,包含在URI路径。
RESTful Web Service 通过WADL(Web Application Description Language)文件描述和暴露. 它包含你可以调用的URI, 以及传递和获取的数据描述。使用OPTIONS方法返回WADL.
为了性能, HTTP/1.1 缓存特性被全面支持,如Last-Modified, ETag 等. Ehcache 返回正确的信息到HEAD 和GET请求的条件。
SOAP 缓存服务器
Ehcache RESTFul Web Services API 暴露单独的、通常在ehcache.xml 中配置或一个IoC 容器中的CacheManager。
不支持多个CacheManagers
使用WAR或一个完整的服务器
独立的服务器使用嵌入的Glassfish web 容器。也可以使用WAR部署到任何支持Servlet 2.5的web容器中。
3.11Java EE 和缓存应用
高质量的完成通常的缓存场景和模式。
为避免并发操作中的多处理而阻塞缓存
缓存,阻塞之后的线程,直到第一个读线程填充一个缓存项。
从昂贵操作中提取缓存来提供自填充缓存
自填充缓存- read-through
(如果缓存中没有待提取数据,从存储介质(如:数据库)提取(如:数据库查询操作)并将结果放到缓存中,并返回给客户端(调用缓存读操作者)).
当元素被请求时缓存填充元素,客户端不需要知道缓存项如何被填充。 也支持不阻塞缓存项读操作的情况下,刷新缓存项。
Java EE Gzipping Servlet 过滤器
CachingFilter – 一个抽象的、可扩展的过滤器.
SimplePageCachingFilter
一个高性能的Java EE servlet 过滤器,基于请求URL和查询字符串缓存页面。它也压缩网页并传递到浏览器,压缩或非压缩依赖于HTTP请求头。缓存整个Servlet页面,不管是JSP、velocity或者其他的渲染技术。
SimplePageFragmentCachingFilter
一个高性能的Java EE 过滤器,基于请求URI和查询字符串缓存页面片段。结合Servlet请求分发器来缓存页面的局部,不管是JSP、velocity或者其他的渲染技术。可以使用jsp:include在jsp中使用。
符合Servlet 2.3 和 Servlet 2.4 规范.
可缓存命令
这是一个值得信赖的命令模式(GoF命令模式, 参见参考文献8)的扭曲:异步行为,容错和缓存。创建一个命令,缓存,然后尝试执行它。
和Hibernate一起工作
在Hibernate2.1.8 和 Hibernate3.1.3上测试, 可以利用所有的新特性,除了对象接口,和多个session工厂每个包含一个不同的Ehcache CacheManager。
新的net.sf.ehcache.hibernate.EhCacheProvider为Hibernate-3.1.3提供额外的特性。
和Google App Engine一起工作
Ehcache-1.6是兼容Google App Engine的.
通过JTA支持事务
Ehcache-2.0 支持JTA(参见参考资源9), 其成为一个在事务,两阶段提交和恢复上完全兼容的XA资源。
3.12高质量
高测试覆盖率
Ehcache 已经做了高达86%的源代码测试覆盖率. 随着时间的推移会更高. 未测试的14% 大部分是日志和异常路径。
自动化加载、限制和性能系统测试
详尽的并发测试
典型的使用50个并发线程压一段代码。同样在多核或多cpu的机器上测试,因此并发是真实的而不是仿造的。
生产测试
完整的文档
众多流行框架使用(如:hibernate)
保守的提交策略
像Linux维护质量一样, 通过严格的变更过程。
每个bug历史,完整的公开信息
对于严重的bug负责
3.13开源许可证
Apache 2.0 许可证(参见参考文献10)
参考文献:
1. 维基百科关于缓存介绍
2. Ehcache官方站点
3. JSR107标准
4. 维基百科关于可伸缩性介绍
可伸缩性原则
5. Doug Lea主页
6. Terracotta官方站点
7.维基百科关于RESTful介绍
8. 维基百科关于命令模式介绍
9. 关于JTA
10. 关于Apache License 2.0
http://blog.csdn.net/gtuu0123/archive/2009/12/13/4996763.aspx,
http://blog.csdn.net/gtuu0123/archive/2009/12/13/4997071.aspx,
http://blog.csdn.net/gtuu0123/archive/2009/12/13/4997349.aspx,
http://blog.csdn.net/gtuu0123/archive/2009/12/13/4997441.aspx
阅读(1458) | 评论(1) | 转发(0) |