springboot中使用spring cache(guava方式)

最近项目面临接口被重复轮询请求的问题,如果所有的请求都直接打到数据库,那很容易就会发生熔断,因此考虑引入缓存。

由于项目是分布式的,所以缓存也分为应用内缓存和外部缓存。外部缓存可考虑使用redis,我的需求使用内部缓存即可。

springboot自身提供缓存支持,具体实现可以用redis,ehcache,guava cache,map来实现,本文采用guava。

首先在pom文件中引入依赖

        
            org.springframework.boot
            spring-boot-starter-cache
        

        
            com.google.guava
            guava
            25.1-jre
        

其次在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方式)_第1张图片

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

@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方式))