spring中快取註解的正確使用

2021-09-26 16:22:05 字數 1791 閱讀 2947

在開始spring中快取註解的用法解析前,先了解一下快取是什麼以及為什麼要用快取

這裡所涉及到的快取都是指的web中的快取。就是當你請求資料時,會優先從快取中獲取,如果未命中(就是快取不存在),才去請求訪問資料庫,獲取到資料後將資料加入到快取中。

乙個需要大量重複呼叫的請求,使用者每次呼叫都會觸發乙個資料庫讀取操作,當使用者越來越多、資料量越大越大的時候,請求的時間將會變長,資料庫可能會崩潰,而且使用者體驗也不太好。這個時候快取就可以上場了。

spring中一共提供了五個關於快取的註解,下面來逐個分析。

注意:註解一定要加在service層的實現類上,而不是controller,也不是service的介面上

該註解只能用於類上面,主要用來配置一些公用的快取配置,比如value(一般都是在@cacheconfig配置value)

例如:@cacheconfig(value = 「usersservice」)

如果在@cacheconfig配置了value,那麼在方法級別的註解上都將不需要配置value,因為他們公用乙個value。

該註解用於標識方法需要快取,能夠對其結果進行快取,這也就是通常意義上的快取。

該註解還有另外三個引數:key、condition、unless

也是對請求結果的快取,但它每次都是觸發真實的呼叫,所以一般用於新增或更新資料,其引數與@cacheable是一樣的。

根據對應的key或一定的條件來刪除快取。

該註解多了兩個引數:allentries和beforeinvocation

@caching註解可以讓我們在乙個方法或者類上同時指定多個spring cache相關的註解。其擁有三個屬性:cacheable、put和evict,分別用於指定@cacheable、@cacheput和@cacheevict。

@caching

(cacheable =

@cacheable

("users"

), evict =

)public user find

(integer id)

當我們在使用@caching時,引數較多會顯得比較亂,所以這裡可以使用自定義註解。

@caching

(cacheable =

@cacheable

("users"

), evict =

)@target()

// 註解作用的地方,這裡是類和方法上

@retention

(retentionpolicy.runtime)

// 註解保留的時期,一般都是執行時

public @inte***ce

mycacheable

註解定義好之後,只需要使用@mycacheable就可以達到上面的效果。

當作用的方法,在新增或更新後可以返回最新的資料,那麼可以使用@cacheput註解,但如果不能返回最新的資料,就不要使用@cacheput註解了。而選擇使用@cacheevict來清除快取。為什麼要清除快取呢,因為如果不清除快取,查詢資料的方法,將會一直從原來的快取中獲取資料,而不能得到最新的資料。這裡可以使用beforeinvocation來設定更新或新增資料前刪除快取。這裡還涉及到乙個快取雙寫一致性的問題,請見快取資料庫雙寫一致性問題

一般都是直接使用@cacheevict,也可以選擇使用allentries引數來清空所有快取。

注意:如果@cacheput、@cacheevict、@cacheable作用的是同乙個快取,那麼他們的key一定要設定為相同的key,否則會造成快取不一致的問題。

Spring快取註解

快取註解有以下三個 cacheable cacheevict cacheput 1 cacheable value accountcache 這個注釋的意思是,當呼叫這個方法的時候,會從乙個名叫 accountcache 的快取中查詢,如果沒有,則執行實際的方法 即查詢資料庫 並將執行的結果存入快取...

Spring快取註解

spring從3.1開始定義了org.springframework.cache.cache和org.springframework.cache.cachemanager介面來統一不同的快取技術,並支援jcache jsr 107 註解簡化開發 當配置上redis之後快取註解就會將快取內容儲存在re...

spring的 Autowired註解的使用

autowired是用於為屬性從容器中自動注入組建 autowired可以標註的位置 1 標註在方法上 標註在屬性的set方法上 當使用bean註解在容器中注入組建是,不需要標註 autowired也可以自動注入 bean public bookservice bookservice2 bookda...