一、概述
SpringCache
本身是一個緩存體系的抽象實現,並沒有具體的緩存能力,要使用SpringCache
還需要配合具體的緩存實現來完成。
雖然如此,但是SpringCache是所有Spring支持的緩存結構的基礎
,而且所有的緩存的使用最後都要歸結於SpringCache。
二、緩存註解
SpringCache緩存功能的實現是依靠下面的這幾個註解完成的。
- @EnableCaching:開啓緩存功能
- @Cacheable:定義緩存,用於觸發緩存
- @CachePut:定義更新緩存,觸發緩存更新
- @CacheEvict:定義清除緩存,觸發緩存清除
- @Caching:組合定義多種緩存功能
- @CacheConfig:定義公共設置,位於
class
之上
1、@CacheConfig
該註解標註於類
之上,用於配置該類中會用到的一些公共的緩存
相關配置。
@CacheConfig(cacheNames = “pers.liuchengyin.service.blogServiceImpl”)
cachNames
的值pers.liuchengyin.service.blogServiceImpl
就是這個類公共的緩存對象
,就相當於一個名爲pers.liuchengyin.service.blogServiceImpl
的Map
對象,下文簡稱對象
2、@Cacheable
用在查詢的方法
上,方法的返回值將被加入緩存
。該註解標註的方法每次被調用前都會觸發緩存校驗
,校驗指定參數的緩存
是否已存在(已發生過相同參數的調用),若存在,直接返回緩存結果,否則執行方法內容,最後將方法執行結果保存到緩存中。
該註解有這些參數:value
、cacheNames
、key
、condition
、unless
、keyGenerator
、cacheManager
、cacheResolver
①value
、cacheNames
是兩個同等的參數。cacheNames是Spring4新增的,作爲value
的別名,用於指定緩存對象
,不是必須指定的。如果不指定則使用類
上面配置的CacheConfig
配置的cacheNames
。
②key
就是緩存對象存儲在Map
集合中的key
值,不是必需,缺省
按照方法的所有參數
組合作 爲key
值, 可以自己配置,但需要SpEL
表達式。比如
@Cacheable(key = "#p0") // 表示第一個參數作爲緩存的key值
getBlog(Integer id, String name){}
@Cacheable(key = "#id") // 也可以用參數名作爲緩存的key值,這裏的參數是id
getBlog(Integer id, String name){}
@Cacheable(key = "#user.id") // 甚至可以用對象裏的某個屬性作爲key值
getBlog(Integer id, User user){}
③condition
緩存對象的條件,非必需,也需使用SpEL
表達式,只有滿足表達式條件的內容纔會被緩存。比如
@Cacheable(key = "#p0",condition = "#username.lenth < 3")
getBlog(Integer id, String username){} // 只有第二個參數長度小於3的時候才緩存進去
④unless
與condition
相似,但unless
是方法被調用之後才做判斷的,所以可以對結果result
進行判斷是否去緩存。
⑤keyGenerator
用於指定key 生成器
,非必需。
若需要指定一個自定義的key生成器,我們需要去實現 org.springframework.cache.interceptor.KeyGenerator
接口,並使用該參數來指定
⑥cacheManager
用於指定使用哪個緩存管理器
,非必需。只有當有多個緩存管理器時才需要使用。
⑦cacheResolver
用於指定使用那個緩存解析器
,非必需。需通過 org.springframework.cache.interceptor.CacheResolver
接口來實現自己的緩存解析器,並用該參數指定。
3、@CachePut
用於更新緩存
,無論結果
是否已經緩存,都會在方法執行結束插入緩存,相當於更新緩存,一般用於更新方法
和新增方法
之上。其參數與@Cacheable
類似。
4、@CacheEvict
配置於方法上,通常用在刪除
方法上,用來從緩存中移除相應數據。 除了同@Cacheable
一樣的參數之外,它還有下面兩個參數:
①allEntries
,非必需,默認爲false
。當爲true
時,會移除對應緩存對象的所有緩存數據,也就是移除cacheName
或value
指定的對象的緩存數據。
②beforeInvocation
,非必需, 默認爲false
,會在調用方法之後
移除數據。 當爲 true
時,會在調用方法之前
移除數據。
5、總結
一般來說,我們都在Service
實現層的類上面使用@CacheConfig
來指定公共緩存配置,在查詢
的方法上使用@Cacheable
,在新增/修改
的方法上使用@CachePut
,在刪除
的方法上使用@CacheEvict
。