Spring Boot中使用数据缓存

项目中经常会用到cache技术,Spring boot提供了方便的注解以便我们从重复的cache代码中解放出来。
首先得引入spring-boot-starter-cache这个jar,并在主类中使用 @EnableCaching 注解表示开启缓存。

常用到一下三个注解:
@Cacheable
先看缓存是否有数据,有则直接返回,不调用目标方法;否则调用目标方法,并将结果缓存起来。

@CachePut
先调用目标方法,然后将目标方法的结果缓存起来。

@CacheEvict
缓存清除

key:指定要清除的数据
allEntries = true : 指定清除这个缓存中的所有数据
beforeInvocation=false: 缓存的清除是否在方法之前执行,默认代表缓存清除操作是在方法执行之后执行;如果出现异常缓存就不会清除;
beforeInvocation=true: 代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除

举例:

//@CachePut 该注解会将方法的返回值缓存起来,
//其中缓存名字是 people,数据的key是person的id
@CachePut(value = "people", key = "#person.id")
public Person save(Person person) {
    Person p = personRepository.save(person);
    return p;
}
//@CacheEvict 该注解会删除people缓存中key为id 的数据
@CacheEvict(value = "people", key = "#id")
public void remove(Long id) {
    //…
}
//@Cacheable 该注解会在方法执行时,
//判断缓存people中key为#person.id的缓存是否存在,
//如果存在,则直接返回缓存中的数据。
//如果不存在,则会查数据库,然后将返回结果缓存起来。
@Cacheable(value = "people", key = "#person.id")
public Person findOne(Person person) {
    Person p = personRepository.findOne(person.getId());
    return p;
}

  在Spring Boot中使用缓存的关键是配置CacheManager。Spring Boot默认使用的是SimpleCacheConfiguration

@Configuration
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class SimpleCacheConfiguration {

   private final CacheProperties cacheProperties;

   private final CacheManagerCustomizers customizerInvoker;

   SimpleCacheConfiguration(CacheProperties cacheProperties,
         CacheManagerCustomizers customizerInvoker) {
      this.cacheProperties = cacheProperties;
      this.customizerInvoker = customizerInvoker;
   }

   @Bean
   public ConcurrentMapCacheManager cacheManager() {
      ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();
      List<String> cacheNames = this.cacheProperties.getCacheNames();
      if (!cacheNames.isEmpty()) {
         cacheManager.setCacheNames(cacheNames);
      }
      return this.customizerInvoker.customize(cacheManager);
   }

}

  可以看出,当没有CacheManager这个bean时,SimpleCacheConfiguration这类会生效,生成了ConcurrentMapCacheManager
  SpringBoot也可以通过”spring.cache”为前缀来配置缓存,由CacheProperties来完成。例如:

spring.cache.type=guava
spring.cache.cache-names: guavaDemo
#配置缓存最大数量、缓存失效间
spring.cache.guava.spec: maximumSize=100,expireAfterWrite=360m

  综上所述,如果想使用guava cache可以使用两种方式来实现,一个是配置”spring.cache”参数项,另一个是 自定义CacheManager这个bean。以第二种方式来举例:

@Configuration
public class CacheConfiguration {
    @Bean
    public CacheManager cacheManager() {
        GuavaCacheManager guavaCacheManager = new GuavaCacheManager();
        guavaCacheManager.setCacheBuilder(
                CacheBuilder.newBuilder().maximumSize(100));
        return guavaCacheManager;
    }
}

  留个思考,项目中可能多处用到了guava cache,而每个cache对应的最大缓存数量、失效时间、失效策略等可能不一样,应该怎么通过第二种方式来实现呢?

猜你喜欢

转载自blog.csdn.net/zero__007/article/details/85108065