欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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时可以选择缓存的属性,例如过期时间、最大容量、刷新时间等等。

springboot中使用spring cache(guava方式)

在使用缓存的时候,只需要在需要缓存的方法上加入注解即可:

@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时,在这种情况下只会有一个请求去进行后续操作,其余请求会等待缓存生效,这就有效的降低了实际并发量。





相关标签: spring cache