深入理解 Spring Cache 及其核心注解

一、Spring Cache 概述?

Spring Cache 并不是一個具體的緩存實現方案,而是一套抽象的緩存規范。它支持多種緩存技術,如 Ehcache、Redis、Caffeine 等,開發者可以根據項目需求靈活選擇合適的緩存技術。其核心思想是通過在方法上添加注解,在方法調用前后自動完成緩存的操作,例如查詢數據時優先從緩存中獲取,數據更新時同步更新緩存,從而避免重復執行方法和數據庫查詢,提升系統性能和響應速度。?

Spring Cache 的工作流程大致如下:當被緩存注解標注的方法被調用時,Spring Cache 會先檢查緩存中是否存在對應的數據。如果存在,直接從緩存中返回數據,不再執行方法體;如果不存在,則執行方法體,獲取數據,并將數據存入緩存,以便下次使用。這種 “先查緩存,后執行方法” 的機制,大大減少了數據庫的負載和方法的執行次數。?

相關Maven坐標

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency>

二、@EnableCaching 注解?

@EnableCaching 是開啟 Spring Cache 功能的關鍵注解,通常被添加到 Spring Boot 項目的配置類上,用于啟用緩存功能。只有在配置類上添加了該注解,Spring 才會識別并處理其他緩存相關的注解。?

添加 @EnableCaching 注解后,Spring 會自動掃描項目中帶有緩存注解的方法,并在方法調用時,按照緩存規則進行相應的緩存操作。它就像是一把鑰匙,開啟了 Spring 框架中緩存功能的大門,讓開發者能夠使用各種緩存注解來簡化開發過程。?

三、@Cacheable 注解?

@Cacheable 是 Spring Cache 中最常用的注解之一,它主要用于標注查詢方法。當方法被標注 @Cacheable 后,Spring 在調用該方法時,會首先檢查指定的緩存中是否存在對應的數據。如果存在,直接從緩存中返回數據,不再執行方法體;如果不存在,則執行方法體獲取數據,并將數據存入緩存,以便后續使用。?

    @GetMapping//在方法執行前,先查詢緩存,若沒有執行方法,并且把數據放入緩存//若查到了,會去代理方法內執行,就不會執行原方法@Cacheable(cacheNames = "userCache",key = "#id")public User getById(Long id){User user = userMapper.getById(id);return user;}

在上述代碼中,@Cacheable 注解的 value 屬性指定了緩存的名稱(這里是 users),key 屬性定義了緩存的鍵(這里使用方法參數 id 作為鍵)。這意味著,每次調用 getUserById 方法時,Spring 會根據 id 值在 users 緩存中查找數據。如果找到,直接返回;找不到則執行方法從數據庫查詢,并將結果存入緩存。通過 @Cacheable 注解,我們可以輕松實現查詢方法的緩存功能,減少數據庫的壓力。?

四、@CachePut 注解?

@CachePut 注解用于更新緩存數據。與 @Cacheable 不同,@CachePut 無論緩存中是否存在數據,都會先執行方法體,獲取最新的數據,然后將數據更新到緩存中。這一特性使得 @CachePut 非常適合用于數據更新的場景,例如修改用戶信息后,及時將最新的用戶數據更新到緩存中。?

    @PostMapping//把方法的返回值放到緩存當中//key為userCache::user的id//這里方法開始執行時,user內并沒有id key也不會生成,等數據庫插入好數據,并且id賦值給User才//開始構造key 再把數據放入緩存中@CachePut(cacheNames = "userCache",key = "#user.id")
//    @CachePut(cacheNames = "userCache",key = "#result.id") //返回值的id
//    @CachePut(cacheNames = "userCache",key = "#p0.id") //第一個參數的id
//    @CachePut(cacheNames = "userCache",key = "#a0.id") //第一個參數的id
//    @CachePut(cacheNames = "userCache",key = "#root.args[0].id") //第一個參數的idpublic User save(@RequestBody User user){userMapper.insert(user);return user;}

在上述示例中,當調用 updateUser 方法更新用戶信息時,方法執行完成后,返回的最新用戶數據會被存入 users 緩存中,鍵為用戶的 id。這樣,后續查詢該用戶信息時,就能從緩存中獲取到最新的數據,保證了緩存數據與數據庫數據的一致性。?

五、@CacheEvict 注解?

@CacheEvict 注解用于從緩存中刪除數據。當方法被標注 @CacheEvict 后,在方法執行完成時,Spring 會根據注解配置,從指定的緩存中刪除相應的數據。它主要用于數據刪除、修改等導致緩存數據失效的場景,以確保緩存中不會存在過期或無效的數據。?

    @DeleteMapping//方法執行后,刪除指定緩存@CacheEvict(cacheNames = "userCache",key = "#id",beforeInvocation=true)public void deleteById(Long id){userMapper.deleteById(id);}@DeleteMapping("/delAll")//方法執行后,刪除在userCache下的全部緩存@CacheEvict(cacheNames = "userCache",allEntries = true,beforeInvocation=true)public void deleteAll(){userMapper.deleteAll();}

在上述代碼中,當調用 deleteUser 方法刪除用戶時,方法執行完成后,Spring 會從 users 緩存中刪除鍵為 id 的數據。此外,@CacheEvict 還支持一些其他屬性,如 allEntries = true,用于清空整個緩存;beforeInvocation = true,用于在方法執行前就刪除緩存,即使方法執行過程中拋出異常,緩存也會被刪除。

總結

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

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

相關文章

STM32H562----------串口通信(UART)

1、串口介紹 1.1、 數據通信概念 在單片機中我們常用的通信方式有 USART、IIC、SPI、CAN、USB 等; 1、數據通信方式 根據數據通信方式可分為串行通信和并行通信兩種,如下圖: 串行通信基本特征是數據逐位順序依次傳輸,優點:傳輸線少成本低,抗干擾能力強可用于遠距離傳…

20-Oracle 23 ai free Database Sharding-特性驗證

對于Oracle 23ai Sharding 新特性的驗證腳本&#xff0c;目標是涵蓋其核心改進和新增功能。基于 Oracle 23ai 的 Sharding 特性總結&#xff08;Raft 協議、True Cache、Vector等&#xff09;&#xff0c;結合常見場景驗證。 通過SQL腳本驗證這些特性。例如&#xff1a; 1.基于…

? 常用 Java HTTP 客戶端匯總及使用示例

在 Java 開發中,HTTP 客戶端是與服務端交互的關鍵組件。隨著技術發展,出現了多種 HTTP 客戶端庫,本文匯總了常用的 Java HTTP 客戶端,介紹其特點、適用場景,并附上簡單使用示例,方便開發者快速選擇和上手。 1.常用 HTTP 客戶端一覽 名稱簡介特點HttpClient(JDK 自帶)Ja…

MCP(Model Context Protocol)與提示詞撰寫

隨著大模型&#xff08;LLM&#xff09;在復雜任務中的普及&#xff0c;如何讓模型高效調用外部工具和數據成為關鍵挑戰。傳統函數調用&#xff08;Function Calling&#xff09;依賴開發者手動封裝 API&#xff0c;而 MCP&#xff08;Model Context Protocol&#xff09; 通過…

RootSIFT的目標定位,opencvsharp。

首先截取匹配模板&#xff0c;然后使用rootsift特征匹配&#xff0c;最后定位目標。 對于微弱變化&#xff0c;還是能夠識別定位的&#xff0c;對于傳統算法來說已經不錯了。 目標定位效果&#xff1a; 使用的模板圖片。 using OpenCvSharp; using OpenCvSharp.Features2D;u…

Appium如何支持ios真機測試

ios模擬器上UI自動化測試 以appiumwebdriverio為例&#xff0c;詳細介紹如何在模擬器上安裝和測試app。在使用ios模擬器前&#xff0c;需要安裝xcode&#xff0c;創建和啟動一個simulator。simulator創建好后&#xff0c;就可以使用xcrun simctl命令安裝被測應用并開始測試了。…

近幾年字節飛書測開部分面試題整理

文章目錄 一、面試問題1. 創建索引2. 攔截器&#xff08;Interceptor&#xff09;和過濾器&#xff08;Filter&#xff09;的區別3. 為什么jwt令牌代替session&#xff1f;4. 有一個100行的數據&#xff0c;和一個1萬行的數據&#xff0c;寫sql 的時候要注意什么&#xff1f;5.…

JDBC基礎關鍵_001_認識

目 錄 一、概述 二、原理 三、接口的作用 四、JDBC 模擬 1.JDBC 接口 2.驅動 3.配置文件 4.調用者 一、概述 JDBC&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;Java 數據庫連接&#xff1b;是用 Java 語言操作數據庫&#xff0c;使用 Java 語言向數…

SWAN(Scade One) 語言原理介紹

SCADE 團隊于2024年推出了下一代 SCADE 工具 Scade One&#xff0c;工具的建模語言也基于Scade 6 進行了演化。在語言命名方面&#xff0c;并沒有復用"Scade"這一標志性的名稱&#xff0c;而是使用了新的名字&#xff1a;Swan。在本篇中&#xff0c;將敘述 Swan 語言…

【工具教程】多個條形碼識別用條碼內容對圖片重命名,批量PDF條形碼識別后用條碼內容批量改名,使用教程及注意事項

一、條形碼識別改名使用教程 打開軟件并選擇處理模式&#xff1a;打開軟件后&#xff0c;根據要處理的文件類型&#xff0c;選擇 “圖片識別模式” 或 “PDF 識別模式”。如果是處理包含條形碼的 PDF 文件&#xff0c;就選擇 “PDF 識別模式”&#xff1b;若是處理圖片文件&…

sql中group by使用場景

GROUP BY語句在SQL中用于將多個記錄分組為較小的記錄集合&#xff0c;以便對每個組執行聚合函數&#xff0c;如COUNT(), MAX(), MIN(), SUM(), AVG()等。GROUP BY的使用場景非常廣泛&#xff0c;以下是一些典型的應用場景&#xff1a; 統計數量 當你想要計算某個字段的唯一值數…

MongoDB慢查詢臨時開啟方法講解

1、首先連接數據庫 mongosh "mongodb://localhost:27017" 2、選擇目標數據庫 show databases;#顯示所有數據庫 use lidb;#使用某數據庫 3、查看當前分析級別 db.getProfilingStatus() 輸出 { was: 0, slowms: 100, sampleRate: 1, ok: 1 } #was0表示關閉&…

UML活動圖與泳道圖

活動圖的作用&#xff0c;與用例圖類似&#xff0c;也是幫助我們捕獲用戶的需求。 活動圖主要是用來描述用戶的業務流程&#xff0c;如果能把用戶的這個業務流程描述的很清楚的話&#xff0c;就可以幫助我們做用例分析。 1 活動圖定義 活動圖描述了在一個過程中&#xff0c;…

算法練習-回溯

今天給大家帶來的是在dfs查用的降低復雜度的方法---剪枝 所謂減枝 第一題 代碼部分&#xff1a;&#xff08;未剪枝&#xff09; 代碼部分&#xff08;剪枝&#xff09; 第二題 代碼部分&#xff08;未剪枝&#xff09; 剪枝后 通過這些題目可以看出如果沒有進行剪枝操作&#…

Elasticsearch + Milvus 構建高效知識庫問答系統《一》

&#x1f50d; Elasticsearch Milvus 構建高效知識庫問答系統&#xff08;RAG 技術實戰&#xff09; &#x1f4cc; 目錄 背景介紹Elasticsearch 在知識庫檢索中的作用Milvus 在知識庫檢索中的作用混合檢索&#xff1a;Elasticsearch Milvus完整代碼實現部署建議與優化方向…

10萬QPS高并發請求,如何防止重復下單

1. 前端攔截 首先因為是10萬QPS的高并發請求&#xff0c;我們要保護好系統&#xff0c;那就是盡可能減少用戶無效請求。 1.1 按鈕置灰 很多用戶搶票、搶購、搶紅包等時候&#xff0c;為了提高搶中的概率&#xff0c;都是瘋狂點擊按鈕。會觸發多次請求&#xff0c;導致重復下…

基于單片機的病房呼叫系統(源碼+仿真)

該系統由以 STM32F4 為平臺的監控終端以及以 CC2530 為平臺的無線傳感網組成。系統上電后自動完成 ZigBee 網絡的組建、終端節點的加入&#xff0c;病人可利用便攜式的病人終端發出呼叫求助請求信息、節點在線信息以及對護士的服務評價信息等&#xff0c;這些信息通過路由節點發…

使用WebSocket實時獲取印度股票數據源(無調用次數限制)實戰

使用WebSocket實時獲取印度股票數據源&#xff08;無調用次數限制&#xff09;實戰 一、前置準備 1. 獲取API密鑰 登錄 StockTV開發者平臺 → 聯系客服獲取測試Key&#xff08;格式MY4b781f618e3f43c4b055f25fa61941ad&#xff09;&#xff0c;該密鑰無調用次數限制且支持實時…

kafka消息積壓排查

kafka監控搭建&#xff1a;https://insights.blog.csdn.net/article/details/139129552?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7EPaidSort-1-139129552-blog-132216491.235%5Ev43%5Econtrol…

Matlab回歸預測大合集又更新啦!新增2種高斯過程回歸預測模型,已更新41個模型!性價比拉滿!

Matlab回歸預測大合集又更新啦&#xff01;新增2種高斯過程回歸預測模型&#xff0c;已更新41個模型&#xff01;性價比拉滿&#xff01; 目錄 Matlab回歸預測大合集又更新啦&#xff01;新增2種高斯過程回歸預測模型&#xff0c;已更新41個模型&#xff01;性價比拉滿&#xf…