詳解Springboot @Cacheable 注解(指定緩存位置)
一、@Cacheable的作用
1、緩存使用步驟:@Cacheable這個(gè)注解,用它就是為了使用緩存的。所以我們可以先說(shuō)一下緩存的使用步驟:
1、開(kāi)啟基于注解的緩存,使用 @EnableCaching 標(biāo)識(shí)在 SpringBoot 的主啟動(dòng)類(lèi)上。
2、標(biāo)注緩存注解即可
使用 @Cacheable
注解就可以將運(yùn)行結(jié)果緩存,以后查詢(xún)相同的數(shù)據(jù),直接從緩存中取,不需要調(diào)用方法
2、@Cacheable作用:把方法的返回值添加到Ehcache緩存中。
3、常用屬性介紹:
(1)cacheNames/value 用來(lái)指定緩存組件的名字,將方法的返回結(jié)果放在哪個(gè)緩存中,可以是數(shù)組的方式,支持指定多個(gè)緩存
@Cacheable(cacheNames = "streamUrl", key = "#eventId", unless = "#result == null") // 數(shù)組 @Cacheable(cacheNames = {"streamUrl", "test"}, key = "#eventId", unless = "#result == null")
(2)key:緩存數(shù)據(jù)時(shí)使用的 key。默認(rèn)使用的是方法參數(shù)的值??梢允褂?spEL 表達(dá)式去編寫(xiě)。
@Cacheable(cacheNames = "streamUrl", key = "#eventId + '[' + #id + ']'", unless = "#result == null")
(3)keyGenerator:key 的生成器,可以自己指定 key 的生成器,通過(guò)這個(gè)生成器來(lái)生成 key。
@Cacheable(value = "ip", keyGenerator = "cacheKeyGenerator") public IPResponse query(String ip) { return ipAPI.query(ip); }
這樣放入緩存中的 key 的生成規(guī)則就按照你自定義的 keyGenerator 來(lái)生成。不過(guò)需要注意的是: @Cacheable
的屬性,key 和 keyGenerator 使用的時(shí)候,一般二選一。
(4)condition:符合條件的情況下才緩存。方法返回的數(shù)據(jù)要不要緩存,可以做一個(gè)動(dòng)態(tài)判斷
// 表示 id 大于 1 才進(jìn)行緩存 @Cacheable(cacheNames = "streamUrl", condition = "#id > 1")
(5)unless:否定緩存。當(dāng) unless 指定的條件為 true ,方法的返回值就不會(huì)被緩存。當(dāng)然你也可以獲取到結(jié)果進(jìn)行判斷。(通過(guò) #result
獲取方法結(jié)果)
(6)sync:是否使用異步模式。默認(rèn)是方法執(zhí)行完,以同步的方式將方法返回的結(jié)果存在緩存中。
4、spEL 編寫(xiě) key
前面說(shuō)過(guò),緩存的 key 支持使用 spEL 表達(dá)式去編寫(xiě),下面總結(jié)一下使用 spEL 去編寫(xiě) key 可以用的一些元數(shù)據(jù):
二、@CacheEvict的作用
1、@CacheEvict是用來(lái)標(biāo)注在需要清除緩存元素的方法或類(lèi)上的。當(dāng)標(biāo)記在一個(gè)類(lèi)上時(shí),表示其中所有的方法的執(zhí)行都會(huì)觸發(fā)緩存的清除操作。
@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語(yǔ)義與@Cacheable對(duì)應(yīng)的屬性類(lèi)似。
即value表示清除操作是發(fā)生在哪些Cache上的(對(duì)應(yīng)Cache的名稱(chēng));
key表示需要清除的是哪個(gè)key,如未指定則會(huì)使用默認(rèn)策略生成的key;
condition表示清除操作發(fā)生的條件。下面我們來(lái)介紹一下新出現(xiàn)的兩個(gè)屬性allEntries和beforeInvocation。
2、allEntries屬性
allEntries是boolean類(lèi)型,表示是否需要清除緩存中的所有元素。默認(rèn)為false,表示不需要。當(dāng)指定了allEntries為true時(shí),清除緩存中的所有元素,Spring Cache將忽略指定的key。
有的時(shí)候我們需要Cache一下清除所有的元素,這比一個(gè)一個(gè)清除元素更有效率。
3、beforeInvocation屬性
清除操作默認(rèn)是在對(duì)應(yīng)方法成功執(zhí)行之后觸發(fā)的,即方法如果因?yàn)閽伋霎惓6茨艹晒Ψ祷貢r(shí)也不會(huì)觸發(fā)清除操作。使用beforeInvocation可以改變觸發(fā)清除操作的時(shí)間,當(dāng)我們指定該屬性值為true時(shí),Spring會(huì)在調(diào)用該方法之前清除緩存中的指定元素
到此這篇關(guān)于@Cacheable 注解(指定緩存位置)的文章就介紹到這了,更多相關(guān)@Cacheable 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文探究ArrayBlockQueue函數(shù)及應(yīng)用場(chǎng)景
這篇文章主要為大家介紹了一文探究ArrayBlockQueue函數(shù)及應(yīng)用場(chǎng)景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03解決mybatis-plus-boot-starter與mybatis-spring-boot-starter的錯(cuò)誤問(wèn)題
本文主要講述了在使用MyBatis和MyBatis-Plus時(shí)遇到的綁定異常問(wèn)題,通過(guò)排查和總結(jié),作者發(fā)現(xiàn)使用MyBatis-Plus?Boot?Starter可以解決這個(gè)問(wèn)題,文章詳細(xì)對(duì)比了MyBatis-Plus?Boot?Starter和MyBatis?Spring?Boot?Starter的功能和使用場(chǎng)景2025-01-01如何使用Spring Boot實(shí)現(xiàn)自定義Spring Boot插件
在本文中,我們介紹了如何使用 Spring Boot 實(shí)現(xiàn)自定義插件,使用自定義插件可以幫助我們快速地添加一些額外的功能,提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧2023-06-06Spring中@Transactional注解關(guān)鍵屬性和用法小結(jié)
在Spring框架中,@Transactional 是一個(gè)注解,用于聲明事務(wù)性的方法,它提供了一種聲明式的事務(wù)管理方式,避免了在代碼中直接編寫(xiě)事務(wù)管理相關(guān)的代碼,本文給大家介紹@Transactional 注解的一些關(guān)鍵屬性和用法,感興趣的朋友一起看看吧2023-12-12專(zhuān)屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou
這篇文章主要介紹了專(zhuān)屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11mybatis中的延遲加載類(lèi)型及設(shè)定詳解
這篇文章主要介紹了mybatis中的延遲加載類(lèi)型及設(shè)定詳解,MyBatis中的延遲加載,也稱(chēng)為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢(xún)時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún),延遲加載可以有效的減少數(shù)據(jù)庫(kù)壓力,需要的朋友可以參考下2023-10-10Java多線程案例實(shí)戰(zhàn)之定時(shí)器的實(shí)現(xiàn)
在Java中可以使用多線程和定時(shí)器來(lái)實(shí)現(xiàn)定時(shí)任務(wù),下面這篇文章主要給大家介紹了關(guān)于Java多線程案例之定時(shí)器實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01