特性一览
最小的依赖:唯一的依赖就是SLF4J了。
缓存在内存和磁盘存储可以伸缩到数G,Ehcache为大数据存储做过优化。大内存的情况下,所有进程可以支持数百G的吞吐。为高并发和大型多CPU服务器做优化。线程安全和性能总是一对矛盾,Ehcache的线程机制设计采用了Doug Lea的想法来获得较高的性能。单台虚拟机上支持多缓存管理器。
通过Terracotta服务器矩阵,可以伸缩到数百个节点。Ehcache 1.2具备对象API接口和可序列化API接口。
不能序列化的对象可以使用除磁盘存储外Ehcache的所有功能。
除了元素的返回方法以外,API都是统一的。只有这两个方法不一致:getObjectValue和getKeyValue。这就使得缓存对象、序列化对象来获取新的特性这个过程很简单。
支持基于Cache和基于Element的过期策略,每个Cache的存活时间都是可以设置和控制的。提供了LRU、LFU和FIFO缓存淘汰算法,Ehcache 1.2引入了最少使用和先进先出缓存淘汰算法,构成了完整的缓存淘汰算法。
提供内存和磁盘存储,Ehcache和大多数缓存解决方案一样,提供高性能的内存和磁盘存储。
动态、运行时缓存配置,存活时间、空闲时间、内存和磁盘存放缓存的最大数目都是可以在运行时修改的。
Ehcache提供了对JSR107 JCACHE API最完整的实现。因为JCACHE在发布以前,Ehcache的实现(如
net.sf.jsr107cache)已经发布了。
实现JCACHE API有利于到未来其他缓存解决方案的可移植性。hcache的维护者Greg Luck,正是JSR107的专家委员会委员。监听器可以插件化。
Ehcache 1.2提供了CacheManagerEventListener和CacheEventListener接口,实现可以插件,并且可以在ehcache.xml里配置。节点发现,冗余器和监听器都可以插件化。
分布式缓存,从Ehcache 1.2开始引入,包含了一些权衡的选项。Ehcache的团队相信没有什么是万能的配置。实现者可以使用内建的机制或者完全自己实现,因为有完整的插件开发指南。
缓存的可扩展性可以插件化。创建你自己的缓存扩展,它可以持有一个缓存的引用,并且绑定在缓存的生命周期内。缓存加载器可以插件化。创建你自己的缓存加载器,可以使用一些异步方法来加载数据到缓存里面。缓存异常处理器可以插件化。创建一个异常处理器,在异常发生的时候,可以执行某些特定操作。在VM重启后,持久化到磁盘的存储可以复原数据。Ehcache是第一个引入缓存数据持久化存储的开源Java缓存框架。缓存的数据可以在机器重启后从磁盘上重新获得。根据需要将缓存刷到磁盘。将缓存条目刷到磁盘的操作可以通过cache.flush()方法来执行,这大大方便了Ehcache的使
用。
缓存管理器监听器。允许注册实现了CacheManagerEventListener接口的监听器:
notifyCacheAdded()
notifyCacheRemoved()
缓存事件监听器。允许注册实现了CacheEventListener接口的监听器,它提供了许多对缓存事件发生后的处理机制:
notifyElementRemoved/Put/Updated/Expired
Ehcache的JMX功能是默认开启的,你可以监控和管理如下的MBean:
CacheManager、Cache、CacheConfiguration、CacheStatistics
从Ehcache 1.2开始,支持高性能的分布式缓存,兼具灵活性和扩展性。
分布式缓存的选项包括:
通过Terracotta的缓存集群:设定和使用Terracotta模式的Ehcache缓存。缓存发现是自动完成的,并且有很多选项可
以用来调试缓存行为和性能。
使用RMI、JGroups或者JMS来冗余缓存数据:节点可以通过多播或发现者手动配置。状态更新可以通过RMI连接来异步或
者同步完成。
Custom:一个综合的插件机制,支持发现和复制的能力。
可用的缓存复制选项。支持的通过RMI、JGroups或JMS进行的异步或同步的缓存复制。
可靠的分发:使用TCP的内建分发机制。
节点发现:节点可以手动配置或者使用多播自动发现,并且可以自动添加和移除节点。对于多播阻塞的情况下,手动配
置可以很好地控制。
分布式缓存可以任意时间加入或者离开集群。缓存可以配置在初始化的时候执行引导程序员。
BootstrapCacheLoaderFactory抽象工厂,实现了BootstrapCacheLoader接口(RMI实现)。
缓存服务端。Ehcache提供了一个Cache Server,一个war包,为绝大多数web容器或者是独立的服务器提供支持。
缓存服务端有两组API:面向资源的RESTful,还有就是SOAP。客户端没有实现语言的限制。
RESTful缓存服务器:Ehcached的实现严格遵循RESTful面向资源的架构风格。
SOAP缓存服务端:Ehcache RESTFul Web Services API暴露了单例的CacheManager,他能在ehcache.xml或者IoC
容器里面配置。
标准服务端包含了内嵌的Glassfish web容器。它被打成了war包,可以任意部署到支持Servlet 2.5的web容器内。
package com.spring.cache;
import static org.junit.Assert.assertTrue;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.pool.Pool;
import org.slf4j.Logger;
public class TestDefaultCache {
private Logger Log;
//测试类
public static void main(String[] args) {
TestDefaultCache.cacheLocate("C:\\DATA\\cache");
}
// 使用缓存的基本操作
public static void testDefault(){
//从classes目录中查找encache.xml配置文件
CacheManager cacheManager=CacheManager.getInstance();
//根据配置文件获Cache实例
Cache cache=cacheManager.getCache("test");
//清空cache中的所用元素
cache.removeAll();
//往cache中添加元素,这里的Element相当于HashMap中的键值对Entry<K,V>;
cache.put(new Element("s1","1111"));
cache.put(new Element("s2","2222"));
System.out.println("calculateOnDiskSize: "+cache.calculateOnDiskSize());
System.out.println("MemoryStoreSize: "+cache.getMemoryStoreSize());
assertTrue(cache.getMemoryStoreSize() + cache.calculateOnDiskSize() == 2);
EhCache.xml文件
assertTrue(cache.getMemoryStoreSize() + cache.calculateOnDiskSize() == 2);
//System.out.println("MemoryStoreSize: "+cache.get);
//从cache中取得元素
Element e=cache.get("s2");
System.out.println(e.getValue());
//输出当前cacheManager正在使用的配置对应的Xml格式文本
System.out.println(cacheManager.getActiveConfigurationText());
//卸载缓存管理器
cacheManager.shutdown();
}
//将缓存写到本地硬盘上指定的位置。
public static void cacheLocate(String targetlocate){
/*系统默认的缓存地址可以在System.getProperty(String key)方法中找到,其中key为java.io.tmpdir
* 这里我们也可以通过 System.setProperty("java.io.tmpdir", "C:\\DATA\\cache");这个方法去改变
我们想缓存的地方
* */
System.out.println(System.getProperty("java.io.tmpdir"));
System.setProperty("java.io.tmpdir", targetlocate);//设置缓存的位置
System.out.println(System.getProperty("java.io.tmpdir"));
CacheManager cacheManager=new CacheManager();
Cache cache=cacheManager.getCache("simpleCache");
for(int i=0;i<5;i++){
Element element=new Element("key"+i,"myvalue"+i);
cache.put(element);
} c
ache.flush();
System.out.println("已经成功缓存");
//==============================================================================================
=
System.out.println("=============================读取
cache=================================");
System.out.println("DiskStoreSize:"+cache.getDiskStoreSize());
System.out.println("MemoryStoreSize:"+cache.getMemoryStoreSize());
String [] strs=cacheManager.getCacheNames();//拿到所有cache名字
for (String str : strs) {
System.out.println(str);
} c
acheManager.shutdown();
}
} <
!‐‐ <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
maxBytesLocalDisk="20G" maxBytesLocalOffHeap="50M">
<diskStore path="java.id.tmpdir"/>
<defaultCache copyOnRead="true" copyOnWrite="true" overflowToOffHeap="false"></defaultCache>
<cache name="test" maxBytesLocalHeap="10M"/>
<cache name="test2" overflowToOffHeap="false" maxBytesLocalHeap="10M"></cache>
<cache name="sampleCache" maxElementsInMemory="10000" maxElementsOnDisk="1000"
eternal="false"
overflowToDisk="true" diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="FIFO" />
</ehcache> ‐‐> <pre name="code" class="html"> <ehcache
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<Cache name="test" maxElementsInMemory="1000"></Cache>
<!‐‐ 缓存到本地硬盘上 ‐‐>
<Cache name="simpleCache"
maxElementsInMemory="2"
eternal="false"
timeToIdleSeconds="600"
timeToLiveSeconds="300"
overflowToDisk="true"
maxElementsOnDisk="3"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="FIFO"
/>
<!‐‐
<Cache name="simpleCache" 缓存的名字
maxElementsInMemory="10000" 内存中最大的对象数
eternal="false" 对象是否永久存活
timeToIdleSeconds="120" 最大的空闲时间
timeToLiveSeconds="120" 最长的活跃时间
overflowToDisk="true" 当大小超过memory的大小时,可以缓存到本地硬盘
maxElementsOnDisk="10000000" 硬盘上最大的对象数
diskPersistent="false" 是否在硬盘上持久化保存
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU" 内存清除对象的方式
/> ‐‐>
</ehcache>
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |