SpringBoot集成Ehcache基本用法

本地缓存Ehcache

什么是Ehcache

 Ehcache是纯java的开源缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。它主要面向通用缓存、Java EE和轻量级容器,具有内存和磁盘存储、缓存加载器、缓存扩展、缓存异常处理程序。

 Ehcache最初由Greg Luck于2003年开始开发。2009年,该项目被Terracotta购买。软件仍然开源,但一些新的主要功能(例如,快速可重启性之间的一致性的)只能在商业产品中使用。

Ehcache 被广泛用于在Hibernate、Spring、Cocoon等其他开源系统。

Ehcache的主要特性

1.快速;

2.简单;

3.多种缓存策略;

4.缓存数据有两级:内存和磁盘,因此无需担心容量问题;

5.缓存数据会在虚拟机重启的过程中写入磁盘;

6.可以通过 RMI、可插入 API 等方式进行分布式缓存;

7.具有缓存和缓存管理器的侦听接口;

8.支持多缓存管理器实例,以及一个实例的多个缓存区域;

9.提供 Hibernate 的缓存实现;

 

Ehcache使用介绍

 

Ehcache是用来管理缓存的一个工具,其缓存的数据可以是存放在内存里面的,也可以是存放在硬盘上的。其核心是CacheManager,一切Ehcache的应用都是从CacheManager开始的。它是用来管理Cache(缓存)的,一个应用可以有多个CacheManager,而一个CacheManager下又可以有多个Cache。Cache内部保存的是一个个的Element,而一个Element中保存的是一个key和value的配对,相当于Map里面的一个Entry。

 

 

Ehcache缓存过期策略

 

当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据。常用的淘汰算法有下面几种:

FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。

LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。

LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

 

Maven环境依赖

		<!--开启 cache 缓存 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-cache</artifactId>
		</dependency>
		<!-- ehcache缓存 -->
		<dependency>
			<groupId>net.sf.ehcache</groupId>
			<artifactId>ehcache</artifactId>
			<version>2.9.1</version><!--$NO-MVN-MAN-VER$ -->
		</dependency>

YML配置文件信息

spring:
  cache:
    type: ehcache
    ehcache:
      config: classpath:ehcache-local.xml

EhCache配置

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache">

	<diskStore path="java.io.tmpdir/Java_paper_tmp/ehcache" />

	<!-- defaultCache,是默认的缓存策略 -->
    <!-- 如果你指定的缓存策略没有找到,那么就用这个默认的缓存策略 -->
    <!-- external:如果设置为true的话,那么timeout就没有效果,缓存就会一直存在,一般默认就是false -->
    <!-- maxElementsInMemory:内存中可以缓存多少个缓存条目,在实践中,你是需要自己去计算的,比如你计算你要缓存的对象是什么?有多大?最多可以缓存多少MB,或者多少个G的数据?除以每个对象的大小,计算出最多可以放多少个对象 -->
    <!-- overflowToDisk:如果内存不够的时候,是否溢出到磁盘 -->
    <!-- diskPersistent:是否启用磁盘持久化的机制,在jvm崩溃的时候和重启之间,不用 -->
    <!-- timeToIdleSeconds:对象最大的闲置的时间,如果超出闲置的时间,可能就会过期,我们这里就不用了,缓存最多闲置5分钟就被干掉了 -->
    <!-- timeToLiveSeconds:对象最多存活的时间,我们这里也不用,超过这个时间,缓存就过期,就没了 -->
    <!-- memoryStoreEvictionPolicy:当缓存数量达到了最大的指定条目数的时候,需要采用一定的算法,从缓存中清除一批数据,LRU,最近最少使用算法,最近一段时间内,最少使用的那些数据,就被干掉了 -->
	<defaultCache maxElementsInMemory="1000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
		diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
		diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>
	
	
	
	<!-- 手动指定的缓存策略 -->
 	<!-- 比如你一个应用吧,可能要缓存很多种不同的数据,比如说商品信息,或者是其他的一些数据 -->
 	<!-- 对不同的数据,缓存策略可以在这里配置多种 -->
	<!-- 系统缓存 -->
	<!-- 
	Ehcache 使用Map集合实现的 element 其实就是 key 和value
	一、以下属性是必须的:
	  1、name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
	  2、maxElementsInMemory:在内存中缓存的element的最大数目。 
	  3、maxElementsOnDisk:在磁盘上缓存的element的最大数目,默认值为0,表示不限制。 
	  4、eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。 
	  5、overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。 
	二、以下属性是可选的:
	  1、timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
	  2、timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
	  3、diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。 
	  4、diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
	  5、diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
	  6、memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。 
	 -->
	<cache name="dbFormCache" maxEntriesLocalHeap="100" eternal="false" 
		   timeToIdleSeconds="120"  timeToLiveSeconds="120"
		   diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
		   diskPersistent="false"     diskExpiryThreadIntervalSeconds="120"
		   memoryStoreEvictionPolicy="LRU"
	       overflowToDisk="true"/>
    	
</ehcache>

启动类方式@EnableCaching

@SpringBootApplication
@EnableTransactionManagement
@ServletComponentScan
@MapperScan("com.jetsen.edu.dao")
@ImportResource(locations = {"classpath:druid-bean.xml"})
@EnableCaching
public class EduCloudServicePaperApplication
    @CachePut(key="'dbFrom_'+#dbCacheForm.bizKey", value="dbFormCache")
	@Transactional(readOnly = false)
	public void updateDbCacheByBizKey(DbCacheForm dbCacheForm) {
		dbCacheForm.setUpdateDate(DateUtils.now());
		//修改信息
		dbCacheFormDao.updateDbCacheByBizKey(dbCacheForm);
	}
	
	@Cacheable(key="'dbFrom_'+#bizKey",value="dbFormCache")
	public DbCacheForm findDbCacheByBizKey(String bizKey) {
		DbCacheForm dbCacheForm = new DbCacheForm();
		dbCacheForm.setBizKey(bizKey);
		return dbCacheFormDao.findDbCacheByBizKey(dbCacheForm);
	}
	
	/**
	 * 删除
	 */
	@CacheEvict(key="'dbFrom_'+#dbCacheForm.bizKey", value="dbFormCache")
	@Transactional(readOnly=false)
	public Object delete(DbCacheForm dbCacheForm) {
		dbCacheFormDao.delete(dbCacheForm);
		return ReturnMsgUtils.returnMsg(CODE_200, null, MSG_SUCCESS);
	}
	

当然业务如有需要清除所有Ehcache缓存,可以注入CacheManager进行删除

cacheManager.getCache("dbFormCache").clear();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章