第四篇:SpringBoot中Cache快取的使用
一、Cache快取的作用
隨著時間的積累,應用的使用使用者不斷增加,資料規模也越來越大,往往資料庫查詢操作會成為影響使用者使用體驗的瓶頸,此時使用快取往往是解決這一問題非常好的手段之一。Spring 3開始提供了強大的基於註解的快取支援,可以通過註解配置方式低侵入的給原有Spring應用增加快取功能,提高資料訪問效能。在Spring Boot中對於快取的支援,提供了一系列的自動化配置,使我們可以非常方便的使用快取。
1.JSR107
Java Caching定義了5個核心介面,分別是CachingProvider, CacheManager, Cache, Entry 和 Expiry。
示意圖
- CachingProvider定義了建立、配置、獲取、管理和控制多個CacheManager。一個應用可 以在執行期訪問多個CachingProvider。
- CacheManager定義了建立、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache 存在於CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有。
- Cache是一個類似Map的資料結構並臨時儲存以Key為索引的值。一個Cache僅被一個 CacheManager所擁有。
- Entry是一個儲存在Cache中的key-value對。
- Expiry 每一個儲存在Cache中的條目有一個定義的有效期。一旦超過這個時間,條目為過期 的狀態。一旦過期,條目將不可訪問、更新和刪除。快取有效期可以通過ExpiryPolicy設定。
2.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 |
保證方法被呼叫,又希望結果被快取。 |
@EnableCaching |
開啟基於註解的快取 |
keyGenerator |
快取資料時key生成策略 |
serialize | 快取資料時value序列化策略 |
value |
快取的名稱,在 spring 配置檔案中定義,必須指定 至少一個 |
例如: @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”} |
key |
快取的 key,可以為空,如果指定要按照 SpEL 表達 式編寫,如果不指定,則預設按照方法的所有引數 進行組合 |
例如: @Cacheable(value=”testcache”,key=”#userName” |
condition |
快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取/清除快取,在 呼叫方法之前之後都能判斷 |
例如: @Cacheable(value=”testcache”,condition=”#userNam e.length()>2”) |
allEntries (@CacheEvict ) |
是否清空所有快取內容,預設為 false,如果指定為 true,則方法呼叫後將立即清空所有快取 |
例如:@CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation (@CacheEvict) |
是否在方法執行前就清空,預設為 false,如果指定 為 true,則在方法還沒有執行的時候就清空快取, 預設情況下,如果方法執行丟擲異常,則不會清空 快取 |
例如:@CachEvict(value=”testcache”, beforeInvocation=true) |
unless (@CachePut) (@Cacheable) | 用於否決快取的,不像condition,該表示式只在方 法執行之後判斷,此時可以拿到返回值result進行判 斷。條件為true不會快取,fasle才快取 | 例如:@Cacheable(value=”testcache”,unless=”#result == null”) |