Spring Boot 集成 Redis中@Cacheable 和 @CachePut 的詳細對比,涵蓋功能、執行流程、適用場景、參數配置及代碼示例

以下是 @Cacheable@CachePut 的詳細對比,涵蓋功能、執行流程、適用場景、參數配置及代碼示例:


1. 核心對比表格

特性@Cacheable@CachePut
作用緩存方法的返回結果,避免重復計算執行方法并更新緩存,不覆蓋原有緩存
執行流程緩存命中:直接返回緩存值,不執行方法
未命中:執行方法,緩存結果
始終執行方法,并將結果更新到緩存
適用場景查詢操作(如get方法)更新操作(如saveupdate方法)
緩存行為覆蓋原有緩存值(或按條件更新)追加或覆蓋緩存值(不刪除原有數據)
是否執行方法僅當緩存未命中時執行始終執行方法
性能影響最優(減少重復計算)稍高(需同時執行方法和更新緩存)

2. 詳細對比說明

(1) @Cacheable
  • 核心功能:根據方法參數生成緩存鍵(key),若緩存中存在對應鍵的值,則直接返回緩存值,否則執行方法并將結果存入緩存。
  • 適用場景:查詢操作(如從數據庫或遠程服務獲取數據)。
  • 參數配置
    • value/cacheNames:指定緩存名稱(必填)。
    • key:自定義緩存鍵(如#id)。
    • condition:條件判斷是否緩存(如#result != null)。
    • unless:條件判斷是否不緩存(如#result == null)。
(2) @CachePut
  • 核心功能:無論緩存是否存在,始終執行方法,并將方法結果更新到緩存中。
  • 適用場景:更新操作(如保存或更新數據后同步更新緩存)。
  • 參數配置
    • value/cacheNames:指定緩存名稱(必填)。
    • key:自定義緩存鍵(如#user.id)。
    • condition/unless:控制是否更新緩存。

3. 代碼示例對比

場景:用戶信息的增刪改查
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;// @Cacheable:緩存查詢結果@Cacheable(value = "userCache", key = "#id")public User getUserById(Long id) {System.out.println("從數據庫查詢用戶ID:" + id);return userMapper.selectUserById(id);}// @CachePut:更新緩存(同時更新數據庫)@CachePut(value = "userCache", key = "#user.id")public User updateUser(User user) {System.out.println("更新用戶信息并緩存:ID=" + user.getId());userMapper.updateUser(user); // 更新數據庫return user;}
}
執行流程對比
方法@Cacheable流程@CachePut流程
getUserById(1)1. 檢查userCache:1是否存在
2. 存在則返回緩存,不執行方法
3. 不存在則執行方法并緩存結果
不適用
updateUser(user)不適用1. 始終執行方法(更新數據庫)
2. 將返回結果存入userCache:user.id

4. 關鍵參數對比

@Cacheable
參數描述示例值
value緩存名稱(必填)"userCache"
key緩存鍵(默認#method.name + #root.args"user_" + #id
condition只有滿足條件時才緩存結果#result != null
unless滿足條件時不緩存結果#result.age < 18
@CachePut
參數描述示例值
value緩存名稱(必填)"userCache"
key緩存鍵(默認#method.name + #root.args"user_" + #user.id
condition只有滿足條件時才更新緩存#user.name != null

5. 注意事項

  1. 組合使用場景

    • 更新操作:通常需要@CachePut@CacheEvict的組合,例如:

      @CacheEvict(value = "userCache", key = "#id") // 先刪除舊緩存
      @CachePut(value = "userCache", key = "#user.id") // 再存入新數據
      public User updateUser(User user, Long id) { ... }
      
    • 新增操作:使用@CachePut將新數據存入緩存(如insertUser方法)。

  2. 緩存一致性

    • 對于更新操作,需確保數據庫和緩存同時更新,避免數據不一致。
    • 使用@CacheEvict清除舊緩存,再通過@CachePut存入新數據。
  3. 性能權衡

    • @CachePut會強制執行方法,需評估是否影響性能。
    • 對于高頻寫操作,需結合緩存過期策略(如time-to-live)。

6. 總結表格

注解作用是否執行方法適用場景關鍵參數
@Cacheable緩存方法結果,減少重復計算僅當緩存未命中時執行查詢操作(getvalue, key, condition
@CachePut更新緩存,確保數據一致性始終執行方法更新操作(updatesavevalue, key, condition

通過以上對比,可以清晰理解這兩個注解的差異和使用場景,從而在實際開發中合理選擇和組合使用。

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

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

相關文章

可以使用費曼學習法閱讀重要的書籍

書本上畫了很多線&#xff0c;回頭看等于沒畫出任何重點。 不是所有的觸動都是有效的。就像你曾經看過很多好文章&#xff0c;當時被觸動得一塌糊涂&#xff0c;還把它們放進了收藏夾&#xff0c;但一段時間之后&#xff0c;你就再也記不起來了。如果讓你在一本書上畫出令自己…

Nginx之https重定向為http

為了將Nginx中443端口的請求重定向到80端口&#xff0c;你可以按照以下步驟進行操作&#xff1a; ?確認Nginx已經正確安裝并運行?&#xff1a; 確保Nginx服務已經在你的系統上安裝并運行。你可以通過運行以下命令來檢查Nginx的狀態&#xff08;具體命令可能因操作系統而異&a…

【ARTS】【LeetCode-2873】有序三元組中的最大值!

前言 僅做學習使用&#xff0c;侵刪 什么是ARTS&#xff1f; 算法(Algorithm): 每周至少一道LeetCode算法題&#xff0c;加強編程訓練和算法學習 閱讀(Review)&#xff1a; 閱讀并點評至少一篇英文技術文章&#xff0c;提高英文水平 技巧 (Tip)&#xff1a;學習至少一個技…

基于spring boot 鮮花銷售系統PPT(源碼+lw+部署文檔+講解),源碼可白嫖!

課題意義 隨著網絡不斷的普及發展&#xff0c;鮮花銷售系統依靠網絡技術的支持得到了快速的發展&#xff0c;首先要從用戶的實際需求出發&#xff0c;通過了解用戶的需求開發出具有針對性的信息管理系統&#xff0c;利用目前網絡給用戶帶來的方便快捷這一特點對系統進行調整&am…

Redis常用的數據結構及其使用場景

字符串(String) string 是 redis 最基本的類型&#xff0c;你可以理解成與 Memcached 一模一樣的類型&#xff0c;一個 key 對應一個 value。 string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據&#xff0c;比如jpg圖片或者序列化的對象。 string 類型是 R…

設計模式簡述(五)建造者模式

建造者模式 描述基本要素協調類使用 描述 建造者模式屬于創造型設計模式。 通常用于構建一系列復雜對象&#xff0c;這些對象有一定的共性。 我們可以通過不同的建造者&#xff0c;組裝不同的對象 與工廠模式的區別&#xff0c;建造者模式更側重與基于基礎構件組裝而非直接創…

Java基礎 4.6

1.成員方法練習 //編寫類A&#xff1a;判斷一個數是奇數還是偶數&#xff0c;返回boolean //根據行、列、字符打印對應行數和列數的字符&#xff0c;比如&#xff1a;行4 列4 字符# 則打印相應的效果 public class MethodExercise01 {public static void main(String[] args) …

前端快速入門學習4——CSS盒子模型、浮動、定位

一、盒子模型 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"這一術語是用來設計和布局時使用。 CSS盒模型本質上是一個盒子&#xff0c;封裝周圍的HTML元素&#xff0c;它包括&#xff1a;邊距&#xff0c;邊框&#xff0c;填充&#xff0c…

瑞數信息發布《BOTS自動化威脅報告》,揭示AI時代網絡安全新挑戰

近日&#xff0c;瑞數信息正式發布《BOTS自動化威脅報告》&#xff0c;力求通過全景式觀察和安全威脅的深度分析&#xff0c;為企業在AI時代下抵御自動化攻擊提供安全防護策略&#xff0c;從而降低網絡安全事件帶來的影響&#xff0c;進一步增強業務韌性和可持續性。 威脅一&am…

Docker設置代理

目錄 前言創建代理文件重載守護進程并重啟Docker檢查代理驗證 前言 拉取flowable/flowable-ui失敗&#xff0c;用DaoCloud源也沒拉下來&#xff0c;不知道是不是沒同步。索性想用代理拉鏡像。在此記錄一下。 創建代理文件 創建docker代理配置 sudo mkdir -p /etc/systemd/s…

Debezium嵌入式連接postgresql封裝服務

文章目錄 1.項目結構&#xff1a;2.依賴&#xff1a;3.application.properties4.DebeziumConnectorConfig類5.TableEnum類6.TableHandler接口&#xff08;表處理抽象&#xff09;7.DefaultTableHandler默認實現類8.UserTableHandler處理類9.TableHandlerFactory工廠10.Debezium…

ER-圖,詳情和畫法

一、E-R圖的核心元素 1.實體 表示現實中對象或概念&#xff0c;用矩形表示 示例&#xff1a;用戶、老師、學生 2.屬性 描述實體的特征&#xff0c;用橢圓表示。 分為主鍵&#xff08;用戶id&#xff09; 和非主鍵&#xff08;用戶昵稱&#xff09; 3.關系 表示實體間的…

Windows Flip PDF Plus Corporate PDF翻頁工具

軟件介紹 Flip PDF Plus Corporate是一款功能強大的PDF翻頁工具&#xff0c;也被稱為名編輯電子雜志大師。這款軟件能夠迅速將PDF文件轉換為具有翻頁動畫效果的電子書&#xff0c;同時保留原始的超鏈接和書簽。無論是相冊、視頻、音頻&#xff0c;還是Flash、視頻和鏈接&#…

Linux文件系統中的Page Cache和內存管理中的Page之間的關系

Linux文件系統中的Page Cache和內存管理中的Page之間有密切的關聯&#xff0c;兩者在底層機制上緊密結合&#xff0c;共同實現高效的內存和文件系統管理。以下是它們的關系和關鍵點&#xff1a; 核心關系 Page Cache的底層是內存Page Page Cache是由內存管理中的物理內存頁&…

每日一個小病毒(C++)EnumChildWindows+shellcode

這里寫目錄標題 1. `EnumChildWindows` 的基本用法2. 如何利用 `EnumChildWindows` 執行 Shellcode?關鍵點:完整 Shellcode 執行示例3. 為什么 `EnumChildWindows` 能執行 Shellcode?4. 防御方法5. 總結EnumChildWindows 是 Windows API 中的一個函數,通常用于枚舉所有子窗…

AI爬蟲?爬!

1.你是否還在為大模型的key而感到憂傷和囊中羞澀&#xff0c;openrouter.ai&#xff0c;目前可免費白嫖多個大模型&#xff0c;代碼如下 from openai import OpenAIclient OpenAI(base_url"https://openrouter.ai/api/v1",api_key"", )completion clien…

洛谷題單3-P5720 【深基4.例4】一尺之棰-python-流程圖重構

題目描述 《莊子》中說到&#xff0c;“一尺之棰&#xff0c;日取其半&#xff0c;萬世不竭”。第一天有一根長度為 a a a 的木棍&#xff0c;從第二天開始&#xff0c;每天都要將這根木棍鋸掉一半&#xff08;每次除 2 2 2&#xff0c;向下取整&#xff09;。第幾天的時候木…

c++中的auto關鍵字

在 C 中&#xff0c;auto 是一個類型推斷關鍵字&#xff08;C11 引入&#xff09;&#xff0c;允許編譯器根據變量的初始化表達式自動推導其類型。它極大地簡化了代碼編寫&#xff0c;尤其在涉及復雜類型或模板的場景中。以下是 auto 的詳細說明&#xff1a; 1. 基本用法 1.1 …

開發指南111-關閉所有打開的子窗口

門戶系統是通過window.open通過單點登錄的模式打開子系統的&#xff0c;這就要求門戶系統退出時&#xff0c;關閉所有打開的子系統。 平臺處理這一問題的核心原理如下&#xff1a; 主窗口定義&#xff1a; allChildWindows:[], //所有子窗口 pushChildWindow(childWindow){ …

Kotlin語言進階:協程、Flow、Channel詳解(二)

Kotlin語言進階:協程、Flow、Channel詳解(二) 一、Flow基礎 1.1 什么是Flow Flow是Kotlin提供的用于處理異步數據流的解決方案,它建立在協程之上,具有以下特點: 冷流特性:只有在收集時才會開始發射數據背壓處理:自動處理生產者和消費者速度不匹配的問題組合操作:提…