@CacheEvict中的allEntries與beforeInvocation的區(qū)別說明
@CacheEvict allEntries與beforeInvocation區(qū)別
在spring cache中,@CacheEvict是清除緩存的注解。
其中注解參數(shù)可以只有value,key意思是清除在value值空間中的key值數(shù)據(jù),此時(shí)默認(rèn)在當(dāng)前注解方法成功執(zhí)行之后再清除。
這時(shí)候就會(huì)存在一個(gè)問題,也許你的注解方法成功執(zhí)行了刪除操作,但是后續(xù)代碼拋出異常導(dǎo)致未能清除緩存,下次查詢時(shí)依舊從緩存中去讀取,這時(shí)查詢到的結(jié)果值是刪除操作之前的值。
有一個(gè)簡(jiǎn)單的解決辦法,在注解參數(shù)里面加上beforeInvocation為true,意思是說當(dāng)執(zhí)行這個(gè)方法之前執(zhí)行清除緩存的操作,這樣不管這個(gè)方法執(zhí)行成功與否,該緩存都將不存在。
當(dāng)注解參數(shù)加上allEntries為true時(shí),意思是說這個(gè)清除緩存是清除當(dāng)前value值空間下的所有緩存數(shù)據(jù)。
@CacheEvict注解參數(shù)詳解
最近在項(xiàng)目中一直用到@Cacheable和@CacheEvict這兩個(gè)注解來加緩存和清除緩存,但有時(shí)候會(huì)出現(xiàn)在同一個(gè)事務(wù)中先是清楚了緩存,但是有不在這個(gè)事務(wù)中的方法調(diào)用了查詢,又把更新前的數(shù)據(jù)重新放到緩存里面了,所以就想好好的去研究一下@CacheEvict這個(gè)緩存刪除的注解
1.value
必須屬性,用于指定該方法清除哪個(gè)緩存區(qū)的數(shù)據(jù),默認(rèn)是一個(gè)空的數(shù)組
2. allEntries
這個(gè)屬性是指是否清楚整個(gè)緩存區(qū)
3.beforeInvocation
這個(gè)屬性比較關(guān)鍵,他的意思是是否在執(zhí)行對(duì)應(yīng)方法之前刪除緩存,默認(rèn) false(即執(zhí)行方法之后再刪除緩存),當(dāng)我們遇到需要在執(zhí)行方法前刪除緩存,也就是不管方法執(zhí)行是否成功都需要清除緩存,那我們就可以把beforeInvocation的值改為true
4.condition
這個(gè)屬性是指定一個(gè)SpEL表達(dá)式,只有當(dāng)該表達(dá)式為true時(shí)才會(huì)清除緩存
5.key
通過SpEL表達(dá)式顯示指定緩存的key
eg: key = "#warehousePo.guid + ‘a(chǎn)ll'"
6.cacheNames
cache名稱集合,數(shù)據(jù)結(jié)構(gòu)為數(shù)組類型
我用到的比較多的就是beforeInvocation的使用,因?yàn)楦鶕?jù)不同的業(yè)務(wù)邏輯,會(huì)出現(xiàn)緩存刪除的場(chǎng)景不同,需要慎重考慮設(shè)置為true還是false,文章比較淺,可以大致理解一下各個(gè)參數(shù)的含義。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計(jì)模式之代理模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式,本文詳細(xì)的介紹了什么事代理模式和相關(guān)的類和接口,有興趣的可以了解一下2017-08-08Java注解實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)例代碼
本篇文章主要介紹了Java注解實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Java對(duì)象級(jí)別與類級(jí)別的同步鎖synchronized語法示例
這篇文章主要為大家介紹了Java對(duì)象級(jí)別與類級(jí)別的同步鎖synchronized語法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java中的Map集合根據(jù)key值排序的實(shí)現(xiàn)
本文主要介紹了Java中的Map集合如何根據(jù)key值排序,包含使用TreeMap和使用lambda表達(dá)式和Stream流兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03java中BigDecimal進(jìn)行加減乘除的基本用法
大家應(yīng)該對(duì)于不需要任何準(zhǔn)確計(jì)算精度的數(shù)字可以直接使用float或double運(yùn)算,但是如果需要精確計(jì)算的結(jié)果,則必須使用BigDecimal類,而且使用BigDecimal類也可以進(jìn)行大數(shù)的操作。下面這篇文章就給大家介紹介紹關(guān)于java中BigDecimal進(jìn)行加減乘除的基本用法。2016-12-12一次排查@CacheEvict注解失效的經(jīng)歷及解決
這篇文章主要介紹了一次排查@CacheEvict注解失效的經(jīng)歷及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring MVC+FastJson+Swagger集成的完整實(shí)例教程
這篇文章主要給大家分享介紹了關(guān)于Spring MVC+FastJson+Swagger集成的完整實(shí)例教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04