簡介
將方法的運行結(jié)果進行緩存;以后再要相同的數(shù)據(jù)轮听,直接從緩存中獲取,不用調(diào)用方法师枣; CacheManager管理多個Cache組件,對緩存的真正CRUD操作在Cache組件中萧落,每一個緩存組件有自己唯一一個名字践美;
原理
1、自動配置類找岖;CacheAutoConfiguration
2陨倡、緩存的配置類
org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
org.springframework.boot.autoconfigure.cache.GuavaCacheConfiguration
org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration【默認】
org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
3、哪個配置類默認生效:SimpleCacheConfiguration宣增;
4玫膀、給容器中注冊了一個CacheManager:ConcurrentMapCacheManager
5矛缨、可以獲取和創(chuàng)建ConcurrentMapCache類型的緩存組件爹脾;他的作用將數(shù)據(jù)保存在ConcurrentMap中帖旨;
運行流程
@Cacheable:
1、方法運行之前灵妨,先去查詢Cache(緩存組件)解阅,按照cacheNames指定的名字獲取泌霍;
(CacheManager先獲取相應(yīng)的緩存)货抄,第一次獲取緩存如果沒有Cache組件會自動創(chuàng)建。
2朱转、去Cache中查找緩存的內(nèi)容蟹地,使用一個key,默認就是方法的參數(shù)藤为;
key是按照某種策略生成的怪与;默認是使用keyGenerator生成的,默認使用SimpleKeyGenerator生成key缅疟;
SimpleKeyGenerator生成key的默認策略分别;
如果沒有參數(shù);key=new SimpleKey()存淫;
如果有一個參數(shù):key=參數(shù)的值
如果有多個參數(shù):key=new SimpleKey(params)耘斩;
3、沒有查到緩存就調(diào)用目標方法桅咆;
4括授、將目標方法返回的結(jié)果,放進緩存
@Cacheable標注的方法執(zhí)行之前先來檢查緩存中有沒有這個數(shù)據(jù)岩饼,默認按照參數(shù)的值作為key去查詢緩存刽脖,
如果沒有就運行方法并將結(jié)果放入緩存;以后再來調(diào)用就可以直接使用緩存中的數(shù)據(jù)忌愚;
核心
1)曲管、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】組件
2)、key使用keyGenerator生成的硕糊,默認是SimpleKeyGenerator
屬性
cacheNames/value:指定緩存組件的名字;將方法的返回結(jié)果放在哪個緩存中院水,是數(shù)組的方式,可以指定多個緩存简十;
key:緩存數(shù)據(jù)使用的key檬某;可以用它來指定。默認是使用方法參數(shù)的值 1-方法的返回值
編寫SpEL螟蝙; #i d;參數(shù)id的值 #a0 #p0 #root.args[0]
getEmp[2]
keyGenerator:key的生成器恢恼;可以自己指定key的生成器的組件id
key/keyGenerator:二選一使用;
cacheManager:指定緩存管理器;或者cacheResolver指定獲取解析器
condition:指定符合條件的情況下才緩存胰默;
,condition = "#id>0"
condition = "#a0>1":第一個參數(shù)的值》1的時候才進行緩存
unless:否定緩存场斑;當unless指定的條件為true漓踢,方法的返回值就不會被緩存;可以獲取到結(jié)果進行判斷
unless = "#result == null"
unless = "#a0==2":如果第一個參數(shù)的值是2漏隐,結(jié)果不緩存喧半;
sync:是否使用異步模式