使用@CacheEvict清除指定下所有緩存
@CacheEvict清除指定下所有緩存
@CacheEvict(cacheNames = "parts:grid",allEntries = true)
此注解會清除part:grid下所有緩存
@CacheEvict要求指定一個或多個緩存,使之都受影響。此外,還提供了一個額外的參數(shù)allEntries 。表示是否需要清除緩存中的所有元素。默認(rèn)為false,表示不需要。
當(dāng)指定了allEntries為true時,Spring Cache將忽略指定的key。有的時候我們需要Cache一下清除所有的元素。
@Cacheable 緩存 @CachePut:緩存更新 @CacheEvict:緩存刪除
@Cacheable 緩存
說明:在支持Spring Cache的環(huán)境下,對于使用@Cacheable標(biāo)注的方法,Spring在每次執(zhí)行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執(zhí)行該方法,而是直接從緩存中獲取結(jié)果進(jìn)行返回,否則才會執(zhí)行并將返回結(jié)果存入指定的緩存中。
// @since 3.1 可以標(biāo)注在方法上、類上 下同 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Cacheable { // 緩存名稱 可以寫多個,key的真正組成,以cacheName為前綴,多個就會有多個key產(chǎn)生 @AliasFor("cacheNames") String[] value() default {}; @AliasFor("value") String[] cacheNames() default {}; // 支持寫SpEL,切可以使用#root,#參數(shù)名”或者“#p參數(shù)index” //詳情去 https://blog.csdn.net/dalong_bamboo/article/details/103844076 String key() default ""; // Mutually exclusive:它和key屬性互相排斥。請只使用一個,直接寫bean的名字就可以 String keyGenerator() default ""; //用于選擇使用哪個cacheManager String cacheManager() default ""; //用戶定義如何處理緩存,實(shí)現(xiàn) org.springframework.cache.interceptor.CacheResolver接口 String cacheResolver() default ""; // 表示在哪種情況下才緩存結(jié)果,可使用SpEL,可以使用#root。 只有true時,才會作用在這個方法上 String condition() default ""; // 表示在哪種情況下不緩存結(jié)果,可以寫SpEL #root,并且可以使用#result拿到方法返回值 經(jīng)典值#result == null String unless() default ""; // true:表示強(qiáng)制同步執(zhí)行。(若多個線程試圖為**同一個鍵**加載值,以同步的方式來進(jìn)行目標(biāo)方法的調(diào)用) // 同步的好處是:后一個線程會讀取到前一個緩存的緩存數(shù)據(jù),不用再查庫了~~~ // 默認(rèn)是false,不開啟同步one by one的 // @since 4.3 注意是sync而不是Async // 它的解析依賴于Spring4.3提供的Cache.get(Object key, Callable<T> valueLoader);方法 boolean sync() default false; }
@CachePut:緩存更新
說明:@CachePut也可以聲明一個方法支持緩存功能。
與@Cacheable不同的是使用@CachePut標(biāo)注的方法在執(zhí)行前不會去檢查緩存中是否存在之前執(zhí)行過的結(jié)果,而是每次都會執(zhí)行該方法,并將執(zhí)行結(jié)果以鍵值對的形式存入指定的緩存中。
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Cacheable { @AliasFor("cacheNames") String[] value() default {}; @AliasFor("value") String[] cacheNames() default {}; // 注意:它和上面區(qū)別是。此處key它還能使用#result String key() default ""; String keyGenerator() default ""; String cacheManager() default ""; String cacheResolver() default ""; String condition() default ""; String unless() default ""; }
@CacheEvict:緩存刪除
說明:@CacheEvict是用來標(biāo)注在需要清除緩存元素的方法或類上的。當(dāng)標(biāo)記在一個類上時表示其中所有的方法的執(zhí)行都會觸發(fā)緩存的清除操作。
@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應(yīng)的屬性類似。
即value表示清除操作是發(fā)生在哪些Cache上的(對應(yīng)Cache的名稱);key表示需要清除的是哪個key,如未指定則會使用默認(rèn)策略生成的key;condition表示清除操作發(fā)生的條件。
下面我們來介紹一下新出現(xiàn)的兩個屬性allEntries和beforeInvocation。
allEntries屬性,allEntries是boolean類型,表示是否需要清除緩存中的所有元素。
默認(rèn)為false,表示不需要。當(dāng)指定了allEntries為true時,Spring Cache將忽略指定的key。
有的時候我們需要Cache一下清除所有的元素,這比一個一個清除元素更有效率。
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Cacheable { @AliasFor("cacheNames") String[] value() default {}; @AliasFor("value") String[] cacheNames() default {}; // 它也能使用#result String key() default ""; String keyGenerator() default ""; String cacheManager() default ""; String cacheResolver() default ""; String condition() default ""; // 是否把上面cacheNames指定的所有的緩存都清除掉,默認(rèn)false boolean allEntries() default false; // 是否讓清理緩存動作在目標(biāo)方法之前執(zhí)行,默認(rèn)是false(在目標(biāo)方法之后執(zhí)行) // 注意:若在之后執(zhí)行的話,目標(biāo)方法一旦拋出異常了,那緩存就清理不掉了~~~~ boolean beforeInvocation() default false; }
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題
這篇文章主要介紹了關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java中使用MongoDB數(shù)據(jù)庫實(shí)例Demo
MongoDB是由C++語言編寫的,基于分布式文件存儲的數(shù)據(jù)庫,是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是最接近于關(guān)系型數(shù)據(jù)庫的NoSQL數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Java中使用MongoDB數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-12-12SpringBoot整合RabbitMQ實(shí)現(xiàn)消息確認(rèn)機(jī)制
這篇文章主要介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)消息確認(rèn)機(jī)制,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08詳解Java多線程編程中互斥鎖ReentrantLock類的用法
Java多線程并發(fā)的程序中使用互斥鎖有synchronized和ReentrantLock兩種方式,這里我們來詳解Java多線程編程中互斥鎖ReentrantLock類的用法:2016-07-07idea遠(yuǎn)程調(diào)試spark的步驟講解
今天小編就為大家分享一篇關(guān)于idea遠(yuǎn)程調(diào)試spark的步驟講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03