Spring Boot中使用資料快取
阿新 • • 發佈:2019-01-06
專案中經常會用到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對應的最大快取數量、失效時間、失效策略等可能不一樣,應該怎麼通過第二種方式來實現呢?