首先对于ehcache做个简单介绍:
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
下图是 Ehcache 在应用程序中的位置:
主要的特性有:
1. 快速.
2. 简单.
3. 多种缓存策略
4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
5. 缓存数据会在虚拟机重启的过程中写入磁盘
6. 可以通过RMI、可插入API等方式进行分布式缓存
7. 具有缓存和缓存管理器的侦听接口
8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
9. 提供Hibernate的缓存实现
10. 等等
在线API doc:http://www.ostools.net/apidocs/apidoc?api=ehcache2.5.2
我们的一个接受中心项目主要接收数据、处理数据,不做前端展示 ;采用的缓存框架是ehcache。
在启动jvm的时候,将需要缓存的数据交给ehcache管理,ehcache有两种存储方式;磁盘和内存;ehcache既可以单独使用,亦可以配合其他框架使用,如用spring实现ehcache,配合hibernate、mybatis使用;
使用CacheManager 创建并管理Cache ,创建CacheManager有4种方式:
a1. 使用默认配置文件创建 (默认配置文件:ehcache.xml)
java代码:
CacheManager manager = CacheManager.create();
a2;使用指定配置文件创建
java代码:
CacheManager manager = CacheManager.create("src/rescoure/config/ehcache.xml");
a3:从classpath中找寻配置文件并创建
java代码:
URL url = getClass().getResource("/anothername.xml");
CacheManager manager = CacheManager.create(url);
a4:通过输入流创建
java代码:
InputStream fis = new FileInputStream(new File("src/rescoure/config/ehcache.xml").getAbsolutePath());
try {
manager = CacheManager.create(fis);
}catch(Exception e){
log.error(e.getMessage(),e);
} finally {
fis.close();
}
:卸载CacheManager ,关闭Cache
java代码:
manager.shutdown();
具体的API如下所示;
Constructor Summary | |
---|---|
CacheManager() Constructor. |
|
CacheManager(Configuration configuration) An constructor for CacheManager, which takes a configuration object, rather than one created by parsing an ehcache.xml file. |
|
CacheManager(InputStream configurationInputStream) An ordinary constructor for CacheManager. |
|
CacheManager(String configurationFileName) An ordinary constructor for CacheManager. |
|
CacheManager(URL configurationURL) An ordinary constructor for CacheManager |
默认的配置文件: ehcache配置(ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="PersonCache">
<defaultCache
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="1200"
timeToLiveSeconds="1200"
overflowToDisk="false">
</defaultCache>
<cache name="sampleCache1"
maxElementsInMemory="100"
maxElementsOnDisk="0"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="0">
<terracotta/>
</cache>
</cache>
</ehcache>
cache参数详解:
name:指定区域名
maxElementsInMemory :缓存在内存中的最大数目
maxElementsOnDisk:缓存在磁盘上的最大数目
eternal :缓存是否持久
overflowToDisk : 硬盘溢出数目
timeToIdleSeconds :当缓存条目闲置n秒后销毁
timeToLiveSeconds :当缓存条目存活n秒后销毁
memoryStoreEvictionPolicy:缓存算法,有LRU(默认)、LFU、FIFO
添加Cache到CacheManegr中也有多种方式;
b1、取得配置文件中预先 定义的name="sampleCache1"> 设置,通过CacheManager生成一个Cache
java代码:
CacheManager manager = CacheManager.create(); //创建CacheManager
Cache cache = manager.getCache("sampleCache1"); //使用创建的CacheManager创建一个cache
b2、置一个名为sampleCache2的新cache,test属性为默认
java代码:
CacheManager manager = CacheManager.create();
manager.addCache("sampleCache2");
b3、设置一个名为sampleCache3的新cache,并定义其属性
java代码:
CacheManager manager = CacheManager.create();
Cache cache = new Cache("sampleCache3", 1, true, false, 5, 2);
manager.addCache(cache);
相应的API如下:
net.sf.ehcache
Class CacheManager
java.lang.Object net.sf.ehcache.CacheManag
void |
addCache(Cache cache) Adds a Cache to the CacheManager. |
void |
addCache(Ehcache cache) Adds an Ehcache to the CacheManager. |
void |
addCache(String cacheName) Adds a Ehcache based on the defaultCache with the given name. |
net.sf.ehcache
Class Cache
java.lang.Object net.sf.ehcache.Cache
Cache(String name, int maxElementsInMemory, boolean overflowToDisk, boolean eternal, long timeToLiveSeconds, long timeToIdleSeconds) 1.0 Constructor. |
Cache(String name, int maxElementsInMemory, boolean overflowToDisk, boolean eternal, long timeToLiveSeconds, long timeToIdleSeconds, boolean diskPersistent, long diskExpiryThreadIntervalSeconds) 1.1 Constructor. |
Cache(String name, int maxElementsInMemory, MemoryStoreEvictionPolicy memoryStoreEvictionPolicy, boolean overflowToDisk, String diskStorePath, boolean eternal, long timeToLiveSeconds, long timeToIdleSeconds, boolean diskPersistent, long diskExpiryThreadIntervalSeconds,RegisteredEventListeners registeredEventListeners) 1.2 Constructor |
其他更高版本的方法。。。。
到此,我们已经往CacheManage添加Cache完成,下面就是操作Cache中的元素,主要是增删改查;
c1、增加元素:
java代码:
Element element = new Element("key1", "value1");
cache.put(new Element(element); //将key为key1,value为value1的元素 放进cache中
c2、修改元素:
java代码:
Element element = new Element("key1", "value2");
cache.replace(element); //如果key为key1的元素存在cache中,就 将key为key1,value为value2的这个元素放进cache中,之前的key为key1的元素被替换
c3、查询元素:
java代码;
//新增一个元素
Element element = new Element("key1", "value1");
cache.put(element); //将key为key1,value为value1的元素 放进cache中
//修改key为key1的元素
cache.replace(new Element("key1", "value2"));
//查询key为key1的元素
Element element = cache.get("key1");
c4、删除元素:
java代码;
boolean isRemove = cache.remove("key1");
所以大概步骤为:
第一步:生成CacheManager对象
第二步:生成Cache对象
第三步:向Cache对象里添加由key,value组成的键值对的Element元素
net.sf.ehcache
Class Cache
Element |
get(Object key) Gets an element from the cache. |
Element |
get(Serializable key) Gets an element from the cache. |
Map<Object,Element> |
getAll(Collection<?> keys) Gets all the elements from the cache for the keys provided. |
int |
getSize() Gets the size of the cache. |
void |
put(Element element) Put an element in the cache. |
void |
put(Element element, boolean doNotNotifyCacheReplicators) Put an element in the cache. |
void |
putAll(Collection<Element> elements) Puts a collection of elements in the cache. |
boolean |
remove(Object key, boolean doNotNotifyCacheReplicators) Removes an Element from the Cache. |
booean |
remove(Serializable key) Removes an Element from the Cache. |
boolean |
remove(Serializable key, boolean doNotNotifyCacheReplicators) Removes an Element from the Cache. |
void |
removeAll() Removes all cached items. |
Element |
replace(Element element) Replace the cached element only if an Element is currently cached for this key |
boolean |
replace(Element old,Element element) Replace the cached element only if the current Element is equal to the supplied old Element. |
以上是ehcache的简单应用,ehcache的优点和缺点接下来将一一讲解:
附:常用缓存技术说明: http://sishuok.com/forum/posts/list/275.html