@Cacheable關於快取的個人筆記
Cacheable工作原理
1.自動配置類:CacheAutoConfiguration
2.快取的配置類很多,預設生效的配置類為:
SimpleCacheConfiguration
3.給容器註冊了一個CacheManager:ConcurrentMapCacheManager
4.可以獲取和建立ConcurrentMapCache型別的快取元件;它的作用講資料儲存再ConcurrentMap中
執行流程
@Cacheable:
1.方法執行之前,先去查詢Cache(快取元件),按照cacheNames指定的名字獲取;(CacheManager先去獲取相應的快取),第一次獲取快取如果沒有Cache元件會自動建立
2.去Cache中查詢快取的內容,使用一個key,預設就是方法的引數
key是按照某種策略生成的;預設是使用keyGenerator生成的,預設使用SimplekeyGenerator生成可以;
SimplekeyGenerator生成key的預設策略
如果沒有引數:key = new SimpleKey();
如果有一個引數: key = 引數的值
如果有多個引數: key = new SimpleKey(params) ;(如果是一個封裝類也可以當作一個key)
3.沒有查到快取就呼叫目標方法;
4.將目標方法返回的結果,放進快取中;
@Cacheable標註的方法執行之前先來檢查快取中有沒有這個資料,預設按照引數的值去查詢快取,如果沒有就執行方法將結果放入快取,以後再來呼叫就可以直接使用快取中的資料
核心:
(1) 使用CacheManager(ConcurrentMapCacheManager)按照名字得到Cache(ConcurrentMapCache)元件
(2) key使用keyGenerator生成的,預設是SimpleKeyGenerator;
當然也可以自定義一個KeyGenerator,等等下面會寫到有
註解講解
@Cacheable
幾個屬性:
cacheNames/value:指定快取元件的名字;將方法的返回結果放在哪個快取中,是陣列的放是,可以指定多個快取
key:快取資料使用的key,可以指定預設使用方法引數的值
KeyGenerator:Key的生成器:可以自己指定Key的生成器的元件id
key/keyGenerator:二選一使用
package yan.test.config;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
import java.util.Arrays;
@Configuration
public class MyCacheConfig {
@Bean("MyKeyGenerator")//定義KeyGenerator的名字
public KeyGenerator keyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
return method.getName()+"["+ Arrays.asList(objects) +"]";//返回一個自定義的名字
}
};
}
}
cacheManager:指定快取管理器;或者cacheResolver指定獲取解析器
condition:指定符合條件的情況下才快取,如condition = “#id>0” 為true 則產生快取
unless:與condition相反
sync:是否使用非同步模式
@Cacheput:
作用:既呼叫方法,又更新快取資料;
修改了資料庫的某個資料,同時更新快取;
在Controller層分別呼叫 查詢 和 更新功能
連續2次呼叫查詢功能
呼叫資料庫查詢只用了一次 第二次從快取中獲取 所以只顯示了一次 ‘查詢1’
接下來執行更新功能
通過postman更改了型別的引數
接下來在進行查詢 看看實際上快取有沒有進行替換
看結果 沒有出現 ‘查詢1’ 說明快取已經更替
注意Cacheable和CachePut的Key值要相同 值不相同無法進行快取資料更新
@CacheEvict
作用:快取清除
@CacheEvict(value = “要清除快取的key值”)
key:指定要清楚的資料
allEntries = true 指定清除這個快取中的所有資料
beforeInvocation = false(預設) :快取的清除是否在方法之前執行
預設代表快取清除操作是在方法執行之後執行;如果出現就不會清除
beforeInvocation = true :代表清除快取操作是在方法執行之前執行,無卵方法是否出現一次,快取都會被清除
資料
beforeInvocation = false(預設) :快取的清除是否在方法之前執行
預設代表快取清除操作是在方法執行之後執行;如果出現就不會清除
beforeInvocation = true :代表清除快取操作是在方法執行之前執行,無卵方法是否出現一次,快取都會被清除
相關文章
- Spring 快取註解@Cacheable的用法Spring快取
- Spring @cacheable註解實現的快取Spring快取
- 筆記:將FileItem存放於快取筆記快取
- spring 快取 @Cacheable 錯誤總結Spring快取
- 關於快取快取
- Spring快取註解@Cacheable、@CacheEvict、@CachePut使用Spring快取
- Spring : 快取相關注解@EnableCaching、@CacheConfig、@Cacheable、@CachingSpring快取
- [個人筆記] 關於linux的常見問題合集筆記Linux
- Spring快取註解@Cacheable、@CacheEvict、@CachePut使用注意點Spring快取
- HTTP快取筆記(1)HTTP快取筆記
- 關於JdonFramework的快取問題Framework快取
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis
- SDWebImage 快取機制(筆記)Web快取筆記
- 關於記憶體快取的可伸縮性問題記憶體快取
- GOT & PLT 易於理解的個人筆記Go筆記
- 關於分散式快取memcache分散式快取
- 【譯】關於四種快取的故事快取
- 關於tomcat與jboss的快取Tomcat快取
- 關於論壇快取的疑問快取
- 關於 Hibernate快取的問題快取
- 請教關於快取的問題快取
- 關於GD和OB快取的輸出快取
- 關於快取的那些風流事兒快取
- banq先生,關於快取問題快取
- 個人總結-CPU快取快取
- 談談關於前端的快取的問題前端快取
- 關於Integer.valueOf()從快取池取物件的用法快取物件
- 關於webpack的筆記1Web筆記
- 【安卓筆記】硬碟快取工具類的編寫安卓筆記硬碟快取
- 《分散式快取》讀書筆記二分散式快取筆記
- Django筆記三十三之快取操作Django筆記快取
- 關於 Web 快取的那些風流事兒Web快取
- 關於快取和 Chrome 的“新版重新整理”快取Chrome
- 個人筆記筆記
- 關於 ASP.NET 記憶體快取你需要知道的 10 點ASP.NET記憶體快取
- 關於快取命中率的幾個關鍵問題!快取
- 對於前端快取的理解(快取機制和快取型別)前端快取型別
- FFmpeg開發筆記(十四)FFmpeg音訊重取樣的快取筆記音訊快取