一、序言 Spring Cache是Spring體系下標準化緩存框架。Spring Cache有如下優勢: 緩存品種多 支持緩存品種多,常見緩存Redis、EhCache、Caffeine均支持。它們之間既能獨立使用,也能組合使用。 平滑遷移 Spring內部支持的緩存,可實現無縫平滑遷移,無需修改 ...
一、序言
Spring Cache是Spring體系下標準化緩存框架。Spring Cache有如下優勢:
- 緩存品種多
支持緩存品種多,常見緩存Redis、EhCache、Caffeine均支持。它們之間既能獨立使用,也能組合使用。
- 平滑遷移
Spring內部支持的緩存,可實現無縫平滑遷移,無需修改業務邏輯。註解緩存的實現依賴於動態代理。
大多數情況下使用的是註解版、少數情況下也能使用編程版。註解版與業務代碼高度解藕,因其依托動態代理技術實現,使用場景上有一定的限制。編程版嵌入業務代碼,代碼順序執行,無前置使用條件。
二、基本概念
(一)核心概念
一個應用可以有多個緩存管理器,每個緩存管理器可以有多個緩存,每個緩存可以存儲多條記錄。
1、緩存管理器
緩存的存儲介質不同、緩存連接不同的資料庫、緩存值序列化等由緩存管理器配置。緩存管理器有主次之分,預設情況下使用主(首要)緩存管理器。
當服務內只有一個CacheManager時,預設使用此緩存管理器;當超過一個緩存管理器時,需要使用Primary
註解指定預設緩存管理器。
2、緩存
Cache是一組配置相同緩存的集合,可以理解為命名空間,Spring Cache體系下的緩存生命時間是以Cache為單位的,不支持以Key為單位設置生存時間。不同的業務對應不同的緩存配置,應在緩存處予以區分。
CacheName應具有顯著的業務區分度以及過期時間區分度,並且以全局常量的方式提供,採取集中化管理的方式,禁止採用魔術變數的方式指定CacheName。
(二)補充內容
一般來說緩存的Key與Value均是String類型,特別是Value通常序列化成JSON串。
三、註解版
用於基於註解的方式來管理緩存數據。註解緩存有如下優勢:
- 高度解藕
使用註解來實現緩存,與業務高度解藕。
- 靈活管理
通過全局配置,不修改緩存邏輯,可實現如下效果:
開發環境下,可禁用緩存,將流量打入資料庫,儘早的暴露可能存在的性能瓶頸;測試環境開啟緩存,進行壓力測試等。
(一)動態代理
Spring Cache緩存註解版的原理以及緩存配置失敗的典型案例。
1、CGLib動態代理
緩存的實現底層技術支持是CGLib動態代理,在目標方法調用前、後分別追加相應的緩存操作,以達到添加緩存、更新緩存、刪除緩存的操作。
如果註解緩存配置未生效,檢查目標調用方法是否被動態代理。
2、配置失效
配置失效是指儘管配置了緩存註解,但緩存仍然未生效。
- final類與final方法
final類與final方法不滿足CGLib動態代理的條件,因此緩存配置會失效。
- 內部調用
使用依賴註入的方式調用配置緩存的方法生效,方法間內部調用不生效。
- 非public方法
非public方法配置緩存不生效。
(二)常用註解
1、配置註解
(1)EnableCaching
標註於SpringBoot應用啟動類上,添加此註解表示開啟Spring Cache緩存;移除表示關閉緩存。如果在全局配置文件中添加如下配置,即使在啟動類上標註EnableCaching註解,Spring Cache緩存然後是關閉狀態。
spring:
cache:
type: none
如果應用中自定義獨立於Spring容器的緩存,則不受此配置影響。
(2)CacheConfig
標註於類上,更具體的說是標註於業務服務類上。統一配置如下參數信息:
參數 | 含義 | 使用說明 |
---|---|---|
cacheManager |
緩存管理器 | 預設指首要的CacheManager |
cacheNames |
緩存名 | |
keyGenerator |
key值生成器 |
在類上統一進行配置,類下的方法自動繼承相應的配置。
2、緩存註解
(1)Cacheable
添加緩存的核心註解,分兩種情況:一是對應key值未有緩存數據,先執行方法,然後根據condition和unless條件決定是否添加緩存;二是對應key值已有緩存,不執行方法體,直接返回數據。
參數keyGenerator
與key
是互斥的,當key
存在時keyGenerator
配置自動失效。
- 基礎參數
參數 | 含義 | 使用說明 |
---|---|---|
cacheManager |
緩存管理器 | 預設指首要的CacheManager |
cacheNames |
緩存名 | |
keyGenerator |
key值生成器 | |
key |
key值 |
- 高級參數
參數 | 含義 | 預設值 | 使用說明 |
---|---|---|---|
condition |
緩存條件 | 指示滿足條件方執行緩存操作,一般使用參數作為條件 | |
unless |
否定緩存 | 當條件為 true ,方法的返回值不會被緩存 | |
sync |
同步狀態 | false | 表示將方法執行結果以何種方式存入緩存 |
(2)CachePut
更新緩存註解。不管對應key值是否有緩存數據,都執行。
- 基礎參數
參數 | 含義 | 使用說明 |
---|---|---|
cacheManager |
緩存管理器 | 預設指首要的CacheManager |
cacheNames |
緩存名 | |
keyGenerator |
key值生成器 | |
key |
key值 |
- 高級參數
參數 | 含義 | 使用說明 |
---|---|---|
condition |
緩存條件 | 指示滿足條件方執行緩存操作,一般使用參數作為條件 |
unless |
否定緩存 | 當條件為 true ,方法的返回值不會被緩存 |
(3)CacheEvict
主動清除緩存註解。
- 基礎參數
參數 | 含義 | 使用說明 |
---|---|---|
cacheManager |
緩存管理器 | 預設指首要的CacheManager |
cacheNames |
緩存名 | |
keyGenerator |
key值生成器 | |
key |
key值 |
- 高級參數
參數 | 含義 | 預設值 | 使用說明 |
---|---|---|---|
condition |
緩存條件 | 指示滿足條件方執行緩存操作,一般使用參數作為條件 | |
allEntries |
所有緩存 | false | 表示是否清空當前CacheName對應的所有緩存 |
beforeInvocation |
調用前 | false | 表示是否在方法調用前清空緩存 |
3、KeyGenerator
預設情況下使用SimpleKeyGenerator鍵值生成器,當不指定key值時,根據生成器規則,將方法參數轉化為緩存Key值。
喜歡本文就【♥️推薦♥️】一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題博客,視頻講解在B站。