Spring Boot缓存组件Ehcache、Caffeine、Redis、Hazelcast
一、Spring Boot缓存架构核心
Spring Boot通过spring-boot-starter-cache
提供统一的缓存抽象层:
二、主流缓存工具深度对比
特性 | Ehcache | Caffeine | Redis | Hazelcast |
---|---|---|---|---|
类型 | 本地缓存 | 本地缓存 | 分布式缓存 | 分布式内存网格 |
性能 | 纳秒级访问 | 微秒级(最优本地缓存) | 毫秒级(网络延迟影响) | 毫秒级(分布式优化) |
存储方式 | 堆内/堆外/磁盘 | 纯堆内 | 内存+持久化 | 分区内存+备份 |
集群支持 | 有限(需企业版) | 不支持 | 原生支持 | 原生支持 |
数据一致性 | 节点独立 | 节点独立 | 强一致性 | 最终一致性 |
内存管理 | 复杂(多级存储) | 简单(LRU/W-TinyLFU) | 服务端管理 | 分布式管理 |
适用数据规模 | GB级 | GB级 | TB级 | TB级 |
学习曲线 | 中等 | 简单 | 中等 | 陡峭 |
三、简易案例实现
1. Caffeine本地缓存(高性能场景首选)
// 配置类
@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {CaffeineCacheManager manager = new CaffeineCacheManager();manager.setCaffeine(Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10, TimeUnit.MINUTES).recordStats());return manager;}
}// 服务层
@Service
public class ProductService {@Cacheable(value = "products", key = "#id", unless = "#result.price > 1000")public Product getProduct(Long id) {// 数据库查询逻辑}@CacheEvict(value = "products", key = "#id")public void updateProduct(Product product) {// 更新逻辑}
}
2. Redis分布式缓存(集群场景)
// 配置类
@Configuration
@EnableCaching
public class RedisConfig {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)).serializeValuesWith(SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Product.class)));return RedisCacheManager.builder(factory).cacheDefaults(config).build();}
}// 服务层(注解使用方式与本地缓存一致)
@Cacheable(value = "global_products", key = "#id")
public Product getGlobalProduct(Long id) { ... }
四、使用场景分析
1. 本地缓存适用场景
- 高频访问的只读数据(如配置信息)
- 数据一致性要求不高
- 需要纳秒级响应(如实时竞价系统)
- 单机QPS > 10,000的场景
性能对比:
barCharttitle 本地缓存QPS对比x-axis 缓存类型y-axis QPS(万)series 性能dataCaffeine 45Ehcache 38Guava 42Simple 0.5
2. 分布式缓存适用场景
- 多服务实例共享数据
- 会话集群管理
- 跨服务数据一致性要求高
- 缓存数据量超过单机内存
典型架构:
五、技术选型决策树
六、高级特性对比
高级功能 | Ehcache | Caffeine | Redis | Hazelcast |
---|---|---|---|---|
缓存穿透防护 | 有限支持 | LoadingCache | Bloom Filter | 原生支持 |
缓存预热 | 手动 | 手动 | 脚本支持 | 自动加载 |
监控管理 | JMX/Statistic | Micrometer | RedisInsight | 管理中心 |
持久化 | 磁盘持久化 | 无 | RDB/AOF | 分布式持久化 |
事务支持 | 不支持 | 不支持 | 有限支持 | ACID事务 |
七、性能优化实践
-
本地缓存优化
- 使用Caffeine的异步刷新:
Caffeine.newBuilder().refreshAfterWrite(1, TimeUnit.MINUTES).buildAsync(key -> loadData(key));
- 合理设置最大尺寸防止OOM
- 使用软引用优化GC
- 使用Caffeine的异步刷新:
-
Redis优化
- Pipeline批量操作
- Lua脚本保证原子性
- 合理选择数据结构(Hash vs String)
- 集群分片避免热点Key
-
混合缓存策略
@Caching(cacheable = {@Cacheable(value = "local_cache", key = "#id"),@Cacheable(value = "redis_cache", key = "#id") }) public Product getProduct(Long id) {// DB查询 }
八、监控与故障排查
-
监控指标
- 命中率(Hit Ratio)
- 平均加载时间
- 缓存大小
- 回收次数
-
诊断工具
- Spring Boot Actuator:
/actuator/caches
- Ehcache:CacheStatistics
- Redis:
INFO
命令 - Hazelcast:Management Center
- Spring Boot Actuator:
九、技术选型建议矩阵
场景 | 首选方案 | 备选方案 | 不推荐方案 |
---|---|---|---|
高并发配置读取 | Caffeine | Ehcache | Redis |
分布式会话管理 | Redis | Hazelcast | Ehcache |
金融交易缓存 | Hazelcast | Redis | 本地缓存 |
大数据量缓存(10TB+) | Redis集群 | Hazelcast | 本地缓存 |
实时分析中间结果 | Caffeine | Ehcache | Redis |
十、未来趋势
- 分层缓存架构:本地缓存+分布式缓存混合使用
- 智能缓存:基于机器学习预测缓存策略
- 持久内存缓存:Optane PMem等新技术应用
- Serverless缓存:云原生缓存服务集成
最佳实践总结:
- 优先考虑Caffeine作为本地缓存方案
- 分布式场景首选Redis
- 复杂计算场景考虑Hazelcast
- Ehcache适用于需要多级存储的特殊场景
- 使用Spring Cache抽象层保证可移植性
- 监控指标驱动缓存策略优化
相关文章:
Spring Boot缓存组件Ehcache、Caffeine、Redis、Hazelcast
一、Spring Boot缓存架构核心 Spring Boot通过spring-boot-starter-cache提供统一的缓存抽象层: #mermaid-svg-PW9nciqD2RyVrZcZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PW9nciqD2RyVrZcZ .erro…...
【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools
📌 引言 随着大语言模型(LLM)的发展,AI 已经不再只是“回答问题”的工具,而是可以主动执行任务、调用外部资源、甚至构建完整工作流的智能系统。 为了更好地理解和使用这些能力,我们需要了解 AI 交互中几…...

如何有效删除 iPhone 上的所有内容?
“在出售我的 iPhone 之前,我该如何清除它?我担心如果我卖掉它,有人可能会从我的 iPhone 中恢复我的信息。” 升级到新 iPhone 后,你如何处理旧 iPhone?你打算出售、以旧换新还是捐赠?无论你选择哪一款&am…...

AI大模型学习三十二、飞桨AI studio 部署 免费Qwen3-235B与Qwen3-32B,并导入dify应用
一、说明 Qwen3-235B 和 Qwen3-32B 的主要区别在于它们的参数规模和应用场景。 参数规模 Qwen3-235B:总参数量为2350亿,激活参数量为220亿。Qwen3-32B:总参数量为320亿。 应用场景 Qwen3-235B:作为旗舰模型&a…...

操作系统中的设备管理,Linux下的I/O
1. I/O软件分层 I/O 层次结构分为五层: 用户层 I/O 软件设备独立性软件设备驱动程序中断处理程序硬件 其中,设备独立性软件、设备驱动程序、中断处理程序属于操作系统的内核部分,即“I/O 系统”,或称“I/O 核心子系统”。 2.用…...
炉石传说 第八次CCF-CSP计算机软件能力认证
纯链表模拟,各种操作熟知就很简单 #include<iostream> #include<bits/stdc.h> using namespace std;int n;struct role {int attack;int health;struct role* next;role() : attack(0), health(0), next(nullptr) {}role(int attack, int health) : at…...
AI应用工程师面试
技术基础 简述人工智能、机器学习和深度学习之间的关系。 人工智能是一个广泛的概念,旨在让机器能够模拟人类的智能行为。机器学习是人工智能的一个子集,它专注于开发算法和模型,让计算机能够从数据中学习规律并进行预测。深度学习则是机器学习的一个分支,它利用深度神经网…...

LabVIEW与Modbus/TCP温湿度监控系统
基于LabVIEW 开发平台与 Modbus/TCP 通信协议,设计一套适用于实验室环境的温湿度数据采集监控系统。通过上位机与高精度温湿度采集设备的远程通信,实现多设备温湿度数据的实时采集、存储、分析及报警功能,解决传统人工采集效率低、环境适应性…...

Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强
Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强 简介 GitHub MCP (Machine Coding Protocol) 是一种强大的工具,能够自动化代码生成、管理和分析,从而显著提升开发效率。本文将全面介绍 GitHub MCP 的安装、配置、使用以及如何将其融入您的工作流。 本文介绍两种…...

自主设计一个DDS信号发生器
DDS发生器 DDS信号发生器是直接数字频率合成技术,采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。采…...

鸿蒙UI(ArkUI-方舟UI框架)- 使用弹框
返回主章节 → 鸿蒙UI(ArkUI-方舟UI框架) 文章目录 弹框概述使用弹出框(Dialog)弹出框概述不依赖UI组件的全局自定义弹出框(openCustomDialog)(推荐)生命周期自定义弹出框的打开与关闭更新自定义弹出框内容更新自定义弹出框的属性完整示例 基础自定义弹…...

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2]
学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]-CSDN博客 下面…...

在不同型号的手机或平板上后台运行Aidlux
在不同型号的手机或平板上后台运行Aidlux 一、鸿蒙/HarmonyOS手机与平板 二、小米手机与平板 三、OPPO手机与平板 四、vivo手机与平板 一、鸿蒙/HarmonyOS手机与平板 (系统版本有差异,但操作原理相通) 第一步:点击设置——应用和…...

【SSM】SpringBoot学习笔记1:SpringBoot快速入门
前言: 文章是系列学习笔记第9篇。基于黑马程序员课程完成,是笔者的学习笔记与心得总结,供自己和他人参考。笔记大部分是对黑马视频的归纳,少部分自己的理解,微量ai解释的内容(ai部分会标出)。 …...

1.企业可观测性监控三大支柱及开源方案的横评对比
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 📢 大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(De…...
Neo4j图数据库管理:原理、技术与最佳实践
Neo4j作为领先的图数据库,其高效管理是发挥图计算潜力的关键。本文基于官方技术文档,深入探讨其管理原理、核心操作及生产环境最佳实践。 一、 管理架构与核心原理 多数据库架构 系统数据库 (system):管理元数据(用户、角色、权限、其他数据库信息)。标准数据库:存储实际…...
Elasticsearch中的地理空间(Geo)数据类型介绍
在Elasticsearch中,地理空间(Geo)数据类型用于存储和处理与地理位置相关的数据,支持基于地理坐标的查询、过滤和分析。这类数据类型允许用户在分布式环境中高效地处理地理空间相关的搜索、聚合和可视化需求,广泛应用于地图应用、物流追踪、位置服务(LBS)等场景。 一、核…...
[论文阅读] 软件工程 | 如何挖掘可解释性需求?三种方法的深度对比研究
如何挖掘可解释性需求?三种方法的深度对比研究 研究背景:当软件变复杂,我们需要“说明书” 想象你买了一台智能家电,却发现它的运行逻辑完全看不懂,按钮按下后毫无反应,故障时也不提示原因——这就是现代…...

双空间知识蒸馏用于大语言模型
Dual-Space Knowledge Distillation for Large Language Models 发表:EMNLP 2024 机构:Beijing Key Lab of Traffic Data Analysis and Mining 连接:https://aclanthology.org/2024.emnlp-main.1010.pdf 代码:GitHub - songmz…...

OpenCV CUDA模块特征检测------角点检测的接口createMinEigenValCorner()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数创建一个 基于最小特征值(Minimum Eigenvalue)的角点响应计算对象,这是另一种经典的角点检测方法&…...
Git 提交备注应该如何规范
Git 提交备注应该如何规范 在软件开发过程中,Git 作为版本控制系统被广泛使用,而规范的提交备注对于代码的可维护性、团队协作以及项目的长期发展都有着至关重要的意义。良好的提交备注能够清晰地记录代码变更的原因、范围和影响,方便团队成…...
青少年编程与数学 02-020 C#程序设计基础 17课题、WEB与移动开发
青少年编程与数学 02-020 C#程序设计基础 17课题、WEB与移动开发 一、C#语言Web和移动项目开发1. Web项目开发2. 移动项目开发 二、ASP.NET Core1. ASP.NET Core 基础架构1.1 请求处理管道1.2 主机模型1.3 服务器选项 2. 核心新特性2.1 NativeAOT 支持2.2 增强的身份验证方案2.…...
Qt OpenGL 实现交互功能(如鼠标、键盘操作)
一、基本概念 1. Qt 事件系统与 OpenGL 渲染的协同 Qt 提供了完善的事件处理机制,而 OpenGL 负责图形渲染。交互的实现本质上是: 事件捕获:通过 Qt 的事件系统(如 mousePressEvent、keyPressEvent)捕获用户输入。 状态更新:根据输入事件更新场景状态(如相机位置、模型…...
【Go语言基础【3】】变量、常量、值类型与引用类型
文章目录 一、值(Value)与字面量(Literal)1. 值2. 字面量 二、变量(Variable)1. 声明方式2. 赋值方式3. 变量默认值4. 类型与值的匹配 三、常量(Constant)1. 声明方式2. 常量的特性3…...

8天Python从入门到精通【itheima】-69~70(字符串的常见定义和操作+案例练习)
目录 69节-字符串的定义和操作 1.学习目标 2.数据容器视角下的字符串 3.字符串的下标索引 4.字符串是一个无法修改的数据容器 5.字符串的常用操作 【1】index方法 【2】replace方法:进过替换,得到一个新的字符串 【3】split方法:将字…...
在 Linux 中查看文件并过滤空行
在 Linux 中查看文件并过滤空行 在 Linux 中查看文件内容时过滤掉空行有多种方法,以下是几种常用的方法: 方法 1:使用 grep grep -v ^$ filename-v:反转匹配,只显示不匹配的行^$:表示空行的正则表达式&a…...

GC1809:高性能音频接收与转换芯片
GC1809 是一款高性能音频接收与转换芯片,适用于多种音频设备,如 A/V 接收器、多媒体音响设备、机顶盒等。本文将简要介绍该芯片的主要特性、性能参数及应用。 主要特性 多协议兼容:兼容 IEC60958、S/PDIF、EIAJ CP1201 和 AES3 协议。 多种…...

项目实战——C语言扫雷游戏
这是一款9*9的扫雷游戏 扫雷游戏 1.需求分析2.程序框架设计3.分函数实现打印游戏菜单界面游戏主逻辑函数程序主入口初始化游戏棋盘随机布置地雷显示当前棋盘状态计算指定位置周围的地雷数量玩家排雷主逻辑 4.分文件实现(1)test.c(2࿰…...

【Java】CopyOnWriteArrayList
一,概述 CopyOnWriteArrayList作为List接口的实现之一,它区分于ArrayList在于它是线程安全的。如它名字一样,所有的写操作均复制了原数组的值,虽说代价较大,但读多写少的环境下,是可接受的。笔者在此简单看…...
【JS进阶】ES6 实现继承的方式
ES6 实现继承的方式 基本语法 class Parent {constructor(name) {this.name name;this.colors [red, blue];}sayName() {console.log(this.name);} }class Child extends Parent {constructor(name, age) {super(name); // 必须调用super(),且在使用this之前thi…...