如何使用 Apache Ignite 作為 Spring 框架的緩存(Spring Cache)后端

這份文檔是關于 如何使用 Apache Ignite 作為 Spring 框架的緩存(Spring Cache)后端,實現方法級別的緩存功能。

這和前面我們講的 Spring Data + Ignite兩個不同的概念。我們先明確區別,再深入理解。


🔁 一、核心區別:Spring Data vs Spring Cache

對比項Spring Data + IgniteSpring Cache + Ignite
目的主動操作緩存數據,像操作數據庫一樣存取 Ignite 中的數據自動緩存方法結果,避免重復執行耗時方法
編程模型寫 Repository 接口,調用 save(), findByXxx()給方法加注解 @Cacheable, @CacheEvict
數據來源數據主要來自 Ignite 緩存數據來自方法執行結果(如查數據庫)
是否生成 SQL? 是(根據方法名自動生成)? 否(只是緩存結果)
典型場景你想直接讀寫 Ignite 緩存你想緩存數據庫查詢結果

? 簡單說:

  • Spring Data:你主動管理緩存里的數據。
  • Spring Cache:你讓 Spring 自動幫你緩存某個方法的結果。

🧠 二、Spring Cache + Ignite 的核心思想

💡 目標:避免重復執行耗時的操作(如數據庫查詢、遠程調用),直接從緩存中返回結果。

舉個例子:

@Cacheable("averageSalary")
public long averageSalary(int organizationId) {// 耗時操作:查數據庫return jdbc.queryForObject("SELECT AVG(salary)...", organizationId);
}

第一次調用 averageSalary(101)

  • 方法執行 → 查數據庫 → 返回結果 → 同時存入 Ignite 緩存(key=101, value=50000)

第二次調用 averageSalary(101)

  • Spring 檢查緩存中是否有 key=101 的數據
  • 有 → 直接返回緩存結果跳過方法執行

? 效果:提升性能,減輕數據庫壓力


?? 三、如何配置 Ignite 作為 Spring Cache Manager?

Spring Cache 是一個抽象層,它不關心底層用的是 Redis、Ehcache 還是 Ignite。
你要做的就是:提供一個 CacheManager 實現,告訴 Spring 用 Ignite 來存緩存數據。

步驟 1:引入依賴(Maven)

確保你的 pom.xml 包含:

<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-spring</artifactId><version>${ignite.version}</version>
</dependency>

? ignite-spring 模塊包含了 SpringCacheManager


步驟 2:配置 SpringCacheManager

在 Spring 配置文件(XML 或 Java Config)中定義 SpringCacheManager

方式一:由 SpringCacheManager 自動啟動 Ignite 節點
<bean id="cacheManager" class="org.apache.ignite.cache.spring.SpringCacheManager"><!-- 指定 Ignite 配置文件路徑 --><property name="configurationPath" value="config/ignite-config.xml"/>
</bean><!-- 啟用注解驅動的緩存 -->
<cache:annotation-driven/>
方式二:使用已存在的 Ignite 節點(推薦集群環境)
<bean id="cacheManager" class="org.apache.ignite.cache.spring.SpringCacheManager"><!-- 使用已啟動的節點(gridName 對應 IgniteConfiguration.setIgniteInstanceName()) --><property name="gridName" value="myIgniteInstance"/>
</bean><cache:annotation-driven/>

? gridName:如果你已經在別處(如 ServletListener)啟動了 Ignite 節點,就用這個名字關聯它。


🌟 四、動態緩存(Dynamic Caches)

不需要提前創建所有緩存

當 Spring 第一次使用某個緩存名(如 "averageSalary")時,如果緩存不存在,SpringCacheManager自動創建它

自定義動態緩存配置

你可以設置默認的緩存模板:

<bean id="cacheManager" class="org.apache.ignite.cache.spring.SpringCacheManager"><property name="configurationPath" value="ignite.xml"/><!-- 所有動態創建的緩存都使用 REPLICATED 模式 --><property name="dynamicCacheConfiguration"><bean class="org.apache.ignite.configuration.CacheConfiguration"><property name="cacheMode" value="REPLICATED"/></bean></property><!-- 啟用 Near Cache(本地緩存),提升讀取性能 --><property name="dynamicNearCacheConfiguration"><bean class="org.apache.ignite.configuration.NearCacheConfiguration"><property name="nearStartSize" value="1000"/></bean></property>
</bean>

? Near Cache:在應用節點本地再緩存一份數據,減少網絡開銷。


🧩 五、使用緩存注解(核心)

1. @Cacheable —— 緩存方法結果

@Cacheable("averageSalary")  // 緩存名為 "averageSalary"
public long averageSalary(int organizationId) {// 耗時操作:查數據庫return jdbc.queryForObject("SELECT AVG(salary)...", Long.class, organizationId);
}
  • key 生成規則:默認使用所有參數做 key(這里就是 organizationId
  • 效果:相同參數只執行一次,后續直接返回緩存

2. @CacheEvict —— 刪除緩存(數據變更時用)

@CacheEvict(value = "averageSalary", key = "#e.organizationId")
public void updateSalary(Employee e) {jdbc.update("UPDATE Employee SET salary = ? WHERE id = ?", e.getSalary(), e.getId());
}
  • value = "averageSalary":指定要清除的緩存名
  • key = "#e.organizationId":使用 Spring EL(表達式語言) 提取 e 對象的 organizationId 字段作為緩存 key
  • 作用:員工薪資變了 → 對應部門的平均工資緩存失效 → 下次調用 averageSalary() 會重新計算

? 這是保持緩存一致性的關鍵!


3. 其他常用注解

注解說明
@CachePut強制執行方法,并更新緩存(不管是否存在)
@Caching組合多個緩存操作(如同時 @CacheEvict 多個緩存)
@CacheConfig類級別配置(如統一設置 cacheNames)

🎯 六、實際工作流程圖解

調用 averageSalary(101)↓
Spring 檢查 Ignite 緩存中是否存在 key=101 的數據├─ 存在 → 直接返回緩存值 ?└─ 不存在 → 執行方法體(查數據庫)↓得到結果(如 50000)↓將 (101, 50000) 存入 Ignite 的 "averageSalary" 緩存↓返回結果

updateSalary(employee) 被調用:

執行 updateSalary(e)↓
Spring 清除 "averageSalary" 緩存中 key = e.organizationId 的條目↓
下次調用 averageSalary(e.orgId) → 緩存失效 → 重新查數據庫計算

? 七、最佳實踐建議

  1. 緩存名要語義化:如 "userProfile", "productCatalog"
  2. 合理設置過期時間:在 CacheConfiguration 中設置 setExpiryPolicyFactory(...)
  3. 及時清理緩存:數據變更時用 @CacheEvict
  4. 避免緩存雪崩:給緩存設置隨機過期時間
  5. 監控緩存命中率:通過 Ignite Visor 或 Metrics 判斷緩存是否有效

🧩 八、Java 配置方式(替代 XML)

如果你用的是 Spring Boot 或 Java Config:

@Configuration
@EnableCaching
public class IgniteCacheConfig {@Beanpublic Ignite igniteInstance() {IgniteConfiguration cfg = new IgniteConfiguration();cfg.setIgniteInstanceName("myIgnite");cfg.setPeerClassLoadingEnabled(true);return Ignition.start(cfg);}@Beanpublic CacheManager cacheManager() {SpringCacheManager cacheManager = new SpringCacheManager();cacheManager.setGridName("myIgnite"); // 關聯上面的節點return cacheManager;}
}

🎯 九、一句話總結

Apache Ignite 通過 SpringCacheManager 實現了 Spring Cache 抽象,讓你可以用 @Cacheable@CacheEvict 等注解,自動將耗時方法的結果緩存到 Ignite 分布式緩存中,從而大幅提升性能、降低數據庫負載,特別適合緩存數據庫查詢、遠程調用等場景。


🔄 十、和 Spring Data 的關系(終極總結)

場景用哪個?
我想把某個方法的結果緩存起來,避免重復執行? Spring Cache + @Cacheable
我想直接操作 Ignite 緩存中的數據(增刪改查)? Spring Data + IgniteRepository
我既有復雜查詢,又想緩存結果? 兩者結合使用!
? 用 Spring Data 操作緩存
? 用 Spring Cache 緩存高頻查詢結果

需要我為你生成一個完整的 Spring Boot + Ignite Cache 示例項目嗎?包括配置、實體、Service 和測試用例。歡迎繼續提問 😊

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

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

相關文章

Android 超大圖片、長圖分割加載

在Android開發中&#xff0c;處理大圖片的加載是一個常見且重要的問題&#xff0c;尤其是在需要顯示高分辨率圖片時。大圖片如果不正確處理&#xff0c;可能會導致內存溢出或應用性能下降。下面是一些常用的策略和技術來優化大圖片的加載&#xff1a;1. 使用圖片壓縮庫a. Glide…

Linux:理解操作系統

文章目錄數據流動操作系統數據流動 軟件運行&#xff0c;必須先加載到內存&#xff0c;本質要把磁盤上的文件 加載到內存。 我們寫的算法是處理存儲器里面的數據&#xff0c;數據就是文件&#xff0c;我們自己寫的可執行文件。 圖中QQ就是軟件&#xff0c;加載內存后進行下一步…

【每日一錯】PostgreSQL的WAL默認段大小

文章目錄題目擴展學習WAL工作原理流程圖題目 擴展學習 WAL&#xff08;Write Ahead Log&#xff09;預寫日志&#xff1a; WAL是PostgreSQL先寫日志、后寫數據的機制&#xff0c;用來防止數據丟失、提升數據恢復能力。 流程&#xff1a; 事務先寫日志文件&#xff08;WAL&…

Visual Studio Code 使用指南 (2025年版)

Visual Studio Code (VS Code) 是一款由微軟開發的免費、開源、跨平臺的現代化輕量級代碼編輯器&#xff0c;憑借其強大的核心功能、豐富的擴展生態系統以及高度可定制性&#xff0c;已成為全球數百萬開發者的首選工具。本指南旨在幫助您快速上手 VS Code&#xff0c;掌握其核心…

【Java】JVM虛擬機(java內存模型、GC垃圾回收)

一、Java內存模型&#xff08;JMM&#xff09;JMM&#xff08;Java Memory Model&#xff0c;Java 內存模型&#xff09;是 Java 虛擬機規范中定義的一種抽象概念&#xff0c;用于規范 Java 程序中多線程對共享內存的訪問規則&#xff0c;解決可見性、原子性和有序性問題&#…

二叉樹算法之【二叉樹的層序遍歷】

目錄 LeetCode-102題 LeetCode-102題 給定二叉樹的根節點root&#xff0c;返回其節點值的層序遍歷&#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {// checkif (r…

uniapp+vue3——通知欄標題縱向滾動切換

介紹 取巧&#xff0c;使用縱向輪播實現 <!-- 通知欄 --> <view class"noticeBox" v-if"notice.length>0"><image src"/static/images/index/noticeIcon.png" mode"aspectFill"></image><swiper class&…

BilldDesk 開源、免費、吊打收費軟件!白嫖黨最愛!遠程控制神器,沒有任何連接次數和畫質限制,同時顯示多屏、屏幕墻等高級功能

遠程控制軟件哪個好用&#xff1f;TeamViewer收費太貴&#xff0c;向日葵限制太多&#xff0c;QQ遠程又不穩定……別擔心&#xff01;今天給大家推薦一款完全免費、開源的遠程控制神器——BilldDesk&#xff01;它不僅功能強大&#xff0c;而且支持Windows、macOS、Linux、Andr…

ios UIAppearance 協議

一、前言 iOS 上提供了一個比較強大的工具UIAppearance&#xff0c;我們通過UIAppearance設置一些UI的全局效果&#xff0c;這樣就可以很方便的實現UI的自定義效果又能最簡單的實現統一界面風格。 (id)appearance ; 這個是這個協議里最重要的方法了 . 這個方法是統一全部改&am…

進階數據結構:用紅黑樹實現封裝map和set

? 嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的 passion。準備好和我一起沖進代碼的奇幻宇宙了嗎?Let’s go! 我的博客:yuanManGa…

【數據結構初階】--二叉樹(五)

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

redis布隆過濾器解決緩存擊穿問題

在電商系統中&#xff0c;商品詳情頁是一個典型的高頻訪問場景。當用戶請求某個商品的詳情時&#xff0c;系統會優先從緩存中獲取數據。如果緩存中沒有該商品的詳情&#xff0c;系統會去數據庫查詢并更新緩存。然而&#xff0c;如果某個熱門商品的緩存失效&#xff0c;大量請求…

1+1>2!特征融合如何讓目標檢測更懂 “場景”?

來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;在多模態大模型&#xff08;MLLM&#xff09;時代&#xff0c;特征融合與目標檢測的研究方向正變得愈發關鍵。從紅外與可見光圖像的融合&#xff0c;到語音活動檢測中的特征…

詳解賽靈思SRIO IP并提供一種FIFO封裝SRIO的收發控制器仿真驗證

概述RapidIO標準定義為三層&#xff1a;邏輯層、傳輸層、物理層。邏輯層&#xff1a;定義總體協議和包格式&#xff0c;包含設備發起/完成事務的必要信息。傳輸層&#xff1a;提供包傳輸的路由信息&#xff08;對頂層不可見&#xff09;。物理層&#xff1a;描述設備級接口細節…

深度學習:簡介與任務分類總覽

一、什么是深度學習&#xff1f;1.1 深度學習的定義深度學習&#xff08;Deep Learning&#xff09;是機器學習的一種特殊形式&#xff0c;它依賴于具有多層結構的神經網絡自動從數據中學習特征并完成任務&#xff0c;如圖像識別&#xff0c;語音識別&#xff0c;自然語言處理等…

MSPM0開發學習筆記:二維云臺畫圖(2025電賽 附源代碼及引腳配置)

前言 今年的電賽&#xff08;2025&#xff09;&#xff0c;很多題都與云臺相關&#xff0c;因此為備戰電賽&#xff0c;博主這邊也是準備了一個由兩個42步進電機驅動的云臺并提前進行調試&#xff0c;避免賽題出來之后手忙腳亂的&#xff0c;這邊的兩個42步進電機采用同一個驅…

借助 Wisdom SSH 的 AI 助手構建 Linux 開發環境

借助Wisdom SSH的AI助手構建Linux開發環境 在Linux系統的開發場景中&#xff0c;快速、準確地搭建開發環境至關重要。Wisdom SSH憑借其強大的AI助手&#xff0c;能極大簡化這一過程&#xff0c;其官網為ssh.wisdomheart.cn。以下以在Ubuntu 22.04服務器上構建Python開發環境&am…

Python 程序設計講義(44):組合數據類型——集合類型:創建集合

Python 程序設計講義&#xff08;44&#xff09;&#xff1a;組合數據類型——集合類型&#xff1a;創建集合 目錄Python 程序設計講義&#xff08;44&#xff09;&#xff1a;組合數據類型——集合類型&#xff1a;創建集合一、集合的特征二、創建集合&#xff1a;使用set()函…

10 - 大語言模型 —Transformer 搭骨架,BERT 裝 “雙筒鏡”|解密雙向理解的核心

目錄 1、為什么 BERT 能 “懂” 語言&#xff1f;先看它的 “出身” 2、核心邏輯 2.1、“自學階段”—— 預訓練&#xff0c;像嬰兒學說話一樣積累語感 2.1.1、簡述 2.1.2、核心本事&#xff1a;“雙向注意力”&#xff0c;像人一樣 “聚焦重點” 2.2、“專項復習”—— …

【Spring Boot 快速入門】四、MyBatis

目錄MyBatis&#xff08;一&#xff09;入門簡介MyBatis 入門LombokMyBatis 基礎操作數據準備刪除預編譯新增更新查詢XML 映射文件MyBatis&#xff08;一&#xff09;入門 簡介 MyBatis 是一款 優秀的持久層框架&#xff0c;它支持 自定義 SQL、存儲過程以及高級映射&#xf…