Spring Boot系列——cache緩存——1.概念瞭解

參考 https://www.cnblogs.com/yueshutong/p/9381540.html

一:Spring緩存抽象

Spring從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口來統一不同的緩存技術;並支持使用JCache(JSR-107)註解簡化我們開發;

  • Cache接口爲緩存的組件規範定義,包含緩存的各種操作集合;

  • Cache接口下Spring提供了各種xxxCache的實現;如RedisCache,EhCacheCache ,ConcurrentMapCache等;

  • 每次調用需要緩存功能的方法時,Spring會檢查檢查指定參數的指定的目標方法是否已經被調用過;如果有就直接從緩存中獲取方法調用後的結果,如果沒有就調用方法並緩存結果後返回給用戶。下次調用直接從緩存中獲取。

  • 使用Spring緩存抽象時我們需要關注以下兩點;

    1、確定方法需要被緩存以及他們的緩存策略

    2、從緩存中讀取之前緩存存儲的數據

二:幾個重要概念&緩存註解

名稱 解釋
Cache 緩存接口,定義緩存操作。實現有:RedisCache、EhCacheCache、ConcurrentMapCache等
CacheManager 緩存管理器,管理各種緩存(cache)組件
@Cacheable 主要針對方法配置,能夠根據方法的請求參數對其進行緩存
@CacheEvict 清空緩存
@CachePut 保證方法被調用,又希望結果被緩存。
與@Cacheable區別在於是否每次都調用方法,常用於更新
@EnableCaching 開啓基於註解的緩存
keyGenerator 緩存數據時key生成策略
serialize 緩存數據時value序列化策略
@CacheConfig 統一配置本類的緩存註解的屬性

@Cacheable/@CachePut/@CacheEvict 主要的參數

名稱 解釋
value 緩存的名稱,在 spring 配置文件中定義,必須指定至少一個
例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 緩存的 key,可以爲空,如果指定要按照 SpEL 表達式編寫,
如果不指定,則缺省按照方法的所有參數進行組合
例如:
@Cacheable(value=”testcache”,key=”#id”)
condition 緩存的條件,可以爲空,使用 SpEL 編寫,返回 true 或者 false,
只有爲 true 才進行緩存/清除緩存
例如:@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
unless 否定緩存。當條件結果爲TRUE時,就不會緩存。
@Cacheable(value=”testcache”,unless=”#userName.length()>2”)
allEntries
(@CacheEvict )
是否清空所有緩存內容,缺省爲 false,如果指定爲 true,
則方法調用後將立即清空所有緩存
例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation
(@CacheEvict)
是否在方法執行前就清空,缺省爲 false,如果指定爲 true,
則在方法還沒有執行的時候就清空緩存,缺省情況下,如果方法
執行拋出異常,則不會清空緩存
例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

 

三:SpEL上下文數據

Spring Cache提供了一些供我們使用的SpEL上下文數據,下表直接摘自Spring官方文檔:

名稱 位置 描述 示例
methodName root對象 當前被調用的方法名 #root.methodname
method root對象 當前被調用的方法 #root.method.name
target root對象 當前被調用的目標對象實例 #root.target
targetClass root對象 當前被調用的目標對象的類 #root.targetClass
args root對象 當前被調用的方法的參數列表 #root.args[0]
caches root對象 當前方法調用使用的緩存列表 #root.caches[0].name
Argument Name 執行上下文 當前被調用的方法的參數,如findArtisan(Artisan artisan),可以通過#artsian.id獲得參數 #artsian.id
result 執行上下文 方法執行後的返回值(僅當方法執行後的判斷有效,如 unless cacheEvict的beforeInvocation=false) #result

注意:

1.當我們要使用root對象的屬性作爲key時我們也可以將“#root”省略,因爲Spring默認使用的就是root對象的屬性。 如

@Cacheable(key = "targetClass + methodName +#p0")

2.使用方法參數時我們可以直接使用“#參數名”或者“#p參數index”。 如:

@Cacheable(value="users", key="#id")

@Cacheable(value="users", key="#p0")

SpEL提供了多種運算符

類型 運算符
關係 <,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne
算術 +,- ,* ,/,%,^
邏輯 &&,||,!,and,or,not,between,instanceof
條件 ?: (ternary),?: (elvis)
正則表達式 matches
其他類型 ?.,?[…],![…],^[…],$[…]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章