EhCache 说明 &项目实战实用 & 分布式缓存/缓存集群

2023-11-10

I)EhCache 说明

     EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
     Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

   图 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 的集群解决方案。

Ehcache详细解读

 转载:  http://raychase.iteye.com/blog/1545906  RayChase


II)项目实战实用

在线API doc:http://tool.oschina.net/apidocs/apidoc?api=ehcache2.5.2

Ehcache单元管理:

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 :chenjun@vrvmail.com.cn
 * @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 版本开始,支持五种集群方案,分别是:

  • Terracotta
  • RMI
  • JMS
  • JGroups
  • EhCache Server

本文主要介绍其中的三种最为常用集群方式,分别是 RMI、JGroups 以及 EhCache Server 。

 转载:  http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/index.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EhCache 说明 &项目实战实用 & 分布式缓存/缓存集群 的相关文章

随机推荐