JetCache的配置和注解屬性的使用說明
一、配置說明
yml配置文件案例(如果沒使用springboot,直接配置GlobalCacheConfig是類似的,參考快速入門教程):
jetcache:
statIntervalMinutes: 15
areaInCacheName: false
hidePackages: com.alibaba
local:
default:
type: caffeine
limit: 100
keyConvertor: fastjson
expireAfterWriteInMillis: 100000
otherArea:
type: linkedhashmap
limit: 100
keyConvertor: none
expireAfterWriteInMillis: 100000
remote:
default:
type: redis
keyConvertor: fastjson
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: ${redis.host}
port: ${redis.port}
otherArea:
type: redis
keyConvertor: fastjson
valueEncoder: kryo
valueDecoder: kryo
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: ${redis.host}
port: ${redis.port}配置通用說明如下:
| 屬性 | 默認(rèn)值 | 說明 |
|---|---|---|
| jetcache.statIntervalMinutes | 0 | 統(tǒng)計(jì)間隔,0表示不統(tǒng)計(jì) |
| jetcache.areaInCacheName | true | jetcache-anno把cacheName作為遠(yuǎn)程緩存key前綴,2.4.3以前的版本總是把a(bǔ)reaName加在cacheName中,因此areaName也出現(xiàn)在key前綴中。2.4.4以后可以配置,為了保持遠(yuǎn)程key兼容默認(rèn)值為true,但是新項(xiàng)目的話false更合理些。 |
| jetcache.hiddenPackages | 無 | @Cached和@CreateCache自動(dòng)生成name的時(shí)候,為了不讓name太長,hiddenPackages指定的包名前綴被截掉 |
| jetcache.[local|remote].${area}.type | 無 | 緩存類型。tair、redis為當(dāng)前支持的遠(yuǎn)程緩存;linkedhashmap、caffeine為當(dāng)前支持的本地緩存類型 |
| jetcache.[local|remote].${area}.keyConvertor | 無 | key轉(zhuǎn)換器的全局配置,當(dāng)前只有一個(gè)已經(jīng)實(shí)現(xiàn)的keyConvertor:fastjson。僅當(dāng)使用@CreateCache且緩存類型為LOCAL時(shí)可以指定為none,此時(shí)通過equals方法來識別key。方法緩存必須指定keyConvertor |
| jetcache.[local|remote].${area}.valueEncoder | java | 序列化器的全局配置。僅remote類型的緩存需要指定,可選java和kryo |
| jetcache.[local|remote].${area}.valueDecoder | java | 序列化器的全局配置。僅remote類型的緩存需要指定,可選java和kryo |
| jetcache.[local|remote].${area}.limit | 100 | 每個(gè)緩存實(shí)例的最大元素的全局配置,僅local類型的緩存需要指定。注意是每個(gè)緩存實(shí)例的限制,而不是全部,比如這里指定100,然后用@CreateCache創(chuàng)建了兩個(gè)緩存實(shí)例(并且注解上沒有設(shè)置localLimit屬性),那么每個(gè)緩存實(shí)例的限制都是100 |
| jetcache.[local|remote].${area}.expireAfterWriteInMillis | 無窮大 | 以毫秒為單位指定超時(shí)時(shí)間的全局配置(以前為defaultExpireInMillis) |
| jetcache.local.${area}.expireAfterAccessInMillis | 0 | 需要jetcache2.2以上,以毫秒為單位,指定多長時(shí)間沒有訪問,就讓緩存失效,當(dāng)前只有本地緩存支持。0表示不使用這個(gè)功能。 |
上表中${area}對應(yīng)@Cached和@CreateCache的area屬性。注意如果注解上沒有指定area,默認(rèn)值是"default"。
關(guān)于緩存的超時(shí)時(shí)間,有多個(gè)地方指定,澄清說明一下:
- put等方法上指定了超時(shí)時(shí)間,則以此時(shí)間為準(zhǔn)
- put等方法上未指定超時(shí)時(shí)間,使用Cache實(shí)例的默認(rèn)超時(shí)時(shí)間
- Cache實(shí)例的默認(rèn)超時(shí)時(shí)間,通過在@CreateCache和@Cached上的expire屬性指定,如果沒有指定,使用yml中定義的全局配置,例如@Cached(cacheType=local)使用jetcache.local.default.expireAfterWriteInMillis,如果仍未指定則是無窮大
二、注解屬性說明
JetCache方法緩存和SpringCache比較類似,它原生提供了TTL支持,以保證最終一致,并且支持二級緩存。JetCache2.4以后支持基于注解的緩存更新和刪除。
在spring環(huán)境下,使用@Cached注解可以為一個(gè)方法添加緩存,@CacheUpdate用于更新緩存,@CacheInvalidate用于移除緩存元素。注解可以加在接口上也可以加在類上,加注解的類必須是一個(gè)spring bean,例如:
public interface UserService {
@Cached(name="userCache.", key="#userId", expire = 3600)
User getUserById(long userId);
@CacheUpdate(name="userCache.", key="#user.userId", value="#user")
void updateUser(User user);
@CacheInvalidate(name="userCache.", key="#userId")
void deleteUser(long userId);
}key使用Spring的SpEL腳本來指定。如果要使用參數(shù)名(比如這里的key="#userId"),項(xiàng)目編譯設(shè)置target必須為1.8格式,并且指定javac的-parameters參數(shù),否則就要使用key="args[0]"這樣按下標(biāo)訪問的形式。
@CacheUpdate和@CacheInvalidate的name和area屬性必須和@Cached相同,name屬性還會(huì)用做cache的key前綴。
@Cached注解和@CreateCache的屬性非常類似,但是多幾個(gè):
| 屬性 | 默認(rèn)值 | 說明 |
|---|---|---|
| area | “default” | 如果在配置中配置了多個(gè)緩存area,在這里指定使用哪個(gè)area |
| name | 未定義 | 指定緩存的唯一名稱,不是必須的,如果沒有指定,會(huì)使用類名+方法名。name會(huì)被用于遠(yuǎn)程緩存的key前綴。另外在統(tǒng)計(jì)中,一個(gè)簡短有意義的名字會(huì)提高可讀性。 |
| key | 未定義 | 使用SpEL指定key,如果沒有指定會(huì)根據(jù)所有參數(shù)自動(dòng)生成。 |
| expire | 未定義 | 超時(shí)時(shí)間。如果注解上沒有定義,會(huì)使用全局配置,如果此時(shí)全局配置也沒有定義,則為無窮大 |
| timeUnit | TimeUnit.SECONDS | 指定expire的單位 |
| cacheType | CacheType.REMOTE | 緩存的類型,包括CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。如果定義為BOTH,會(huì)使用LOCAL和REMOTE組合成兩級緩存 |
| localLimit | 未定義 | 如果cacheType為LOCAL或BOTH,這個(gè)參數(shù)指定本地緩存的最大元素?cái)?shù)量,以控制內(nèi)存占用。如果注解上沒有定義,會(huì)使用全局配置,如果此時(shí)全局配置也沒有定義,則為100 |
| localExpire | 未定義 | 僅當(dāng)cacheType為BOTH時(shí)適用,為內(nèi)存中的Cache指定一個(gè)不一樣的超時(shí)時(shí)間,通常應(yīng)該小于expire |
| serialPolicy | 未定義 | 指定遠(yuǎn)程緩存的序列化方式??蛇x值為SerialPolicy.JAVA和SerialPolicy.KRYO。如果注解上沒有定義,會(huì)使用全局配置,如果此時(shí)全局配置也沒有定義,則為SerialPolicy.JAVA |
| keyConvertor | 未定義 | 指定KEY的轉(zhuǎn)換方式,用于將復(fù)雜的KEY類型轉(zhuǎn)換為緩存實(shí)現(xiàn)可以接受的類型,當(dāng)前支持KeyConvertor.FASTJSON和KeyConvertor.NONE。NONE表示不轉(zhuǎn)換,F(xiàn)ASTJSON可以將復(fù)雜對象KEY轉(zhuǎn)換成String。如果注解上沒有定義,會(huì)使用全局配置。 |
| enabled | true | 是否激活緩存。例如某個(gè)dao方法上加緩存注解,由于某些調(diào)用場景下不能有緩存,所以可以設(shè)置enabled為false,正常調(diào)用不會(huì)使用緩存,在需要的地方可使用CacheContext.enableCache在回調(diào)中激活緩存,緩存激活的標(biāo)記在ThreadLocal上,該標(biāo)記被設(shè)置后,所有enable=false的緩存都被激活 |
| cacheNullValue | false | 當(dāng)方法返回值為null的時(shí)候是否要緩存 |
| condition | 未定義 | 使用SpEL指定條件,如果表達(dá)式返回true的時(shí)候才去緩存中查詢 |
| postCondition | 未定義 | 使用SpEL指定條件,如果表達(dá)式返回true的時(shí)候才更新緩存,該評估在方法執(zhí)行后進(jìn)行,因此可以訪問到#result |
@CacheInvalidate注解說明:
| 屬性 | 默認(rèn)值 | 說明 |
|---|---|---|
| area | “default” | 如果在配置中配置了多個(gè)緩存area,在這里指定使用哪個(gè)area,指向?qū)?yīng)的@Cached定義。 |
| name | 未定義 | 指定緩存的唯一名稱,指向?qū)?yīng)的@Cached定義。 |
| key | 未定義 | 使用SpEL指定key |
| condition | 未定義 | 使用SpEL指定條件,如果表達(dá)式返回true才執(zhí)行刪除,可訪問方法結(jié)果#result |
@CacheUpdate注解說明:
| 屬性 | 默認(rèn)值 | 說明 |
|---|---|---|
| area | “default” | 如果在配置中配置了多個(gè)緩存area,在這里指定使用哪個(gè)area,指向?qū)?yīng)的@Cached定義。 |
| name | 未定義 | 指定緩存的唯一名稱,指向?qū)?yīng)的@Cached定義。 |
| key | 未定義 | 使用SpEL指定key |
| value | 未定義 | 使用SpEL指定value |
| condition | 未定義 | 使用SpEL指定條件,如果表達(dá)式返回true才執(zhí)行更新,可訪問方法結(jié)果#result |
使用@CacheUpdate和@CacheInvalidate的時(shí)候,相關(guān)的緩存操作可能會(huì)失敗(比如網(wǎng)絡(luò)IO錯(cuò)誤),所以指定緩存的超時(shí)時(shí)間是非常重要的。
@CacheRefresh注解說明:
| 屬性 | 默認(rèn)值 | 說明 |
|---|---|---|
| refresh | 未定義 | 刷新間隔 |
| timeUnit | TimeUnit.SECONDS | 時(shí)間單位 |
| stopRefreshAfterLastAccess | 未定義 | 指定該key多長時(shí)間沒有訪問就停止刷新,如果不指定會(huì)一直刷新 |
| refreshLockTimeout | 60秒 | 類型為BOTH/REMOTE的緩存刷新時(shí),同時(shí)只會(huì)有一臺(tái)服務(wù)器在刷新,這臺(tái)服務(wù)器會(huì)在遠(yuǎn)程緩存放置一個(gè)分布式鎖,此配置指定該鎖的超時(shí)時(shí)間 |
@CachePenetrationProtect注解:
當(dāng)緩存訪問未命中的情況下,對并發(fā)進(jìn)行的加載行為進(jìn)行保護(hù)。 當(dāng)前版本實(shí)現(xiàn)的是單JVM內(nèi)的保護(hù),即同一個(gè)JVM中同一個(gè)key只有一個(gè)線程去加載,其它線程等待結(jié)果。
對于以上未定義默認(rèn)值的參數(shù),如果沒有指定,將使用yml中指定的全局配置,全局配置請參考配置說明。
到此這篇關(guān)于JetCache的配置和注解屬性的使用說明的文章就介紹到這了,更多相關(guān)JetCache 配置和注解屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java線程協(xié)調(diào)運(yùn)行操作實(shí)例詳解
這篇文章主要介紹了Java線程協(xié)調(diào)運(yùn)行操作,結(jié)合具體實(shí)例形式詳細(xì)分析了Java線程協(xié)調(diào)運(yùn)行原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
springboot實(shí)現(xiàn)讀取nacos配置文件
這篇文章主要介紹了springboot實(shí)現(xiàn)讀取nacos配置文件方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
java開發(fā)ServiceLoader實(shí)現(xiàn)機(jī)制及SPI應(yīng)用
這篇文章主要為大家介紹了java開發(fā)ServiceLoader實(shí)現(xiàn)機(jī)制及SPI應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Java Set集合及其子類HashSet與LinkedHashSet詳解
這篇文章主要介紹了Java Set集合及其子類HashSet與LinkedHashSet詳解,文章通過Set集合存儲(chǔ)原理展開文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下2022-06-06

