I)EhCache 说明
图 1. EhCache 应用架构图
主要的特性有:
1. 快速.
2. 简单.
3. 多种缓存策略
4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
5. 缓存数据会在虚拟机重启的过程中写入磁盘
6. 可以通过RMI、可插入API等方式进行分布式缓存
7. 具有缓存和缓存管理器的侦听接口
8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
9. 提供Hibernate的缓存实现
10. 等等
由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 A、B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合。所以就需要用到 EhCache 的集群解决方案。
转载: http://raychase.iteye.com/blog/1545906 RayChase
II)项目实战实用
在线API doc:http://tool.oschina.net/apidocs/apidoc?api=ehcache2.5.2
1:ehcache.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<cache
name="device"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"/>
<!-- 在线设备信息,向服务器推送失败的缓存数据 -->
<cache
name="deviceServiceE"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
2:ehcache 单元管理单元类
package com.vrv.cems.service.online.utils;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.vrv.cems.service.online.bean.DeviceInfoB;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
* <B>说 明</B>:ehcache 单元管理单元类
*
* @author 作 者 名:chenjun<br/>
* E-mail :[email protected]
* @version 版 本 号:V1.0.20140725<br/>
* 创建时间:2014-7-28 下午01:04:01
*/
public class EhCacheUtil {
private static CacheManager singletonCacheManager;
/*
* 初始化CacheManager对象
*/
public static synchronized void getSingletonCacheManager() {
if (null == singletonCacheManager) {
singletonCacheManager = new CacheManager(
"src/main/resources/ehcache.xml");
}
}
/*
* 防止重新创建多个同名的Cache
*/
public static void CreateCacheInstance(String cacheName) {
if (null != singletonCacheManager
&& (null != cacheName && !"".equals(cacheName))) {
if (null == singletonCacheManager.getCache(cacheName)) {
singletonCacheManager.addCache(cacheName);
}
}
}
/*
* 通过cacheName获取Cache对象
*/
public static Cache getCacheInstance(String cacheName) {
Cache cachetemp = singletonCacheManager.getCache(cacheName);
return cachetemp;
}
/*
* 添加Element Object value
*/
public static void AddCacheElementObject(String cacheName, String eleKey,Object obj ) {
if (null != singletonCacheManager
&& (null != cacheName && !"".equals(cacheName))) {
Cache cachetemp = EhCacheUtil.getCacheInstance(cacheName);
if (null != cachetemp) {
Element element = new Element(eleKey, obj);
cachetemp.put(element);
}
}
}
/*
* 添加Element List value
*/
public static void AddCacheElementListObject(String cacheName, String eleKey,List<?> objList) {
if (null != singletonCacheManager
&& (null != cacheName && !"".equals(cacheName))) {
Cache cachetemp = EhCacheUtil.getCacheInstance(cacheName);
if (null != cachetemp) {
Element element = new Element(eleKey, objList);
cachetemp.put(element);
}
}
}
/*
* 删除Cache
*/
public static void RemoveCacheInstance(String cacheName) {
if (null != singletonCacheManager
&& (null != cacheName && "".equals(cacheName))) {
if (null != singletonCacheManager.getCache(cacheName)) {
singletonCacheManager.removeCache(cacheName);
}
}
}
/*
* 删除Element
*/
public static boolean RemoveCacheElement(String cacheName, String eleKey) {
boolean isbln = false;
if (null != singletonCacheManager && (null != cacheName && !"".equals(cacheName))) {
Cache cachetemp = EhCacheUtil.getCacheInstance(cacheName);
if (null != cachetemp) {
isbln = cachetemp.remove(eleKey);
}
}
return isbln;
}
/*
* 卸载 CacheManager,关闭 Cache
*/
public static void closeSingletonManager() {
if (null != singletonCacheManager) {
singletonCacheManager.shutdown();
}
}
/**
* 测试实例类
*/
public static void testMain() {
Timestamp timeStamp = DateTypeConverterUtil.converterUtil2SqlTimeStamp(new Date());
EhCacheUtil.getSingletonCacheManager();
EhCacheUtil.CreateCacheInstance("deviceCache");
//user POJO
Duser db1 = new DeviceInfoB("1", "2", "3");
Duser db2 = new DeviceInfoB("2", "2", "23");
EhCacheUtil.AddCacheElementObject("deviceCache","1",db1);
EhCacheUtil.AddCacheElementObject("deviceCache","2",db2);
Cache cache = EhCacheUtil.getCacheInstance("deviceCache");
int elementsInMemory = cache.getSize();
System.out.println("cacheMemorySize ="+elementsInMemory);
@SuppressWarnings("unchecked")
List<String> keys = cache.getKeys();
Iterator<String> dbIterable = keys.iterator();
while( dbIterable.hasNext() ){
Element element = cache.get(dbIterable.next().trim());
Duser dbInfoB = (Duser) element.getObjectValue();
System.out.println("Duser proP ="+dbInfoB.getIp().trim());
}
EhCacheUtil.closeSingletonManager();
}
}
III)分布式缓存/缓存集群
EhCache 从 1.7 版本开始,支持五种集群方案,分别是:
转载: http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/index.html