话不多说上干货
一、介绍
EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个 gzip 缓存 servlet 过滤器,支持 REST 和 SOAP api 等特点。
特性
快速、简单
多种缓存策略
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
提供Hibernate的缓存实现
与 Redis 相比
EhCache 直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
Redis 是通过 Socket 访问到缓存服务,效率比 EhCache 低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用 EhCache 。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用 Redis。
EhCache 也有缓存共享方案,不过是通过 RMI 或者 Jgroup 多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。
二、引入 EhCache
1.在 pom.xml 文件中,引入 Ehcache 的依赖信息
<!--ehcache缓存框架-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.5</version>
</dependency>
2.配置文件,创建 EhCache 的配置文件: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"/>
<!-- 默认缓存 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- 字典元素缓存 -->
<cache name="dictionary"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU">
</cache>
<!-- 业务节点缓存 -->
<cache name="**_cache" maxEntriesLocalHeap="1000" eternal="true" overflowToDisk="false" diskPersistent="false"
statistics="true"/>
</ehcache>
默认情况下,EhCache 的配置文件名是固定的,ehcache.xml,如果需要更改文件名,需要在 application.yml 文件中指定配置文件位置,如:
### spring配置
spring:
cache:
ehcache:
config: classpath:/ehcache.xml
用来指定 EhCache 的配置文件位置
3.开启缓存
开启缓存的方式,也和 Redis 中一样,在启动类上添加 @EnableCaching 注解即可:
三、开始使用(简单使用)
在实现类的方法中上添加注解即可
在查询方法上加
@Cacheable(value = 缓存名称),切记要与xml中配置的名称要保持一致
@Override
@Cacheable(value = “缓存名称”)
public List<Object> getXX() {
return demoInfoMapper.getListForm();
}
这样就可以在查询的时候对数据进行缓存处理
在修改新增的方法上添加缓存失效(allEntries = true,代表这个缓存名称下的所有缓存都对其进行失效处理)
@CacheEvict(value = 缓存名称, allEntries = true)
@Override
@CacheEvict(value = "缓存名称", allEntries = true)
public List<Object> saveXX() {
return demoInfoMapper.saveForm();
}
这样就可以在修改的时候对缓存数据进行删除,在下次查询的时候再存入缓存,实现数据更新后缓存中的数据保持为最新的数据
以上就是EhCache的简单用法
当然EhCache的注解还有很多,需要学习的可以在进行扩展,这里只是简单的描述下最简单的使用过程
常用注解讲解
@Cacheable
注:在实现类中配置
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。
指定三个属性,value、key和condition
value指定缓存名称
例:@Cacheable(value=”mycache”)
key某个缓存名称下的指定缓存
例:@Cacheable(value=”mycache”,key=”#userName”)
condition根据条件判断是否缓存,返回 true 或者 false
例:@Cacheable(value=”mycache”,condition=”#userName.length()>2”)
@CachePut
注:在实现类中配置
在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中(@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中,当调用update方法时,该方法体会被执行,并且执行的结果会返回写入到缓存中,所以返回类型必须要一致,否则缓存不会生效)
value指定缓存名称
例:@CachePut(value=”mycache”)
key某个缓存名称下的指定缓存
例:@CachePut(value=”mycache”,key=”#userName”)
@CacheEvict
注:在实现类中配置
用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
allEntries是boolean类型,表示是否需要清除缓存中的所有元素,默认为false,表示不需要
例:@CacheEvict(value="mycache", allEntries=true)
beforeInvocation属性用来清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素
例:@CacheEvict(value="mycache", beforeInvocation=true)