1. 基本介绍

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

Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现。它支持注解方式使用缓存,非常方便。

2. 主要的特性有:

快速
简单
多种缓存策略
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现

3. 集成

可以单独使用,一般在第三方库中被用到的比较多(如mybatis、shiro等)ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用

4. ehcache 和 redis 比较

ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。

redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多, 
处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

开始一个简单的例子:

1、在pom.xml中引入依赖

<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.2</version>
</dependency>

2、在src/main/resources/创建一个配置文件 ehcache.xml

默认情况下Ehcache会自动加载classpath根目录下名为ehcache.xml文件,也可以将该文件放到其他地方在使用时指定文件的位置

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"><!-- 磁盘缓存位置 --><diskStore path="java.io.tmpdir/ehcache"/><!-- 默认缓存 --><defaultCachemaxEntriesLocalHeap="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"maxEntriesLocalDisk="10000000"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"><persistence strategy="localTempSwap"/></defaultCache><!-- helloworld缓存 --><cache name="HelloWorldCache"maxElementsInMemory="1000"eternal="false"timeToIdleSeconds="5"timeToLiveSeconds="5"overflowToDisk="false"memoryStoreEvictionPolicy="LRU"/>
</ehcache>

3、测试类

package com.mengdee.manage.cache;import com.mengdee.manage.entity.Dog;import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;public class CacheTest {public static void main(String[] args) {// 1. 创建缓存管理器CacheManager cacheManager = CacheManager.create("./src/main/resources/ehcache.xml");// 2. 获取缓存对象Cache cache = cacheManager.getCache("HelloWorldCache");// 3. 创建元素Element element = new Element("key1", "value1");// 4. 将元素添加到缓存cache.put(element);// 5. 获取缓存Element value = cache.get("key1");System.out.println(value);System.out.println(value.getObjectValue());// 6. 删除元素cache.remove("key1");Dog dog = new Dog(1L, "taidi", (short)2);Element element2 = new Element("taidi", dog);cache.put(element2);Element value2 = cache.get("taidi");Dog dog2 = (Dog) value2.getObjectValue();System.out.println(dog2);System.out.println(cache.getSize());// 7. 刷新缓存cache.flush();// 8. 关闭缓存管理器cacheManager.shutdown();}
}

4、缓存配置
一:xml配置方式:
diskStore : ehcache支持内存和磁盘两种存储

path :指定磁盘存储的位置
defaultCache : 默认的缓存

maxEntriesLocalHeap=”10000”
eternal=”false”
timeToIdleSeconds=”120”
timeToLiveSeconds=”120”
maxEntriesLocalDisk=”10000000”
diskExpiryThreadIntervalSeconds=”120”
memoryStoreEvictionPolicy=”LRU”
cache :自定的缓存,当自定的配置不满足实际情况时可以通过自定义(可以包含多个cache节点)

name : 缓存的名称,可以通过指定名称获取指定的某个Cache对象

maxElementsInMemory :内存中允许存储的最大的元素个数,0代表无限个

clearOnFlush:内存数量最大时是否清除。

eternal :设置缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。根据存储数据的不同,例如一些静态不变的数据如省市区等可以设置为永不过时

timeToIdleSeconds : 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。

timeToLiveSeconds :缓存数据的生存时间(TTL),也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。

overflowToDisk :内存不足时,是否启用磁盘缓存。

maxEntriesLocalDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。

maxElementsOnDisk:硬盘最大缓存个数。

diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。

diskPersistent:是否在VM重启时存储硬盘的缓存数据。默认值是false。

diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。

转载地址:https://blog.csdn.net/vbirdbest/article/details/72763048

java进程内的缓存框架Ehcach相关推荐

  1. 使用jstack查看某个Java进程内的线程堆栈信息

    本文来说下如何使用jstack来查看堆栈信息 文章目录 概述 概述

  2. Java高性能本地缓存框架Caffeine

    文章目录 Java高性能本地缓存框架Caffeine 如何使用 缓存加载 手动加载 自动加载 手动异步加载 自动异步加载 过期策略 基于大小 基于时间 基于引用 Caffeine.weakKeys() ...

  3. 程序员修神之路--高并发下为什么更喜欢进程内缓存

    菜菜哥,告诉你一个好消息 YY妹子,什么好消息,你有男票了? 不是啦,我做的一个网站,以前经常由于访问量太大而崩溃,现在我加上了缓存,很稳定啦 加的什么缓存呢? 我用的redis,号称业界最快的缓存组 ...

  4. Java高并发、分布式框架,从无到有微服务架构设计

    微服务架构模式(Microservice Architect Pattern).近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将单一应用程序划分成 ...

  5. Java教程之多级缓存

    多级缓存 1. 前言 提到缓存,想必每一位软件工程师都不陌生,它是目前架构设计中提高性能最直接的方式. 缓存技术存在于应用场景的方方面面.从网站提高性能的角度分析,缓存可以放在浏览器,可以放在反向代理 ...

  6. jstack-查看Java进程的线程堆栈信息,锁定高消耗资源代码

    jstack主要用来查看某个Java进程内的线程堆栈信息.语法格式如下: jstack [option] pid jstack [option] executable core jstack [opt ...

  7. 惊悚,单个java进程占用700%的CPU

    背景 最近负责的一个项目上线,运行一段时间后发现对应的进程竟然占用了700%的CPU,导致公司的物理服务器都不堪重负,频繁宕机. 那么,针对这类java进程CPU飙升的问题,我们一般要怎么去定位解决呢 ...

  8. 常用的5个分布式缓存框架

    在Java培训机构学习Java技术的时候,我们都会学到缓存框架,那么我们为什么要在Java培训中学习缓存框架呢,它最主要的一个原因就是可以加快响应速度.今天,我们通过本文主要是分享了 5 个常用的Ja ...

  9. EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是hibernate中默认的CacheProvider Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是hibernate中默认的CacheProvider Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存, ...

最新文章

  1. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法
  2. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾
  3. html 布局兼容性,HTML+CSS入门 浏览器兼容性问题及解决方案
  4. Python中lambda表达式学习
  5. C++ 类的抽象初练
  6. python使用shell环境变量_linux中添加环境变量(python为例)
  7. js Blob对象介绍
  8. 1017 A除以B (20分)
  9. 罗永浩回应被限制高消费:已跟债权方达成和解
  10. Nginx-1.18.0主函数main思维导图(第一版)
  11. python sorted下标_初学者掌握python 列表需要知道的操作
  12. 五月康乃馨,爱心献父母---母亲节快乐
  13. java drawline_Java Graphics.drawLine方法代码示例
  14. 清除chrome浏览器缓存
  15. 滴滴Uber又打起来了!外卖领域C位花落谁家?
  16. 微信版本android5.0,微信5.0官方下载-微信5.0 安卓版v8.0.3-PC6安卓网
  17. 如何将写好的网页放到服务器上,写好的网页怎么上传云服务器
  18. 335x系列平台-usb的模式切换HOST和OTG
  19. 银行普惠金融可持续发展能力建设——风控科技应用
  20. sufficient statistics

热门文章

  1. 01、微信公众平台简介及资料文档
  2. 事件冒泡与事件捕获,附实例
  3. 【Linux命令】nm 查看动态库和静态库中的符号
  4. IE8中伪元素动态作用样式不重绘bug记录
  5. python 运算符重载_《fluent python》第 13 章 正确重载运算符
  6. linux shell 解析文本文件,linux Shell 全解析
  7. js java cookie_js cookie 工具
  8. mybatis mapper配置 bigint_Mybatis-Plus入门
  9. android个人中心界面_Android 机也能用上你熟悉的浏览器插件,这些浏览器不可错过...
  10. 引导页设计没有灵感,看这里!