前言
公司项目调用feign接口查询用户权限等信息时,比较慢,打算加上ehcache缓存进行优化,网上整合2.x版本比较多,但公司要求使用3.x,最后查阅资料,完成任务,顺便整理一下!(个人认为3.x使用更简便一些)
引用jar包
<!-- cache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
配置文件
ehcache配置
ehcache.xml 配置文件直接放在resources文件夹下面即可。
代码示例:
<eh:config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:eh='http://www.ehcache.org/v3'
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.orgh/schema/ehcache-core-3.0.xsd">
<!--指定缓存目录-->
<eh:persistence directory="${java.io.tmpdir}/cache-data"/>
<!--缓存模板-->
<eh:cache-template name="default">
<eh:expiry>
<eh:ttl unit="seconds">600</eh:ttl>
</eh:expiry>
<eh:resources>
<!--堆内内存可以放2000个条目,超出部分对外100M-->
<eh:heap unit="entries">2000</eh:heap>
<eh:offheap unit="MB">100</eh:offheap>
</eh:resources>
</eh:cache-template>
<!--实绩的缓存区间,继承了default缓存模板,configCache完全使用模板默认-->
<eh:cache alias="configCache" uses-template= "default"/ >
<!--下面继承了default缓存模板,但覆盖了缓存的过期时间-->
<eh:cache alias="authority_service" uses-template= "default">
<eh:expiry>
<eh:ttl unit= "minutes">10</eh:ttl>
</eh:expiry>
</eh:cache>
<eh:cache alias="user_service" uses-template="default">
<eh:expiry>
<eh:ttl unit="minutes">10</eh:tt1>
</eh:expiry>
</eh:cache>
</eh:config>
application.yml
在Springboot配置文件中把ehcache.xml配置进去;即在application.yml中加入以下配置代码
代码示例:
spring:
cache:
ehcache:
config: classpath:/ehcache.xml
启动类注解
启动类上一定要加上该注解,否则会抛出异常信息。
在启动类前加上@EnableCaching注解;这样的话,启动类启动时会去启动缓存启动器。
@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager了。
当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。
代码示例:
@EnableCaching //开启缓存
@SpringBootApplication
@EnableEurekaClient
@EnableScheduling
public class TestEhcacheApplication {
public static void main(String[] args) {
SpringApplication. run(TestEhcacheApplication.class,args);
}
}
ehcache注解使用
常用注解
@Cacheable
@CachePut
@CacheEvict
代码示例:
//查询权限
@Cacheable(cacheNames = "autherity_service" ,key = "'authority_ '+#authority.id")
public List<Authority> queryAuthorityList(Authority authority) {
...
}
//删除权限
@Caching(evict = {
@CacheEvict(cacheNames = "authority_service" ,key = "'#authority.uuid.toString()"),
@CacheEvict(cacheNames = "user_service" ,key = "'authority_ '+#authority.id"),
@CacheEvict(cacheNames = "authority_ role_ service" , allEntries = true)
})
public Integer deleteAuthority(Authority authority){
...
}
//修改权限
@Caching(put = {
@CachePut(cacheNames ="authority_ service" ,key="#authority.uuid.toString()"),
@CachePut(cacheNames ="authority_ service" ,key ="'authority_' + #authority.id")
},
evict = {
@CacheEvict(cacheNames = "authority_ service" ,key ="'authority_ ' + #authority.name" ),
@CacheEvict(cacheNames = "authority_ role_ service" ,allEntries = true)
})
public Authority updateAuthority(Authority authority) {
...
}
注意事项
被缓存的对象要序列化。
实现serializable