@CacheEvict中的allEntries與beforeInvocation的區別說明
@CacheEvict allEntries與beforeInvocation區別
在spring cache中,@CacheEvict是清除緩存的註解。
其中註解參數可以隻有value,key意思是清除在value值空間中的key值數據,此時默認在當前註解方法成功執行之後再清除。
這時候就會存在一個問題,也許你的註解方法成功執行瞭刪除操作,但是後續代碼拋出異常導致未能清除緩存,下次查詢時依舊從緩存中去讀取,這時查詢到的結果值是刪除操作之前的值。
有一個簡單的解決辦法,在註解參數裡面加上beforeInvocation為true,意思是說當執行這個方法之前執行清除緩存的操作,這樣不管這個方法執行成功與否,該緩存都將不存在。
當註解參數加上allEntries為true時,意思是說這個清除緩存是清除當前value值空間下的所有緩存數據。
@CacheEvict註解參數詳解
最近在項目中一直用到@Cacheable和@CacheEvict這兩個註解來加緩存和清除緩存,但有時候會出現在同一個事務中先是清楚瞭緩存,但是有不在這個事務中的方法調用瞭查詢,又把更新前的數據重新放到緩存裡面瞭,所以就想好好的去研究一下@CacheEvict這個緩存刪除的註解
1.value
必須屬性,用於指定該方法清除哪個緩存區的數據,默認是一個空的數組
2. allEntries
這個屬性是指是否清楚整個緩存區
3.beforeInvocation
這個屬性比較關鍵,他的意思是是否在執行對應方法之前刪除緩存,默認 false(即執行方法之後再刪除緩存),當我們遇到需要在執行方法前刪除緩存,也就是不管方法執行是否成功都需要清除緩存,那我們就可以把beforeInvocation的值改為true
4.condition
這個屬性是指定一個SpEL表達式,隻有當該表達式為true時才會清除緩存
5.key
通過SpEL表達式顯示指定緩存的key
eg: key = “#warehousePo.guid + ‘all'”
6.cacheNames
cache名稱集合,數據結構為數組類型
我用到的比較多的就是beforeInvocation的使用,因為根據不同的業務邏輯,會出現緩存刪除的場景不同,需要慎重考慮設置為true還是false,文章比較淺,可以大致理解一下各個參數的含義。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 使用@CacheEvict清除指定下所有緩存
- Spring @Cacheable註解中key的使用詳解
- spring框架cacheAnnotation緩存註釋聲明解析
- 關於@CacheEvict無法解決分頁緩存清除的解決思路
- SpringBoot詳解整合Spring Cache實現Redis緩存流程