@CacheEvict注解,清除緩存方式
@CacheEvict注解,清除緩存
是用來清除緩存的,有以下屬性:
value
:緩存位置名稱,不能為空,同上key
:緩存的key,默認(rèn)為空,同上condition
:觸發(fā)條件,只有滿足條件的情況才會清除緩存,默認(rèn)為空,支持SpELallEntries
:true表示清除value中的全部緩存,默認(rèn)為false
使用1:清除所有緩存
allEntries是boolean類型,表示是否需要清除緩存中的所有元素。
默認(rèn)為false,表示不需要。
當(dāng)指定了allEntries為true時(shí),Spring Cache將忽略指定的key。
有的時(shí)候我們需要Cache一下清除所有的元素,這比一個(gè)一個(gè)清除元素更有效率。
? ?@CacheEvict(value="users", allEntries=true) ? ?public void delete(Integer id) { ? ? ? System.out.println("delete user by id: " + id); ? ?}
使用1:清除指定key的緩存
? ? //清除掉指定key的緩存 ? ? ? @CacheEvict(value="andCache",key="#user.userId + 'findById'") ? ? ? public void modifyUserRole(SystemUser user) { ? ? ? ? ? ? ? ?System.out.println("hello andCache delete"+user.getUserId()); ? ? ? } ? ? ? //清除掉全部緩存 ? ? ? @CacheEvict(value="andCache",allEntries=true) ? ? ? public final void setReservedUsers(String[] reservedUsers) { ? ? ? ? ? System.out.println("hello andCache deleteall"); ? ? ? }</span> ?
一般來說,我們的更新操作只需要刷新緩存中某一個(gè)值,所以定義緩存的key值的方式就很重要,最好是能夠唯一,因?yàn)檫@樣可以準(zhǔn)確的清除掉特定的緩存,而不會影響到其它緩存值 ,
比如我這里針對用戶的操作,使用(userId+方法名稱)的方式設(shè)定key值 ,當(dāng)然,你也可以找到更適合自己的方式去設(shè)定。
@CacheEvict注解參數(shù)詳解
最近在項(xiàng)目中一直用到@Cacheable和@CacheEvict這兩個(gè)注解來加緩存和清除緩存,但有時(shí)候會出現(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í)行對應(yīng)方法之前刪除緩存,默認(rèn) false(即執(zhí)行方法之后再刪除緩存),當(dāng)我們遇到需要在執(zhí)行方法前刪除緩存,也就是不管方法執(zhí)行是否成功都需要清除緩存,那我們就可以把beforeInvocation的值改為true
4.condition
這個(gè)屬性是指定一個(gè)SpEL表達(dá)式,只有當(dāng)該表達(dá)式為true時(shí)才會清除緩存
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ù)邏輯,會出現(xiàn)緩存刪除的場景不同,需要慎重考慮設(shè)置為true還是false,文章比較淺,可以大致理解一下各個(gè)參數(shù)的含義。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot 實(shí)現(xiàn)Restful webservice服務(wù)端示例代碼
這篇文章主要介紹了Spring Boot 實(shí)現(xiàn)Restful webservice服務(wù)端示例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11MyBatis利用MyCat實(shí)現(xiàn)多租戶的簡單思路分享
這篇文章主要給大家介紹了關(guān)于MyBatis利用MyCat實(shí)現(xiàn)多租戶的簡單思路的相關(guān)資料,文中的多租戶是基于多數(shù)據(jù)庫進(jìn)行實(shí)現(xiàn)的,數(shù)據(jù)是通過不同數(shù)據(jù)庫進(jìn)行隔離,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06一文總結(jié)RabbitMQ中的消息確認(rèn)機(jī)制
RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文為大家整理了RabbitMQ中的消息確認(rèn)機(jī)制,需要的可以參考一下2023-06-06Spring + Mybatis 項(xiàng)目實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源實(shí)例詳解
這篇文章主要介紹了Spring + Mybatis 項(xiàng)目實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源的相關(guān)資料,需要的朋友參考下吧2017-04-04Selenium Webdriver實(shí)現(xiàn)截圖功能的示例
今天小編就為大家分享一篇Selenium Webdriver實(shí)現(xiàn)截圖功能的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05java秒殺系統(tǒng)常見問題庫存超賣解決實(shí)例分析
這篇文章主要為大家介紹了java秒殺系統(tǒng)常見問題庫存超賣解決實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11深入詳解java高并發(fā)熱點(diǎn)數(shù)據(jù)更新
這篇文章主要為大家深入介紹了java高并發(fā)熱點(diǎn)數(shù)據(jù)更新詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04