跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

SpringBoot 结合 Redis+Caffeine 多级缓存架构实践

SpringBoot 结合 Redis 和 Caffeine 构建多级缓存体系,有效解决高并发下数据库压力问题。本地缓存微秒级响应,分布式缓存保障多实例一致性。基础架构搭建、缓存交互流程、优劣势分析及实战注意点,涵盖配置策略、数据一致性及穿透击穿雪崩防护,助力系统性能优化。

随缘发布于 2026/3/23更新于 2026/7/641 浏览
SpringBoot 结合 Redis+Caffeine 多级缓存架构实践

在后端开发中,API 接口的性能往往取决于数据存储与缓存策略。Spring Boot 生态成熟,MySQL 持久化可靠,但当并发量上来时,单一数据库容易成为瓶颈。引入 Redis(分布式)和 Caffeine(本地)构建多级缓存,是提升系统吞吐量的关键手段。

基础架构:Spring+MySQL

基于 Spring Boot 和 MyBatis-Plus 搭建 API 服务是标准做法。核心链路是 Controller 接收请求,Service 处理业务,Mapper 操作 MySQL。这种模式开发效率高、数据一致性好,但在高并发下,查询延迟和连接池耗尽是常见问题。

核心依赖

Maven 配置需包含 Web 启动器、ORM 工具、数据库驱动及连接池:

<!-- Spring Boot Web 核心 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus 启动器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- Druid 连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>

实现流程

  1. 配置数据源:在 application.yml 中指定 MySQL 地址、账号及连接池参数;
  2. 实体映射:定义 Entity 类对应表结构,利用注解简化 ORM 配置;
  3. DAO 层:继承 BaseMapper 即可实现 CRUD,无需手写 SQL;
  4. Service 层:封装校验、权限等逻辑,调用 Mapper;
  5. Controller 层:通过 @RestController 暴露接口路径。

多级缓存:Redis+Caffeine

多级缓存的核心是'近缓存优先'。Caffeine 驻留进程内,访问极快但无法共享;Redis 独立部署,支持集群但受网络影响。两者结合能兼顾速度与一致性。

组件特性对比

特性CaffeineRedis
存储位置应用进程内独立服务器/集群
访问延迟微秒级毫秒级
分布式支持不支持支持
容量限制JVM 堆内存GB/TB 级
持久化无RDB/AOF

工作流程

整合 Spring Cache 抽象后,读取流程如下:

  1. 查本地:先查 Caffeine,命中直接返回;
  2. 查分布:未命中则查 Redis,命中后回填 Caffeine;
  3. 查库:均未命中则查 MySQL,结果同步回 Redis 和 Caffeine;
  4. 更新策略:写操作先更库,再删缓存,防止不一致。

![图示:多级缓存交互流程]

下面是一个实际的分页列表接口示例,展示了如何手动控制多级缓存逻辑:

/**
 * 分页图片列表 VO 多级缓存
 * 逻辑:本地 -> 分布式 -> 数据库
 */
@Resource
private ValueOperations<String, String> stringValueWithRedisTemplate;

@Resource
private Cache<String, String> localCacheWithCaffeine;

@PostMapping("/list/page/vo/multi-level")
public BaseResponse<Page<PictureVo>> listPictureVOByPageWithMultiLevel(
        @RequestBody PictureQueryRequest pictureQueryRequest,
        HttpServletRequest request) {
    
    // 1. 构造 Key
    String queryCondition = JSONUtil.toJsonStr(pictureQueryRequest);
    String cacheKey = String.format("hututu:list:%s", DigestUtils.md5DigestAsHex(queryCondition.getBytes()));
    
    // 2. 查本地缓存 (Caffeine)
    String cacheValue = localCacheWithCaffeine.getIfPresent(cacheKey);
    if (cacheValue != null) {
        return ResponseUtil.success(JSONUtil.toBean(cacheValue, Page.class));
    }
    
    // 3. 查分布式缓存 (Redis)
    cacheValue = stringValueWithRedisTemplate.get(cacheKey);
    if (cacheValue != null) {
        // 回填本地缓存
        localCacheWithCaffeine.put(cacheKey, cacheValue);
        return ResponseUtil.success(JSONUtil.toBean(cacheValue, Page.class));
    }
    
    // 4. 查数据库
    Page<Picture> picturePage = pictureService.page(new Page<>(current, pageSize), ...);
    Page<PictureVo> result = pictureService.getPictureVOPage(picturePage, request);
    
    // 5. 写入缓存
    String jsonResult = JSONUtil.toJsonStr(result);
    localCacheWithCaffeine.put(cacheKey, jsonResult);
    stringValueWithRedisTemplate.set(cacheKey, jsonResult, 300, TimeUnit.SECONDS);
    
    return ResponseUtil.success(result);
}

优劣势分析

任何方案都有代价,多级缓存也不例外。

优势

  • 极致性能:Caffeine 的微秒级响应覆盖了大部分高频读,大幅减少 Redis 网络开销。实测显示,商品详情查询响应可从 50ms 降至 5ms 以内。
  • 容灾能力:Redis 挂掉时,Caffeine 可作为兜底,保证核心功能可用;单实例故障时,其他节点仍能从 Redis 获取数据。
  • 分布式适配:微服务场景下,Redis 保证多实例间状态一致,Caffeine 减少跨服务竞争。

劣势

  • 复杂度增加:需要维护两套缓存配置,还要处理双写一致性问题。
  • 资源消耗:JVM 堆内存被占用,且需额外部署 Redis 集群。
  • 一致性风险:服务 A 更新了缓存,服务 B 的本地缓存可能还是旧的,直到过期。虽然可以用 Pub/Sub 通知失效,但这又增加了系统耦合。

适用场景与注意点

核心场景

适合高频读、低频写的业务,如商品详情、字典配置。也适用于高并发核心接口,如秒杀活动,用本地缓存抗住瞬时流量。

实践注意点

  1. 配置策略:Caffeine 建议设置 LRU 淘汰策略和最大容量,避免 OOM;Redis 开启 AOF 持久化,热点 Key 设置随机过期时间防雪崩。
  2. 一致性保障:推荐'先更库,再删缓存'。强一致性需求可引入消息队列通知各节点失效本地缓存。
  3. 常见问题防护:
    • 穿透:对空值也缓存,或加布隆过滤器。
    • 击穿:热点 Key 永不过期,配合后台刷新或互斥锁。
    • 雪崩:过期时间加随机偏移,避免集体失效。
  4. 监控运维:接入 Actuator 监控命中率,Redis 内存使用率超阈值及时告警。

总结

Spring+MySQL 是基石,Redis+Caffeine 多级缓存则是应对高并发的利器。它通过'本地 + 分布式'的组合,在性能和一致性之间找到了平衡点。实际落地时,不要盲目上架构,需根据业务读写比例权衡。做好配置、监控和一致性策略,才能让这套体系真正稳定运行。

目录

  1. 基础架构:Spring+MySQL
  2. 核心依赖
  3. 实现流程
  4. 多级缓存:Redis+Caffeine
  5. 组件特性对比
  6. 工作流程
  7. 优劣势分析
  8. 优势
  9. 劣势
  10. 适用场景与注意点
  11. 核心场景
  12. 实践注意点
  13. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Git 原理与实战:深入解析核心架构与常用命令
  • 如何入门 AI 行业,成为人工智能产品经理
  • 卷积神经网络(CNN)深度解析:理论、实现与应用
  • SkyWalking 实现 Kafka 与 RabbitMQ 消息链路追踪实战
  • WordPress 基础配置与 MyBatis-Plus 接口开发实践
  • 智谱清言(ChatGLM)大模型应用与功能详解
  • PyCharm 安装教程及环境配置指南
  • 2026 年 3 月 23 日 AI 产业要闻:脑机接口落地与算力竞赛
  • 时序数据库选型指南:Apache IoTDB 工业物联网应用实践
  • 前端面试复盘:透过问题看技术深度与工程素养
  • getBoundingClientRect 方法完全指南
  • Stable Diffusion 3.5 云端部署与图像生成实测
  • Mac 系统唤醒增强工具 Amphetamine Enhancer 使用指南
  • 零基础转行网络安全就业前景与技能路径分析
  • 零基础学习网络安全指南:职业方向与技能路径
  • 零基础学习网络安全指南:职业方向与技能路径
  • 零基础学习网络安全指南:核心方向与入门路径
  • 跨国企业 Git 连接困境分析与智能代理配置方案
  • 零基础学习 Python 必备开发工具与库指南
  • 零基础学习网络安全技术入门指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online