一、@Cacheable的作用
1、緩存使用步驟:@Cacheable
這個注解,用它就是為了使用緩存的。所以我們可以先說一下緩存的使用步驟:
1、開啟基於注解的緩存,使用
@EnableCaching
標識在 SpringBoot 的主啟動類上。2、標注緩存注解即可
注:這里使用 @Cacheable
注解就可以將運行結果緩存,以后查詢相同的數據,直接從緩存中取,不需要調用方法
2、@Cacheable作用:把方法的返回值添加到Ehcache緩存中。
3、常用屬性介紹:
(1)cacheNames/value 用來指定緩存組件的名字,將方法的返回結果放在哪個緩存中,可以是數組的方式,支持指定多個緩存
@Cacheable(cacheNames = "streamUrl", key = "#eventId", unless = "#result == null") // 數組
@Cacheable(cacheNames = {"streamUrl", "test"}, key = "#eventId", unless = "#result == null")
(2)key:緩存數據時使用的 key。默認使用的是方法參數的值。可以使用 spEL 表達式去編寫。
@Cacheable(cacheNames = "streamUrl", key = "#eventId + '[' + #id + ']'", unless = "#result == null")
(3)keyGenerator:key 的生成器,可以自己指定 key 的生成器,通過這個生成器來生成 key。
@Cacheable(value = "ip", keyGenerator = "cacheKeyGenerator") public IPResponse query(String ip) { return ipAPI.query(ip); }
@Slf4j @Component public class CacheKeyGenerator implements KeyGenerator { @Override public Object generate(Object target, Method method, Object... params) { //...
return key.toString(); } }
這樣放入緩存中的 key 的生成規則就按照你自定義的 keyGenerator 來生成。不過需要注意的是:@Cacheable
的屬性,key 和 keyGenerator 使用的時候,一般二選一。
(4)condition:符合條件的情況下才緩存。方法返回的數據要不要緩存,可以做一個動態判斷
// 表示 id 大於 1 才進行緩存
@Cacheable(cacheNames = "streamUrl", condition = "#id > 1")
(5)unless:否定緩存。當 unless 指定的條件為 true ,方法的返回值就不會被緩存。當然你也可以獲取到結果進行判斷。(通過 #result
獲取方法結果)
(6)sync:是否使用異步模式。默認是方法執行完,以同步的方式將方法返回的結果存在緩存中。
4、spEL 編寫 key
前面說過,緩存的 key 支持使用 spEL 表達式去編寫,下面總結一下使用 spEL 去編寫 key 可以用的一些元數據:
二、@CacheEvict的作用
1、@CacheEvict是用來標注在需要清除緩存元素的方法或類上的。當標記在一個類上時,表示其中所有的方法的執行都會觸發緩存的清除操作。
@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應的屬性類似。
即value表示清除操作是發生在哪些Cache上的(對應Cache的名稱);
key表示需要清除的是哪個key,如未指定則會使用默認策略生成的key;
condition表示清除操作發生的條件。下面我們來介紹一下新出現的兩個屬性allEntries和beforeInvocation。
2、allEntries屬性
allEntries是boolean類型,表示是否需要清除緩存中的所有元素。默認為false,表示不需要。當指定了allEntries為true時,清除緩存中的所有元素,Spring Cache將忽略指定的key。
有的時候我們需要Cache一下清除所有的元素,這比一個一個清除元素更有效率。
3、beforeInvocation屬性
清除操作默認是在對應方法成功執行之后觸發的,即方法如果因為拋出異常而未能成功返回時也不會觸發清除操作。使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在調用該方法之前清除緩存中的指定元素