springboot中使用spring cache(guava方式)
程序员文章站
2024-03-04 08:28:23
...
最近项目面临接口被重复轮询请求的问题,如果所有的请求都直接打到数据库,那很容易就会发生熔断,因此考虑引入缓存。
由于项目是分布式的,所以缓存也分为应用内缓存和外部缓存。外部缓存可考虑使用redis,我的需求使用内部缓存即可。
springboot自身提供缓存支持,具体实现可以用redis,ehcache,guava cache,map来实现,本文采用guava。
首先在pom文件中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>25.1-jre</version>
</dependency>
其次在springboot配置文件中加入缓存的配置项:
spring:
cache:
type: guava
如果要让缓存生效,则要在springboot启动类加入注解:
@EnableCaching
类似于使用数据库,redis等工具,使用cache也需要进行配置,springboot配置类如下:
@Configuration
public class SpringCacheConfig {
/**
* spring缓存配置,使用guava
* @return
*/
@Bean
public CacheManager cacheManager(){
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(3, TimeUnit.SECONDS));
return cacheManager;
}
}
在配置cacheManager时可以选择缓存的属性,例如过期时间、最大容量、刷新时间等等。
在使用缓存的时候,只需要在需要缓存的方法上加入注解即可:
@Override
@Cacheable(value = "getLeagueList", key = "'getLeagueList'.concat({#partnerId}).concat({#leagueId})",sync = true)
public LeagueListView getLeagueList(Integer partnerId,Long leagueId) {
........
}
解释**解的属性含义:
- value: 表示方法的执行结果保存到哪个缓存里去,可以理解为为这个方法建立的一个map作为缓存,value就是map的名字;
- key: 表示当前条缓存的key,可使用方法名+参数进行拼接保证唯一,同map中的key;
- sync = true: 默认为false,在使用guava作为缓存工具时可以设置为true防止缓存击穿。即缓存过期的那一瞬间,如果有很多请求过来,那么这些请求就都会越过缓存区查询数据库,直到查询到了结果缓存才会重新生效。sync设置为true时,在这种情况下只会有一个请求去进行后续操作,其余请求会等待缓存生效,这就有效的降低了实际并发量。
推荐阅读
-
springboot中使用spring cache(guava方式)
-
详解Guava Cache本地缓存在Spring Boot应用中的实践
-
详解Guava Cache本地缓存在Spring Boot应用中的实践
-
Springboot使用过程中(Spring)常用注解总结
-
spring框架中yml的使用-springboot基础
-
jackson在springboot中的使用方式-自定义参数转换器
-
SpringBoot 中拦截器的简介及使用方式
-
说说在 Spring 中如何使用编码方式动态配置 Bean
-
Spring applicationContext.xml配置文件中配置mybatis使用xml方式
-
spring框架中yml的使用-springboot基础