spring框架中的本地緩存:spring cache基本使用

基本概念及原理

處理邏輯

Spring Cache 是 Spring 提供的一整套的緩存解決方案

雖然它本身并沒有提供緩存的實現,但是它提供了一整套的接口和代碼規范、配置、注解等,這樣它就可以整合各種緩存方案了

處理邏輯:每次調用某方法,而此方法又是帶有緩存功能時,Spring 框架就會檢查指定參數的那個方法是否已經被調用過,如果之前調用過,就從緩存中取之前調用的結果;如果沒有調用過,則再調用一次這個方法,并緩存結果,然后再返回結果,那下次調用這個方法時,就可以直接從緩存中獲取結果了

實現步驟

SpringCache實現步驟 :

  1. 啟用緩存 :通過 @EnableCaching 注解觸發 Spring 的緩存代理配置
  2. AOP 攔截 :Spring 為標記注解的方法生成代理對象,在方法調用前后插入緩存操作。
  3. 緩存處理 :根據注解配置,調用 CacheManager 獲取 Cache 實例,執行讀寫或刪除操作。

核心原理

Spring Cache 的核心原理基于 AOP(面向切面編程) 和 緩存抽象 ,通過注解簡化緩存邏輯的集成。

核心是 緩存抽象層 和 動態代理機制 ,結合 Spring Boot 的自動配置,可快速集成多種緩存方案,顯著提升系統性能

Spring Cache 通過 抽象層 解耦具體緩存技術

  • 適配器模式 :通過 CacheManager 和 Cache 接口適配不同緩存實現(如 Redis、Ehcache)。
  • 自動配置 :Spring Boot 的 spring-boot-autoconfigure 模塊自動檢測并配置緩存實現(如引入 spring-boot-starter-data-redis 后自動啟用 Redis 緩存)。

核心組件與抽象

Cache 接口 :定義緩存操作(如 get、put、evict),具體實現由第三方緩存技術(如 Redis、Caffeine)提供。

CacheManager 接口 :管理多個 Cache 實例,負責創建、配置和獲取緩存對象

例如:

  • ConcurrentMapCacheManager(默認內存緩存)
  • RedisCacheManager(Redis 實現)
  • EhCacheCacheManager(Ehcache 實現)

核心注解

Spring 提供了五個注解來聲明緩存規則。

  • @Cacheable:方法執行前檢查緩存,命中則直接返回,否則執行方法并緩存結果
  • @CachePut:方法調用前不會去緩存中查找,無論緩存是否存在,都執行方法并更新緩存
  • @CacheEvict:刪除指定緩存,清除緩存中的一條或多條記錄
  • @Caching:組合多個緩存操作
  • @CacheConfig:在類級別共享相同的緩存的配置
注解作用常用參數
@Cacheable方法結果緩存(先查緩存,未命中執行方法),一般用在查詢方法上value, key, condition
@CachePut強制更新緩存(始終執行方法),一般用在新增方法上value, key, unless
@CacheEvict清除緩存,一般用在更新或者刪除方法上value, key, allEntries
@Caching組合多個緩存操作,實現同一個方法上同時使用多種注解cacheable, put, evict
@CacheConfig類級別共享緩存配置cacheNames, keyGenerator

SpEL 表達式

場景表達式示例
防緩存穿透unless = “#result == null”
多字段復合鍵key = “#user.id + ‘:’ + #user.deviceId”
時間戳動態鍵key = “T(System).currentTimeMillis()”
權限過濾condition = “#authLevel > 3”
集合非空判斷condition = “!#list.isEmpty()”

還有許多其他的表達式,待使用時再去專門查詢吧

實現

pom依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

選擇使用的緩存

# 使用redis進行緩存
spring.cache.type=redis

Spring Cache 支持很多緩存中間件作為框架中的緩存,總共有 9 種選擇:

  • caffeine:Caffeine 是一種高性能的緩存庫,基于 Google Guava。
  • couchbase:CouchBase是一款非關系型JSON文檔數據庫。
  • generic:由泛型機制和 static 組合實現的泛型緩存機制。
  • hazelcast:一個高度可擴展的數據分發和集群平臺,可用于實現分布式數據存儲、數據緩存。
  • infinispan:分布式的集群緩存系統。
  • jcache:JCache 作為緩存。它是 JSR107 規范中提到的緩存規范。
  • none:沒有緩存。
  • redis:用 Redis 作為緩存
  • simple:用內存作為緩存

測試緩存

基本概念

啟動類上面添加@EnableCaching注解

指定某方法開啟緩存功能。在方法上添加 @Cacheable 緩存注解就可以了

@Cacheable 注解中,可以添加四種參數:value,key,condition,unless

  • value:指定緩存名稱(必填)
  • key:自定義緩存鍵(SpEL表達式)
  • condition:執行前條件判斷(SpEL)
  • unless:執行后結果過濾(SpEL)
參數類型作用示例
valueString[]指定緩存名稱(必填)value = “users” 或 value = {“cache1”, “cache2”}
keyString自定義緩存鍵(SpEL表達式)key = "#userId"或key = “T(java.util.UUID).randomUUID().toString()”
conditionString執行前條件判斷(SpEL)condition = "#userId > 1000"或condition = “#name.startsWith(‘admin’)”
unlessString執行后結果過濾(SpEL)unless = "#result == null"或unless = “#result.age < 18”

使用示例1

第一次調用下面這個接口前,緩存里面是沒有hot緩存,也沒有這個test方法的結果緩存

調用test方法后,緩存中便會創建出hot這個緩存,其中緩存了一個key(默認值SimpleKey[]),其中有一個值

  • 緩存中 key 對應的 value 默認使用 JDK 序列化后的數據。
  • value 的過期時間為 -1,表示永不過期。

key:hot:SimpleKey[]
value:222

@RequestMapping("/test2")
@Cacheable({"hot"})
public int test() {return 222;
}

第二次調用test()方法時,便會直接讀緩存,而不去執行test里面的方法

@RequestMapping("/test2")
@Cacheable({"hot"})
public int test2() {return 456;
}

如果再將類名改為test2后,緩存獲取到的值還是test方法時緩存的值222,因為兩個方法的key值都是SimpleKey[]

使用示例2

// 啟用緩存(配置類)
@EnableCaching
@Configuration
public class CacheConfig {@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("users"); // 內存緩存}
}// 業務層使用
@Service
public class UserService {// 緩存讀取(value=緩存名稱,key=緩存鍵)@Cacheable(value = "users", key = "#userId")public User getUserById(Long userId) {// 實際數據庫查詢return userRepository.findById(userId);}// 緩存更新@CachePut(value = "users", key = "#user.id")public User updateUser(User user) {return userRepository.save(user);}// 緩存清除@CacheEvict(value = "users", key = "#userId")public void deleteUser(Long userId) {userRepository.deleteById(userId);}
}

自定義配置類

自定義緩存過去時間等

# 使用 Redis 作為緩存組件
spring.cache.type=redis
# 緩存過期時間為 3600s
spring.cache.redis.time-to-live=3600000
# 緩存的鍵的名字前綴
spring.cache.redis.key-prefix=passjava_
# 是否使用緩存前綴
spring.cache.redis.use-key-prefix=true
# 是否緩存控制,防止緩存穿透
spring.cache.redis.cache-null-values=true

自定義 key

在 @Cacheable 注解里面加上 key 的值 #root.method.name。這是一種特有的表達式,稱作 SpEL 表達式,這里代表用方法名作為緩存 key 的名字

@Cacheable(value = {"hot"}, key = "#root.method.name")

如果按上述去配置的話,緩存的key的名稱便是這個方法名

自定義條件

可以自定義條件來決定是否將緩存功能關閉。這里就要用到@Cacheable 另外兩個屬性:condition 和 unless,它倆的格式還是用 SpEL 表達式

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81717.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81717.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81717.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI大模型學習二十四、實踐QEMU-KVM 虛擬化:ubuntu server 25.04 下云鏡像創建Ubuntu 虛擬機

一、說明 雖然說大部分的場合&#xff0c;docker都能解決問題&#xff0c;但是有些大型的軟件安裝時如果修改配置會很麻煩&#xff0c;比方說前面遇到的code-server和dify 默認都是80和443端口要使用&#xff0c;安裝在一起就會端口沖突&#xff0c;通過該端口來解決問題&#…

安卓中0dp和match_parent區別

安卓中的 0dp 和 match_parent 的區別&#xff1f; 第一章 前言 有段時間&#xff0c;看到同事在編寫代碼的時候&#xff0c;寫到的是 0dp 有時候自己寫代碼的時候&#xff0c;編寫的是 match_parent 發現有時候效果很類似。 后來通過一個需求案例&#xff0c;才發現兩者有著…

二十、案例特訓專題3【系統設計篇】web架構設計

一、前言 二、內容提要 三、單機到應用與數據分離 四、集群與負載均衡 五、集群與有狀態無狀態服務 六、ORM 七、數據庫讀寫分離 八、數據庫緩存Memcache與Redis 九、Redis數據分片 哈希分片如果新增分片會很麻煩&#xff0c;需要把之前數據取出來再哈希除模 一致性哈希分片是…

基于Rust語言的Rocket框架和Sqlx庫開發WebAPI項目記錄(一)

前置說明 開發語言&#xff1a;Rust Web框架&#xff1a;Rocket 數據庫&#xff1a;PostgreSQL 開發步驟 新建項目&#xff1a; cargo new projectname 在Cargo.toml文件里配置如下依賴&#xff1a; [dependencies] rocket {version"0.5.0",features["json&qu…

中國城市間交通駕車距離矩陣(2024)

中國城市間交通駕車距離矩陣(2024) 1852 數據簡介 中國城市中心的交通駕車距離&#xff0c;該數據為通過審圖號GS(2024)0650的中國城市地圖得其城市中心距離&#xff0c;再通過高德地圖api計算得出其交通駕車最短距離矩陣&#xff0c;單位為KM&#xff0c;方便大家研究使用。…

MySQL替換瀚高數據庫報錯: TO_DAYS()不存在(APP)

文章目錄 環境癥狀問題原因解決方案報錯編碼 環境 系統平臺&#xff1a;中標麒麟&#xff08;海光&#xff09;7,中標麒麟&#xff08;飛騰&#xff09;7 版本&#xff1a;4.5 癥狀 MySQL替換為瀚高數據庫進行應用系統適配報錯&#xff1a;TO_DAYS&#xff08;&#xff09;不…

驅動-Linux定時-timer_list

了解內核定時相關基礎知識 文章目錄 簡要介紹timer_list 特點API 函數實驗測試程序 - timer_mod.c編譯文件-Makefile實驗驗證 注意事項總結 簡要介紹 硬件為內核提供了一個系統定時器來計算流逝的時間&#xff08;即基于未來時間點的計時方式&#xff0c; 以當前時刻為計時開始…

計算機網絡概要

?絡相關基礎知識 協議 兩設備之間使?光電信號傳輸信息數據 要想傳遞不同信息 那么?者?就需要約定好的數據格式 層 封裝 繼承 多態是計算機的性質 它們?持了軟硬件分層的實現 同層協議可以?接通信 同層協議?不直接通信 是各?調?下層提供的結構能?完成通信 分層…

QT 使用QPdfWriter和QPainter繪制PDF文件

QT如何生產pdf文件&#xff0c;網上有許多文章介紹&#xff0c;我也是看了網上的文章&#xff0c;看他們的代碼&#xff0c;自己琢磨琢磨&#xff0c;才有了本編博客&#xff1b; 其他什么就不詳細說了&#xff0c;本篇博客介紹的QPdfWriter和QPainter繪制PDF文件&#xff1b;…

企業標準信息公共服務平臺已開放標準通編輯器訪問入口

標準通 數字化標準編輯器 專業、高效、便捷 企業標準信息公共服務平臺 近日&#xff0c;企業標準信息公共服務平臺已開放標準通編輯器訪問入口&#xff0c;可進入官網指定版塊使用&#xff01; 核心功能亮點 解決企業痛點 傳統標準編制&#xff0c;需反復核對格式、逐條…

【Hadoop】--HA高可用搭建--3.2.2

修改環境配置文件 hadoop-env.sh # 在文件末尾添加以下內容&#xff1a; # java_home記得修改 export JAVA_HOME/usr/java/jdk1.8.0xxxx export HDFS_NAMENODE_USERroot export HDFS_DATANODE_USERroot export HDFS_ZKFC_USERroot export HDFS_JOURNALNODE_USERroot export YA…

【skywalking】index“:“skywalking_metrics-all“},“status“:404}

skywalking 啟動報錯 java.lang.RuntimeException: {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [skywalking_metrics-all]","resource.t ype":"inde…

【Android】從垂直同步到屏幕刷新機制(一)

【Android】從垂直同步到屏幕刷新機制 本文參考以及部分圖片來源&#xff1a; 垂直同步_小科普&#xff1a;“垂直同步”究竟是什么&#xff1f;-CSDN博客 “終于懂了” 系列&#xff1a;Android屏幕刷新機制—VSync、Choreographer 全面理解&#xff01;-騰訊云開發者社區-騰訊…

ACL完全解析:從權限管理到網絡安全的核心防線

訪問控制列表&#xff08;ACL&#xff09;是一種用于管理資源訪問權限的核心安全機制&#xff0c;廣泛應用于操作系統和網絡設備中。以下是對ACL的詳細解析&#xff1a; 1. 基本概念 定義&#xff1a;ACL是由多個訪問控制條目&#xff08;ACE&#xff09;組成的列表&#xff0…

代碼審計-php框架開發,實戰tp項目,打擊微交易,源碼獲取,擴大戰果

實戰&#xff0c;不安全寫法引發的注入 這個bc靶場源碼沒有&#xff0c;看老師演示 打開很明顯的tp框架源碼 拿到tp框架之后第一步&#xff0c;搜索版本信息5.0.5 兩個思路 1.代碼的不安全寫法 2.版本自身存在的漏洞 全局搜索where看看也沒有不安全的 哎&#xff1f;&…

大模型的實踐應用43-基于Qwen3(32B)+LangChain框架+MCP+RAG+傳統算法的旅游行程規劃系統

大家好,我是微學AI,今天給大家介紹一下大模型的實踐應用43-基于Qwen3(32B)+LangChain框架+MCP+RAG+傳統算法的旅游行程規劃系統。本報告將闡述基于大模型Qwen3(32B)、LangChain框架、MCP協議、RAG技術以及傳統算法構建的智能旅游行程規劃系統。該系統通過整合多種技術優勢,實…

Jsoup庫和Apache HttpClient庫有什么區別?

Jsoup 和 Apache HttpClient 是兩個功能不同的庫&#xff0c;它們在 Java 開發中被廣泛使用&#xff0c;但用途和功能有明顯的區別&#xff1a; Jsoup 用途&#xff1a;Jsoup 是一個用于解析 HTML 文檔的庫。它提供了非常方便的方法來抓取和解析網頁內容&#xff0c;提取和操作…

騰訊云存儲原理

我們來詳細展開你提到的兩個核心結構概念&#xff1a; 一、“基于分布式文件系統 對象存儲技術” 是什么&#xff1f; 1. 分布式文件系統&#xff08;DFS&#xff09;基礎 分布式文件系統是一種支持將數據分布在多個存儲節點上、并對上層用戶透明的文件系統。騰訊云COS雖然是…

python fastapi + react, 寫一個圖片 app

1. 起因&#xff0c; 目的: 上廁所的時候&#xff0c;想用手機查看電腦上的圖片&#xff0c;但是又不想點擊下載。此app 應運而生。 2. 先看效果 單擊圖片&#xff0c;能放大圖片 3. 過程: 過程很枯燥。有時候&#xff0c; 有一堆新的想法。 但是做起來太麻煩&#xff0c;…

Kubernetes控制平面組件:Kubelet詳解(五):切換docker運行時為containerd

云原生學習路線導航頁&#xff08;持續更新中&#xff09; kubernetes學習系列快捷鏈接 Kubernetes架構原則和對象設計&#xff08;一&#xff09;Kubernetes架構原則和對象設計&#xff08;二&#xff09;Kubernetes架構原則和對象設計&#xff08;三&#xff09;Kubernetes控…