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

Spring Boot 多级缓存架构设计与实现

介绍在 Spring Boot 中构建 Caffeine 与 Redis 协同的多级缓存架构。通过 L1 本地缓存拦截热点请求、L2 Redis 共享数据、L3 MySQL 持久化,有效解决高并发下的网络延迟与数据库压力。内容涵盖依赖配置、Service 层读写逻辑、缓存一致性(短 TTL/MQ 广播)、穿透(空值缓存)及雪崩(随机 TTL)解决方案。性能测试表明该方案可显著降低下游压力并提升响应速度。

CoderByte发布于 2026/3/27更新于 2026/5/2926 浏览

一、前言:为什么单层缓存不够用?

你可能已经用 Redis 缓解了数据库压力,但在高并发场景下仍面临:

  • ❌ Redis 网络延迟高(0.5~2ms),无法满足 <1ms 的响应要求
  • ❌ 热点数据反复穿透到 Redis,造成不必要的网络开销
  • ❌ 突发流量打垮缓存层

多级缓存(Multi-Level Cache) 正是为解决这些问题而生——通过'本地 + 分布式'协同,层层拦截请求,极致提升性能!

本文将介绍在 Spring Boot 中实现 Caffeine + Redis 多级缓存的方案,并解决一致性、穿透、雪崩等核心问题。


二、多级缓存架构设计

2.1 典型三级架构
2.2 各层职责
层级技术作用
L1Caffeine拦截本机热点请求,微秒级响应
L2Redis Cluster共享缓存,避免 DB 直接暴露
L3MySQL持久化存储

✅ 核心原则:先查快的,再查慢的,尽量不让请求落到数据库!


三、第一步:添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

四、第二步:配置 Caffeine 本地缓存


   {
    
     Cache<Long, User>  {
         Caffeine.newBuilder()
                .maximumSize() 
                .expireAfterWrite(, TimeUnit.MINUTES) 
                .recordStats() 
                .build();
    }
}
@Configuration
public
class
CacheConfig
@Bean("localUserCache")
public
localUserCache
()
return
10_000
// 最多缓存 1 万条
5
// 本地缓存 TTL 较短
// 开启统计

🔑 关键设计:本地缓存 TTL << Redis TTL(如 5min vs 30min),降低脏数据风险。


五、第三步:实现多级缓存 Service

@Service
public class UserService {
    @Autowired
    private Cache<Long, User> localUserCache;
    @Autowired
    private RedisTemplate<String, User> redisTemplate;
    @Autowired
    private UserMapper userMapper;
    
    private static final String REDIS_KEY_PREFIX = "user:";

    public User getUser(Long userId) {
        // 1. 查 L1 本地缓存
        User user = localUserCache.getIfPresent(userId);
        if (user != null) {
            return user;
        }
        
        // 2. 查 L2 Redis
        String redisKey = REDIS_KEY_PREFIX + userId;
        user = redisTemplate.opsForValue().get(redisKey);
        if (user != null) {
            // 回填本地缓存
            localUserCache.put(userId, user);
            return user;
        }
        
        // 3. 查 L3 数据库
        user = userMapper.selectById(userId);
        if (user != null) {
            // 写入 Redis(TTL 30 分钟)
            redisTemplate.opsForValue().set(redisKey, user, 30, TimeUnit.MINUTES);
            // 写入本地缓存(TTL 5 分钟)
            localUserCache.put(userId, user);
        }
        return user;
    }

    // 更新时清除各级缓存
    public void updateUser(User user) {
        userMapper.updateById(user);
        // 清除 Redis
        redisTemplate.delete(REDIS_KEY_PREFIX + user.getId());
        // 清除本地缓存(仅本机)
        localUserCache.invalidate(user.getId());
        // 注意:其他机器的本地缓存无法清除 → 接受短暂不一致
    }
}

六、解决三大核心挑战

挑战 1️⃣:缓存一致性
  • 问题:更新 DB 后,其他机器的本地缓存仍是旧值
  • 解决方案:
    • 短 TTL:本地缓存自动过期(最终一致)
    • 主动失效:通过 MQ 广播清除指令(高级方案)
// 发送缓存失效消息
mqProducer.send("cache-invalidate", "user:" + userId);
// 其他节点监听并执行
localCache.invalidate(userId);
挑战 2️⃣:缓存穿透
  • 问题:查询不存在的用户 ID,反复打到 DB
  • 解决方案:
    • 布隆过滤器:预加载所有有效 ID
    • 空值缓存:
if (user == null) {
    redisTemplate.opsForValue().set(redisKey, NULL_PLACEHOLDER, 2, TimeUnit.MINUTES);
    localUserCache.put(userId, NULL_PLACEHOLDER);
}
挑战 3️⃣:缓存雪崩 & 击穿
  • 击穿:热点 key 过期瞬间高并发
    • 解决:本地缓存 + Redis 双重保护(本地缓存扛住瞬时流量)
  • 雪崩:大量 key 同时过期
    • 解决:TTL 加随机值
long ttl = 30 + new Random().nextInt(10); // 30~40 分钟
redisTemplate.expire(redisKey, ttl, TimeUnit.MINUTES);

七、性能对比:单级 vs 多级缓存

指标仅 RedisCaffeine + Redis
平均延迟1.2 ms0.3 ms
Redis QPS100,00010,000
数据库 QPS5,000500
P99 延迟3.5 ms0.8 ms

📊 结论:多级缓存可降低 90%+ 的下游压力,同时提升 3~4 倍响应速度!


八、生产环境最佳实践

✅ 监控指标
  • 本地缓存命中率(目标 > 80%)
  • Redis 命中率(目标 > 95%)
  • 缓存加载失败次数
✅ 适用数据类型
  • ✅ 配置信息(运营开关)
  • ✅ 字典表(国家、城市)
  • ✅ 热点商品/文章
  • ❌ 用户私有数据(如购物车)→ 用 Redis 即可
✅ 容量控制
  • 本地缓存必须设 maximumSize
  • 避免缓存大对象(如图片、长文本)

目录

  1. 一、前言:为什么单层缓存不够用?
  2. 二、多级缓存架构设计
  3. 2.1 典型三级架构
  4. 2.2 各层职责
  5. 三、第一步:添加依赖
  6. 四、第二步:配置 Caffeine 本地缓存
  7. 五、第三步:实现多级缓存 Service
  8. 六、解决三大核心挑战
  9. 挑战 1️⃣:缓存一致性
  10. 挑战 2️⃣:缓存穿透
  11. 挑战 3️⃣:缓存雪崩 & 击穿
  12. 七、性能对比:单级 vs 多级缓存
  13. 八、生产环境最佳实践
  14. ✅ 监控指标
  15. ✅ 适用数据类型
  16. ✅ 容量控制
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • PentAGI AI 自动化渗透工具 Docker 部署指南
  • 2026 年推荐的 5 款主流 React UI 组件库
  • 使用 Gitee、PicGo 和 Typora 搭建免费个人笔记工具
  • 栈数据结构详解与算法应用实例
  • 多模态 RAG 在企业数智化场景中的设计与优化
  • 网络安全转行学习建议与成长路径指南
  • Kubernetes Helm 构建无端口类型 Chart 实践
  • DBeaver 安装与 MySQL 数据库连接配置
  • 小米智能家居接入 Home Assistant 配置指南
  • Apache SeaTunnel Web 从零搭建可视化数据集成平台
  • 10 款主流 UI 设计工具深度评测:从原型到交付的全链路选择
  • 免费版 Trae 编辑器实测:i18n 任务排队千名与死循环隐患
  • JAVA 大型 ERP 进销存财务一体化源码及搭建说明
  • 大语言模型:基础架构与前沿技术演进
  • NestJS InstanceWrapper 深度解析与前端缓存架构借鉴
  • AI 辅助 imToken 生态智能合约交互与监控脚本开发
  • Git 分支管理完全指南:从创建、合并到冲突解决
  • 使用 MCP-Server 插件将 Dify 工作流发布为第三方服务
  • Python 自动化办公:使用 xlutils 修改 Excel
  • Fooocus 部署实战:从本地环境搭建到云端快速启动

相关免费在线工具

  • 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