Ehcache 基本使用 以及 基于RMI集群搭建
发布日期:2021-05-06 19:32:59 浏览次数:15 分类:精选文章

本文共 2376 字,大约阅读时间需要 7 分钟。

Ehcache缓存框存技术详解

Ehcache是一个成熟的基于JVM内存的缓存框架,其性能优于基于socket的Redis,因此在很多场景下都可以考虑使用Ehcache来提升应用的性能表现。作为一名开发人员,我曾经对Ehcache和Java中的static集合之间的差异感到困惑。经过深入研究和实践,我逐渐理解了Ehcache的优势所在。


一、Ehcache的基本使用

Ehcache的核心存储单元是Element,其结构由一个key和一个value组成,和Java的Map存储机制非常相似。使用Ehcache的过程可以分为三层:

  • CacheManager层:通过读取配置文件ehcache.xml来获取缓存管理器。Ehcache默认会使用net.sf.ehcache包下的类加载器来读取配置文件。

    CacheManager cacheManager = CacheManager.create(EhcacheManager.class.getClassLoader().getResource("ehcache.xml"));
  • Cache层:通过CacheManager获取具体的缓存实例。缓存的配置可以通过ehcache.xml文件来定义,需要仔细理解每个配置项的含义。

    Cache articleCache = cacheManager.getCache("articleCache");
  • Element层:Ehcache的核心存储单元,提供了丰富的操作方法。以下是常用的操作示例:

    // 存储一个ElementarticleCache.put(new Element(1, 2));// 获取ElementElement element = articleCache.get(1);// 获取valueObject objectValue = element.getObjectValue();Integer i = (Integer) objectValue;// 获取所有keysMap keys = articleCache.getKeys();// 获取所有ElementsMap all = articleCache.getAll(keys);

  • 二、ehcache.xml配置说明

    Ehcache的配置文件ehcache.xml包含了许多重要的配置项。以下是常见配置项的解释:

  • diskStore

    • 定义Ehcache数据存储到硬盘的路径。常见路径包括java.io.tmpdir(默认临时文件目录)、user.home(用户主目录)和user.dir(用户当前工作目录)。
  • defaultCache

    • 设置默认缓存的过期策略。eternal="false"表示缓存会过期,默认为false
  • cache

    • 定义具体的缓存名称及其过期策略。name属性通常为缓存对象的类名。
  • maxElementsInMemory

    • 设置基于内存的缓存最大存储对象数量。值为0表示无限制。
  • timeToIdleSecondstimeToLiveSeconds

    • timeToIdleSeconds:缓存对象处于空闲状态的最大时间(秒),超过此时间将被清除。
    • timeToLiveSeconds:缓存对象存活的最大时间(秒),从存入缓存到过期的时间间隔。
  • overflowToDisk

    • 当内存缓存达到maxElementsInMemory限制后,将溢出的对象写入硬盘缓存。仅适用于实现Serializable接口的对象。
  • memoryStoreEvictionPolicy

    • 缓存清除策略,可选FIFOLFULRU
  • diskSpoolBufferSizeMB

    • 硬盘缓存的写入缓冲区大小(单位:MB)。默认值为2047.99…MB,建议不要超过2GB,以避免导致缓冲区溢出。
  • diskPersistent

    • 是否在虚拟机启动时持久化存储到硬盘。默认为false
  • diskExpiryThreadIntervalSeconds

    • 后台线程用于监控和清除过期缓存项。默认值为120秒。

  • 三、ehcache集群配置

    Ehcache支持多种集群方式,其中基于RMI的集群是最常见的配置方式。以下是RMI集群的配置示例:

  • 配置文件ehcache.xml示例

  • 注意事项

    • RMI集群需要配置正确的rmiUrls,确保其他节点能够访问。
    • RMI基于动态发现,需要配置peerDiscovery,默认为manual时需要手动管理节点列表。
    • 集群节点之间的通信需要配置正确的端口和防火墙规则。
    • 在修改对象时,需要通过articleCache.put()方法通知Ehcache进行同步。

  • 四、Ehcache的优势

  • 存储容量:与static Map存储差不多,小有细微差距,通常可以忽略。
  • 缓存管理:支持灵活的缓存过期策略、缓存大小控制等功能,static Map不具备这些功能。
  • 多项目缓存共享:支持集群管理,static Map无法实现。

  • 五、总结

    Ehcache是一个强大的内存缓存框架,适合在需要灵活缓存控制和高性能存储场景下使用。通过合理配置ehcache.xml文件,可以实现多种高级功能,如过期策略、内存与硬盘结合使用以及集群部署。虽然学习曲线稍高,但对于需要高性能缓存的项目,Ehcache是一个非常值得去尝试的选择。

    上一篇:Ehcache 集群改造-----增加手动发现方式自动增加减机器机制
    下一篇:阿里云内容管理图片校验简单使用

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月08日 00时26分40秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    JAVA-【1】配置 2023-01-27
    java-信息安全(九)-基于DH,非对称加密,对称加密等理解HTTPS 2023-01-27
    java-图形用户界面(GUI)之AWT编程-整体思路与代码架构 2023-01-27
    java-如何给表格添加分页 2023-01-27
    Java-环境搭建(Mac版) 2023-01-27
    Java-笔记12 2023-01-27
    java-设计模式-装饰器设计模式,代理设计模式和继承三种扩展方法的比较 2023-01-27
    java.io.IOException: Tried to send an out-of-range integer as a 2-byte value :79944 2023-01-27
    java.io.tmpdir 2023-01-27
    java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver 2023-01-27
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 2023-01-27
    java.lang.IllegalArgumentException: Control character in cookie value or attribute. 2023-01-27
    java.lang.IllegalArgumentException: Invalid character found in the request target. 2023-01-27
    java.lang.IllegalStateException: Optional int parameter 'id' is not present but cannot be translated 2023-01-27
    java.lang.NoClassDefFoundError: javax transaction SystemException 解决方法! 2023-01-27
    java.lang.NoClassDefFoundError: javax/persistence/EntityListeners解决 2023-01-27
    java.lang.NoClassDefFoundError: kotlin/reflect/jvm/internal/KotlinReflectionInternalError 2023-01-27
    java.lang.NoClassDefFoundError: org.joda.time.ReadablePeriod错误的处理 2023-01-27
    java.lang.NoClassDefFoundError: org/springframework/core/io/Resource 2023-01-27
    java.lang.NoSuchMethodError: org.jaxen.dom4j.DocumentNavigator.getInstance()【可能的解决办法】 2023-01-27