Spring Cache緩存框架


一、序言

Spring Cache是Spring體系下標准化緩存框架。Spring Cache有如下優勢:

  • 緩存品種多

支持緩存品種多,常見緩存RedisEhCacheCaffeine均支持。它們之間既能獨立使用,也能組合使用。

  • 平滑遷移

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值已有緩存,不執行方法體,直接返回數據。

參數keyGeneratorkey是互斥的,當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值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM