1. 程式人生 > >Spring Boot中使用資料快取

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對應的最大快取數量、失效時間、失效策略等可能不一樣,應該怎麼通過第二種方式來實現呢?