1.快速體驗緩存
1)開啓基於註解的緩存 @EnableCaching
2) 開啓緩存註解即可
@Cacheable
@CacheEvict
@CachePut
2. @Cacheable初體驗
CacheManager管理多個Cache組件的,對緩存的真正CRUD操作在Cache組件中,每一個緩存組件有自己唯一一個名字;
幾個屬性:
cacheNames/value: 指定緩存組件的名字;將方法的返回結果放在哪個緩存中,是數組的方式;可以指定多個緩存;
key :緩存數據使用的key可以用它來指定;默認是使用方法參數的值 方法的返回值
編寫SpEL #id;參數id的值 #a0 #p0 #root.args[0]
keyGenerator: key的生成器;可以自己指定key的生成器的組件id
key/keyGenerator ; 二選一使用
cacheManager: 指定緩存管理器;或者cacheResolver指定獲取解析器
condition: 指定符合條件的情況下才緩存;
condition = "#a0>1":第一個參數的值>1的時候才進行緩存
unless:否定緩存;當unless指定的條件爲true,方法的返回值就不會被緩存;
unless="#result==null"
sync: 是否使用異步模式
3.運行流程:
@Cacheable:
1) 方法運行之前,先去查詢Cache(緩存組件) ,按照cacheNames指定的名字獲取;
(CacheManager先獲取相應的緩存),第一次獲取緩存如果沒有Cache組件會自動創建。
2)去Cache中查找緩存的內容,使用一個key ,默認就是方法的參數
key是按照某種策略生成的,默認是使用keyGenerator生成的, 默認使用SimpleKeyGenerator生成key
SimpleKeyGenerator生成key的默認策略:
如果沒有參數: key=new SimpleKey();
如果有一個參數: key=參數的值
如果有多個參數:key=new SimpleKey(params)
3)沒有查到緩存就調用目標方法;
4)將目標方法返回的結果,放進緩存中
@Cacheable標註的方法執行之前先來檢查緩存中有沒有這個數據,默認按照參數的值作爲key去查詢緩存
如果沒有就運行方法並將結果放入緩存;以後再來調用就可以直接使用緩存中的數據;
核心: 1)使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】組件
2)key使用keyGenerator生成的, 默認使用SimpleKeyGenerator生成key
4.@CachePut:既調用方法,又更新緩存數據;同步更新緩存;
修改了數據庫的某個數據,同時更新緩存;
運行時機:
1、先調用目標方法
2、將目標方法的結果緩存起來
3、@Cacheable的key是不能用#result,因爲它的運行時機是調用方法之前就要用key去查緩存
5.@CacheEvict :緩存清除
key: 指定要清除的數據
allEntries = true : 指定清除這個緩存中所有的數據
beforeInvocation = false 緩存的清除是否在方法之前執行,默認是在方法之後執行的
beforeInvocation = true 代表清除緩存是在方法運行之前執行,無論方法是否出現異常,緩存都清除
6. @Caching: 定義複雜的緩存規則
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "#lastName" )
},
put = {
@CachePut(value = "emp",key = "#result.id"),
@CachePut(value = "emp",key = "#result.email")
}
)
7.@CacheConfig(cacheNames="emp") //抽取緩存的公共配置
8. 整合redis :使用docker;
1) 引入redis的starter
2) 配置redis
3) 引入redis的starter,容器中保存的是RedisCacheManager,它幫我們創建RedisCache 來作爲緩存組件,RedisCache通過操作redis來緩存數據
4)利用StringRedisTemplate;操作k-v都是字符串的 或者RedisTemplate操作k-v都是對象的來操作redis的五大數據類型
5) 默認保存數據 k-v 都是Object;利用序列化保存,默認創建的 RedisCacheManager 操作redis的時候使用的是 RedisTemplate<Object,Object>,它默認使用jdk的序列化機制
6)可以通過自定義RedisTemplate來改變默認的序列化機制,譬如,採用json