一、什么是ehcache?
在互联网应用中,数据存储和访问通常有两个地方:DB和缓存。
1. 各自的优缺点:DB属于持久化存储,缓存属于非持久化存储(有过期时间);缓存相对DB来说,插入和访问的速度要快很多。其中缓存又分为本地缓存(例如ehcache)和网络缓存(例如redis)。
2. 它们三者的访问速度比较:ehcache > redis > DB。
ehcache的特点是缓存容量小,但是存取速度快(没有网络传输消耗);redis缓存容量大,存取速度次之(因为redis缓存服务器通常单独部署在应用主机以外);DB存取速度最慢。
3. ehcache作为本地缓存,是可以共用的,即一个地方存,另一个地方可以直接使用。
使用流程一般是:先从本地缓存ehcache中取,取不到再从网络缓存redis里取,再取不到就从DB里取,中间每一步如果取到了,就将值set到对应的存储容器里,以便下次就可以直接获取到。
二、ehcache的使用方法:
1.现在pom.xml里加入ehcache的坐标:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.10</version>
</dependency>
2.在src目录下添加一个ehcache的配置文件:ehcache.xml
此配置文件就是ehcache的使用策略配置
<defaultCache
maxEntriesLocalHeap="1000000"
eternal="false"
timeToIdleSeconds="60"
timeToLiveSeconds="120"
diskSpoolBufferSizeMB="128"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<cache name="ESBController"
maxEntriesLocalHeap="1000000"
eternal="false"
timeToIdleSeconds="60"
timeToLiveSeconds="120"
diskSpoolBufferSizeMB="128"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</cache>
参数介绍:
http://zzy603.iteye.com/blog/1153100
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 当缓存闲置n秒后销毁 -->
<!--timeToLiveSeconds 当缓存存活n秒后销毁 -->
<!--
缓存配置
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-->
3. 创建一个ehcache的api工具类:
public class EhcacheUtil {
private static URL url = EhcacheUtil.class.getClass().getResource("/ehcache.xml");
private static CacheManager manager = new CacheManager(url);
private EhcacheUtil() {
}
private static class EhcacheUtilHolder {
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static EhcacheUtil instance = new EhcacheUtil();
}
public static EhcacheUtil getInstance() {
return EhcacheUtilHolder.instance;
}
/**
* 添加指定名称的cache
* @param cacheName
*/
public static void addCache(String cacheName){
EhcacheUtil.manager.addCache(cacheName);
}
/**
* 获取指定名称的cache
* @param cacheName
*/
public static Cache getCache(String cacheName){
return EhcacheUtil.manager.getCache(cacheName);
}
/**
* 往指定名称的cache里添加元素
* @param cacheName
* @param element
*/
public static void putElement(String cacheName, Element element){
EhcacheUtil.getCache(cacheName).put(element);
}
/**
* 往指定名称的cache里添加key和value
* @param cacheName
* @param key
* @param value
*/
public static void putElement(String cacheName, Object key, Object value){
if(EhcacheUtil.getCache(cacheName) == null){
EhcacheUtil.addCache(cacheName);
}
Element element = new Element(key, value);
EhcacheUtil.getCache(cacheName).put(element);
}
/**
* 获取指定名称的cache里的指定key对应的元素
* @param cacheName
* @param key
* @return 元素
*/
public static Element getElementByKey(String cacheName, String key){
if(EhcacheUtil.getCache(cacheName) == null){
EhcacheUtil.addCache(cacheName);
}
return EhcacheUtil.getCache(cacheName).get(key);
}
/**
* 获取指定名称的cache里的指定key对应的value
* @param cacheName
* @param key
* @return 元素value
*/
public static Object getValueByKey(String cacheName, String key){
if(EhcacheUtil.getCache(cacheName) == null){
EhcacheUtil.addCache(cacheName);
}
Element element = EhcacheUtil.getCache(cacheName).get(key);
if(element != null) {
return element.getObjectValue();
}
return null;
}
/**
* flush cache
*/
public static void clear(String cacheName){
if(EhcacheUtil.getCache(cacheName) == null){
return;
}
EhcacheUtil.getCache(cacheName).flush();
}
/**
* 测试
* @param args
*/
public static void main(String [] args) {
String cacheName = "testCache";
// 添加cache
EhcacheUtil.addCache(cacheName);
// 获取cache
Cache cache = EhcacheUtil.getCache(cacheName);
// put元素
Element element1 = new Element("id", "14073034");
cache.put(element1);
Element element2 = new Element("name", "guweiqiang");
cache.put(element2);
// get元素
Element element11 = EhcacheUtil.getElementByKey("testCache", "id");
Object value11 = element11.getObjectValue();
if(value11 != null) {
System.out.println("value11:" + value11.toString());
}
// 清除cache
EhcacheUtil.clear(cacheName);
// get元素
Object value12 = EhcacheUtil.getValueByKey(cacheName, "name");
if(value12 != null) {
System.out.println("value12:" + value12.toString());
}
}
}
在使用它的地方:
ActivityDto activity = null;
activity = (ActivityDto) EhcacheUtil.getValueByKey(ConstantUtil.ACTIVITY_EHCACHE_NAME, ConstantUtil.ACTIVITY_EHCACHE_KEY);
if (activity == null) {
synchronized (ActivityDto.class) {
if (activity == null) {
ResponseDTO<ActivityDto> activityRes = activityService.getActivity();
if (activityRes.getMessage().isSuccess() && activityRes.getResult() != null) {
activity = activityRes.getResult();
EhcacheUtil.putElement(ConstantUtil.ACTIVITY_EHCACHE_NAME, ConstantUtil.ACTIVITY_EHCACHE_KEY, activity);
}
}
}
}
相关推荐
两级缓存在redis的方案上做一步优化,在缓存到远程redis的同时,缓存一份到本地进程ehcache(此处的ehcache不用做集群,避免组播带来的开销),取缓存...get开销只要一次,后续不需要了,除非本地缓存过期需要再get。)
为您提供EhcacheJava缓存框架下载,EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。主要的特性有:1. 快速.2. 简单.3. 多种缓存策略4. 缓存数据有两级:内存和...
基于java的map和timer实现本地缓存及定时清理失效缓存的功能 本项目仅用于初学者学习使用 初学者可基于此项目初步了解缓存实现的基本原理 后期在项目中使用建议使用现成的缓存框架:redis、ehcache等
redis : 1、添加依赖 pom.xml 2、主入口添加注解@EnableCaching 获取缓存方法添加@Cacheable 3、初始化缓存管理器 4 实现put get方法 其中一个put方法添加了过期时间 5 调用方法获取缓存 注意需要在本地部署redis...
根据其部署和应用范围,缓存可以分为本地缓存和分布式缓存两种类型。Caffeine是一种非常优秀的本地缓存解决方案,而Redis则广泛用于分布式缓存场景。 Caffeine是一个基于Java 1.8的高性能本地缓存库,源自Guava的...
NULL 博文链接:https://phl.iteye.com/blog/2240901
struts2+hibernate+ehcache二级缓存的 步骤和需要的代码及jar包
EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 主要的特性有: 1. 快速. 2. 简单. 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量...
本地缓存中仅存储一些固定不变、或者不常变化的数据。 通过过期重新加载、定时refresh等策略定时更新本地的缓存,忍受数据有一定时间内的不一致。 对于少量更新的场景,借助MQ构建更新机制,有变更就发到MQ中然后...
spring springmvc mybatis shiro 以及 ehcache(配合shiro实现缓存验证 配合spring实现二级缓存) 测试 二级缓存 访问http://localhost:8080/vkblog/test/ehcacheuserlist.action 测试 访问限制 访问任意的action
Spring与ehcache结合使用,本地缓存的实现
缓存是我们在开发中经常遇到要解决的问题,有页面缓存、应用级别的缓存,应用级缓存又分为本地缓存、分布式缓存,在本地缓存中,常用的有成员变量或局部变量实现、静态变量实现、Ehcache、Guava组件、Spring注解缓存...
(4)缓存数据生产服务拉取到了数据之后,会将数据在本地缓存中写入一份,就是ehcache中 (5)同时会将数据在redis中写入一份 测试1(ehcache): 多级缓存架构 1、LRU算法概述 redis默认情况下就是使用LRU策略的,...
实现多机本地缓存的获取功能。 与Jedis的API相似,可轻松实现操作。 最小化配置和包装,力求精简。项目介绍基于Ehcache2和Redis的实现的Java的分布式二级缓存。除基本操作以外实现多机集群时各级缓存的监管和抓取。...
Spring Boot Caffeine 本地缓存 Spring Boot Redis 缓存 Spring Boot Redis 分布式锁 Spring Boot Event 事件发布与监听 Spring Boot 集成 Kafka Spring Boot Email 邮件服务 Spring Boot Minio 对象存储 Spring ...
本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何...
jvcache是一个简单的基于vertx的库,用于使ehcahe等本地缓存与redis等分布式缓存保持同步。 尽管您可以扩展以支持您选择的其他缓存框架,但它内置了ehcache和redis实现。 它写于2016年。CacheEventBus ...