如何使用 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…