APP下载

另一种快取 Spring Boot 整合 Ehcache

消息来源:baojiabao.com 作者: 发布时间:2026-05-16

报价宝综合消息另一种快取 Spring Boot 整合 Ehcache

用惯了 Redis ,很多人已经忘记了还有另一个快取方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场景下,我们还是会用到 Ehcache。

今天就来和大家聊聊 Spring Boot 中使用 Ehcache 的情况。相信看完本文,大家对于[Spring Boot 操作 Redis,三种方案全解析!]一文中的第二种方案会有更加深刻的理解。

Ehcache 也是 Java 领域比较优秀的快取方案之一,Ehcache 这个快取的名字很有意思,正著念反著念,都是 Ehcache,Spring Boot 中对此也提供了很好的支援,这个支援主要是通过 Spring Cache 来实现的。

Spring Cache 可以整合 Redis,当然也可以整合 Ehcache,两种快取方案的整合还是比较相似,主要是配置的差异,具体的用法是一模一样的,就类似于 JDBC 和 数据库驱动的关系一样。前面配置完成后,后面具体使用的 API 都是一样的。

和 Spring Cache + Redis 相比,Spring Cache + Ehcache 主要是配置有所差异,具体的用法是一模一样的。我们来看下使用步骤。

org.springframework.boot

spring-boot-starter-cache

org.springframework.boot

spring-boot-starter-web

net.sf.ehcache

ehcache

2.10.6

新增 Ehcache 配置

在 resources 目录下,新增 ehcache 的配置档案 ehcache.xml ,档案内容如下:

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="120"

timeToLiveSeconds="120"

overflowToDisk="false"

diskPersistent="false"

diskExpiryThreadIntervalSeconds="120"

/>

maxElementsInMemory="10000"

eternal="true"

overflowToDisk="true"

diskPersistent="true"

diskExpiryThreadIntervalSeconds="600"/>

配置含义:

name:快取名称。maxElementsInMemory:快取最大个数。eternal:物件是否永久有效,一但设定了,timeout将不起作用。timeToIdleSeconds:设定物件在失效前的允许闲置时间(单位:秒)。仅当eternal=false物件不是永久有效时使用,可选属性,预设值是0,也就是可闲置时间无穷大。timeToLiveSeconds:设定物件在失效前允许存活时间(单位:秒)。最大时间介于建立时间和失效时间之间。仅当eternal=false物件不是永久有效时使用,预设是0.,也就是物件存活时间无穷大。overflowToDisk:当内存中物件数量达到maxElementsInMemory时,Ehcache将会物件写到磁盘中。diskSpoolBufferSizeMB:这个引数设定DiskStore(磁盘快取)的快取区大小。预设是30MB。每个Cache都应该有自己的一个缓冲区。maxElementsOnDisk:硬盘最大快取个数。diskPersistent:是否快取虚拟机器重启期资料。diskExpiryThreadIntervalSeconds:磁盘失效执行绪执行时间间隔,预设是120秒。memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。预设策略是LRU(最近最少使用)。你可以设定为FIFO(先进先出)或是LFU(较少使用)。clearOnFlush:内存数量最大时是否清除。diskStore 则表示临时快取的硬盘目录。注意

预设情况下,这个档名是固定的,必须叫 ehcache.xml ,如果一定要换一个名字,那么需要在 application.properties 中明确指定配置档名,配置方式如下:

spring.cache.ehcache.config=classpath:aaa.xml

开启快取

开启快取的方式,也和 Redis 中一样,如下新增 @EnableCaching 依赖即可:

@SpringBootApplication

@EnableCaching

public class EhcacheApplication {

public static void main(String[] args) {

SpringApplication.run(EhcacheApplication.class, args);

}

}

其实到这一步,Ehcache 就算配置完成了,接下来的用法,和松哥之前讲 Redis 的文章一模一样。不过这里松哥还是带大家使用下。

使用快取

这里主要向小伙伴们介绍快取中几个核心的注解使用。

@CacheConfig

这个注解在类上使用,用来描述该类中所有方法使用的快取名称,当然也可以不使用该注解,直接在具体的快取注解上配置名称,示例程式码如下:

@Service

@CacheConfig(cacheNames = "user")

public class UserService {

}

@Cacheable

这个注解一般加在查询方法上,表示将一个方法的返回值快取起来,预设情况下,快取的 key 就是方法的引数,快取的 value 就是方法的返回值。示例程式码如下:

@Cacheable(key = "#id")

public User getUserById(Integer id,String username) {

System.out.println("getUserById");

return getUserFromDBById(id);

}

当有多个引数时,预设就使用多个引数来做 key ,如果只需要其中某一个引数做 key ,则可以在 @Cacheable 注解中,通过 key 属性来指定 key ,如上程式码就表示只使用 id 作为快取的 key ,如果对 key 有复杂的要求,可以自定义 keyGenerator 。当然,Spring Cache 中提供了root物件,可以在不定义 keyGenerator 的情况下实现一些复杂的效果,root 物件有如下属性:

也可以通过 keyGenerator 自定义 key ,方式如下:

@Component

public class MyKeyGenerator implements KeyGenerator {

@Override

public Object generate(Object target, Method method, Object... params) {

return method.getName()+Arrays.toString(params);

}

}

然后在方法上使用该 keyGenerator :

@Cacheable(keyGenerator = "myKeyGenerator")

public User getUserById(Long id) {

User user = new User();

user.setId(id);

user.setUsername("lisi");

System.out.println(user);

return user;

}

@CachePut

这个注解一般加在更新方法上,当数据库中的资料更新后,快取中的资料也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的 key 上,示例程式码如下:

@CachePut(key = "#user.id")

public User updateUserById(User user) {

return user;

}

@CacheEvict

这个注解一般加在删除方法上,当数据库中的资料删除后,相关的快取资料也要自动清除,该注解在使用的时候也可以配置按照某种条件删除( condition 属性)或者或者配置清除所有快取( allEntries 属性),示例程式码如下:

@CacheEvict()

public void deleteUserById(Integer id) {

//在这里执行删除操作, 删除是去数据库中删除

}

2020-01-13 14:54:00

相关文章