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 说明 &项目实战实用 & 分布式缓存/缓存集群 的相关文章

  • Android开源框架之Glide

    这个图片加载框架功能比较强大 相比起其他框架大多数开发者使用该框架加载图片 简介 1 使用简单 2 可配置度高 自适应程度高 3 支持常见图片格式 Jpg png gif webp 4 支持多种数据源 网络 本地 资源 Assets 等 5
  • Android开源框架之okhttp

    OKHttp是一款高效的HTTP客户端 支持连接同一地址的链接共享同一个socket 通过连接池来减小响应延迟 还有透明的GZIP压缩 请求缓存等优势 其核心主要有路由 连接协议 拦截器 代理 安全性认证 连接池以及网络适配 拦截器主要是指
  • 【校招VIP】java开源框架之Zookeeper

    考点介绍 ZooKeeper是一个分布式的 开放源码的分布式应用程序协调服务 主要为了解决分布式架构下数据一致性问题 典型的应用场景有分布式配置中心 分布式注册中心 分布式锁 分布式队列 集群选举 分布式屏障 发布 订阅等场景 本期分享的j
  • 从源码的角度回答“mybatis的#{} 和${}有什么区别”?

    java程序员面试的时候 碰上面试官问 mybatis 的 和 有什么区别 大概率你会这样回答 1 是预编译处理 是字符串替换 2 MyBatis在处理 时 会将sql中的 替换为 号 调用PreparedStatement的set方法来赋
  • Disruptor 详解

    Disruptor 详解 想了解一个项目 最好的办法就是 把它的源码搞到本地自己捣鼓 在网上看了 N 多人对 Disruptor 速度的吹捧 M 多人对它的机制分析 就连 Disruptor 官方文档中 也 NB 哄哄自诩 At LMAX
  • 若依框架前后端分离版本自动生成代码的详细步骤

    1 若依框架的下载和本地运行这里就不介绍了主要讲代码自动生成 只是单表的增删改成 复杂的多表业务逻辑还是需要自己手写的 话不多说直接上图 一 新建模块 本地运行起来后右键新建Module 注意这里的Name 可以和若依类似 也可以自己定义新
  • Spring:hibernate + ehcache

    我正在使用 hibernate 处理一个 spring 项目 并希望使用 ehcache 实现二级缓存 我看到了很多解决这个问题的方法 spring modules cache其中介绍了 Cacheable注解 ehcache spring
  • 哈希图空间和性能问题

    我必须在 HashMultiMap 中存储超过 1 亿个键值 键可以有多个值 谁能帮助我哪一个存储和搜索速度更快 1 伯克利数据库 2 东京内阁 3 H2 4 EhCache 5 或其他 另一点 那些性能与内存中的哈希图大致相同吗 一点点指
  • Spring boot应用程序启动时如何缓存数据

    我有一个连接到 SQL Server 数据库的 Spring boot 应用程序 我需要一些帮助来在我的应用程序中使用缓存 我有一个 CodeCategory 表 其中包含许多代码的代码列表 该表将每月加载一次 并且数据每月仅更改一次 我想
  • Ehcache 2 maven依赖

    在我的 pom 中 我有 ehcache 2 依赖项
  • 无法使用 YAML Spring Profile 禁用 @Cacheable

    我创建了一个名为 mycache 的缓存 该缓存应用于我的服务中的方法 例如 Cacheable value mycache public String getValue String something breakpoint here 我
  • @Cachebale 不适用于 Ehcache 和 spring MVC Ehcache 不适用于 Spring 缓存注释

    我的应用程序是 Spring MVC 应用程序 尝试使用基于 Spring 注解的缓存 但它不起作用 请参考我下面的代码 1 pom xml
  • java.lang.NullPointerException Hibernate 与 Ehcache 一起使用

    我使用了 Hibernate 4 1 2 和 Ehcache 2 4 3 下载 hibernate 时与 hibernate 一起提供 我的 hibernate cfg xml
  • 问题:软锁定缓存条目已被底层 Ehcache 过期

    我收到警告 但我不知道该怎么办 每次被禁止的 IP 更新时 大约有 80000 个条目将此警告写入 tomcat 中的 catalina out 日志文件中 WARNING Cache package BannedIP Key packag
  • 同一主机上的 2 个实例之间的 ehcache 自动发现(通过多播)

    我在同一主机上运行 2 个 tomcat 实例 每个实例都运行相同的 Web 应用程序 该应用程序尝试通过 RMI 复制与某些 ehcache 缓存进行通信 我在 ehcache 中使用自动发现配置 因此不必显式定义哪些是主机以及哪些是我想
  • 如何暂时禁用Spring缓存的缓存

    我有一个 spring bean 注释为 Cacheable像这样定义的注释 Service public class MyCacheableBeanImpl implements MyCacheableBean Override Cach
  • Spring Ehcache3 导致键类型和值类型异常

    我尝试使用ehcache3使用 spring 4 3 进行项目 我配置了缓存管理器
  • Hibernate 的二级缓存是否/可以用于 COUNT() 操作?

    当使用 Hibernate 和 Ehcache 作为二级缓存 2LC 实现时 在使用 WHERE 子句执行 COUNT 操作时是否 或可以 使用此缓存 用 SQL 术语来说 我正在执行的查询是SELECT COUNT id FROM tab
  • Ehcache避免将敏感数据存储到磁盘?

    我们希望使用 Ehcache 缓存不应该存储到磁盘的敏感数据 数据只能驻留在主内存中 这种数据存储在磁盘上是非法的 因此需要谨慎对待 我们已经在使用 Ehcache 无论是否带有陶土 来实现常见的缓存目的 我知道 Ehcache 提供了在主
  • Ehcache 2.1是否支持Hibernate 3.3.2GA中的事务缓存并发策略?

    Does 以太网缓存2 1 http dsoguy blogspot com 2010 04 ehcache 21 beta lots of stuff still html现在支持事务缓存并发策略 http docs jboss org

随机推荐