Ehcache 与 Spring Cache 之间的关系
- Spring Cache 定义了一系列的操作缓存的注解 , 方便我们的开发 , 但是不为我们提供实现 。Ehcache 是 Spring Cache 的一种实现 ,类似的实现还有 Redis 。
常用的注解
- @EnableCaching 启用缓存
- @CachePut 每次都执行方法,并把方法的参数和返回值以K-V键值对方式进行缓存,如果缓存中已经存在这个K,会更新他。
- @Cacheable 执行方法前判断,缓存中是否有参数K对应的K-V键值对,如果有则返回该键值对,否则执行方法并缓存参数和返回值。
- @CacheEvict 根据条件从缓存中移除指定的K-V键值对
引入POM依赖
<!-- Spring Cache 缓存抽象层 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- ehcache 缓存实现层 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
简单使用
- 我们先需要application.properties中向SpringBoot说明我们要使用Ehcache作为缓存,指定我们的缓存策略配置文件
spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:/ehcache.xml
- 缓存策略配置文件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"
updateCheck = "false">
<!-- 指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下 -->
<diskStore path = "java.io.tmpdir"/>
<!-- 默认的管理策略 -->
<defaultCache
eternal = "false"
maxElementsInMemory = "10000"
overflowToDisk = "true"
diskPersistent = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "120"
diskExpiryThreadIntervalSeconds = "120"
memoryStoreEvictionPolicy = "LRU"/>
<!-- 此缓存最多可以存活timeToLiveSeconds秒,如果期间超过timeToIdleSeconds秒未访问,缓存失效 -->
<cache
name = "emailCaptcha"
eternal = "false"
maxElementsInMemory = "100000"
overflowToDisk = "false"
diskPersistent = "false"
timeToIdleSeconds = "900"
timeToLiveSeconds = "900"
memoryStoreEvictionPolicy = "LRU"/>
<!-- maxElementsInMemory 内存中最大缓存对象数,看着自己的heap大小来搞 -->
<!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false -->
<!-- maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大 -->
<!-- overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,
会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。-->
<!-- diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。-->
<!-- diskPersistent:是否缓存虚拟机重启期数据 -->
<!-- diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒 -->
<!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,
如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,
EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,
则表示对象可以无限期地处于空闲状态 -->
<!-- timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,
如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,
EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,
则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义 -->
<!-- memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,
Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、
FIFO(先进先出)、LFU(最少访问次数)。-->
<!-- 配置文件模板转载于码农小胖哥 -->
</ehcache>
- 在主启动类或者配置类使用@EnableCaching
- 然后做一个常见的邮件验证码服务
private static final String EMAIL_CAPTCHA_CACHE = "emailCaptcha";
//cacheNames表示使用哪个缓存空间
//key是K-V对的K,对应的是方法的参数
@CachePut(cacheNames = EMAIL_CAPTCHA_CACHE,key = "#email")
public String put(String email) {
return RandomUtil.randomNumbers(6);
}
@Cacheable(cacheNames = EMAIL_CAPTCHA_CACHE,key = "#email")
public String get(String email) {
return null;
}
@CacheEvict(cacheNames = EMAIL_CAPTCHA_CACHE,key = "#email")
public void exipre(String email) {}
- 调用put方法向缓存中写入email对应的验证码
- get从缓存中获取email对应的验证码
- exipre用来使这个验证码过期
另外
- Spring Cache 提供的功能远不止这些 , 比如@Cacheable注解 还支持条件缓存,异步模式等
- 请务必指定缓存过期策略
- 缓存注解的方法不能在该类中调用
- 对进行缓存时应当考虑大小限制,避免序列化/反序列化性能。