Spring Boot 实用小技巧:多级缓存(Caffeine + Redis)- 第545篇

悟纤文章(文章累计540+)

《++国内最全的Spring Boot系列之一++ 》

《++国内最全的Spring Boot系列之二++ 》

《++国内最全的Spring Boot系列之三++ 》

《++国内最全的Spring Boot系列之四++ 》

《++国内最全的Spring Boot系列之++ ++五++ 》

《国内最全的Spring Boot系列之六》

《国内最全的Spring Boot系列之七》

《国内最全的Spring Boot系列之八》

Docker中部署SpringBoot项目,超详细教程 - 第540篇

IDEA:别再用 StringBuilder 拼命了,用 + 吧 - 第541篇

实战派 Spring Boot:7个你一定用得上的技巧 - 第542篇

你以为你会写测试?Spring Boot 还藏了这些招!---让你的Spring Boot 测试不再只是"点个运行" - 第543篇

当生产环境卡成 PPT:Spring Boot 线程 Dump 捉妖指南 - 第544篇

学 Spring Boot,就找悟纤 !

为什么要整多级缓存?

先问大家一个问题:

如果你有个土豪朋友(Redis),存了海量的数据,但是每次找他借钱(查缓存),都要打车去他家(网络 IO)------你受得了吗?

所以,聪明的办法是:你自己家(Caffeine 本地内存)也藏点私房钱(热点数据)。

这样想买奶茶就不用总跑去找土豪了。

👉 本地(Caffeine) = 速度快

👉 分布式(Redis) = 数据全

二者合体 =天下无敌,缓存双保险。

实现步骤

1. 养一只本地仓鼠(Caffeine)

仓鼠的特点就是:存点东西在嘴里,随取随用,但存不下太多。

复制代码
@Beanpublic Cache<String, Object> caffeineCache() {    return Caffeine.newBuilder()            .expireAfterWrite(5, TimeUnit.MINUTES) // 5分钟后,仓鼠忘记藏在哪了            .maximumSize(10000)                    // 最多存10000个花生            .build();}

2. 搞个远房土豪亲戚(Redis)

Redis 就是"远方的超级仓库",虽然东西多,但去一趟要点时间。

Spring Boot 已经给你封装好了 StringRedisTemplate,直接用就行。

3. 联合经营(Caffeine + Redis)

写个多级缓存 Service,就像开个"夫妻店":

复制代码
public Object get(String key, Supplier<Object> dbLoader) {    // 1. 先问仓鼠    Object value = caffeineCache.getIfPresent(key);    if (value != null) return value;    // 2. 再问远房土豪    value = redisTemplate.opsForValue().get(key);    if (value != null) {        caffeineCache.put(key, value); // 顺手喂一口仓鼠        return value;    }    // 3. 最后没办法,只能自己干(查数据库)    value = dbLoader.get();    if (value != null) {        redisTemplate.opsForValue().set(key, value.toString(), 10, TimeUnit.MINUTES);        caffeineCache.put(key, value);    }    return value;}

这样一来:

l 热点数据:直接仓鼠嘴里掏,快到飞起⚡

l 冷门数据:去远房土豪家拿,再顺便塞给仓鼠,下次更快。

l实在没有:自己种地(查数据库)。

4. 更新数据的时候

仓鼠和土豪的记忆力都很差,你得提醒他们 "忘掉旧的":

复制代码
public void updateUser(User user) {    userRepository.save(user); // 更新数据库    cacheService.evict("user:" + user.getId()); // 叫仓鼠和土豪都忘了}

如果是分布式多节点,还可以让土豪(Redis)用 广播功能,大声喊一句:

l "兄弟们!旧数据别留了!"

l所有仓鼠就会集体清空对应缓存,保持一致。

使用效果

l 99%热门数据 → 仓鼠秒取

l 剩下的 1% → 远房土豪 Redis 出手

l数据全局一致,还省了一大堆 Redis QPS

注意事项

l 仓鼠(Caffeine)记性不好,要设好过期时间和数量,不然会撑爆内存。

l 土豪(Redis)偶尔会忘记,可以加随机过期时间,避免集体"失忆雪崩"。

l更新时别想着"改缓存",直接删掉就好,避免脏数据。

总结

多级缓存就像:

l 仓鼠负责速度,

l 土豪负责存量,

l 数据库是兜底。

这仨一组合,你的接口就能像点奶茶一样丝滑:

"Caffeine 秒回 → Redis 接力 → DB 补刀"。

如果你觉得这篇文章有用,欢迎点赞、分享、转发、投喂瓜子 🌰 ~

******学Spring Boot,就找悟纤!**咱们下期见!

历史文章(文章累计530+)

《++国内最全的Spring Boot系列之一++ 》

《++国内最全的Spring Boot系列之二++ 》

《++国内最全的Spring Boot系列之三++ 》

《++国内最全的Spring Boot系列之四++ 》

《++国内最全的Spring Boot系列之++ ++五++ 》

《国内最全的Spring Boot系列之六》

《国内最全的Spring Boot系列之七》

《国内最全的Spring Boot系列之八》

Spring Boot实用小技巧11 - 第533篇

Viggle Api上线V3-beta模型,圣诞节跳舞视频来临

Suno Api V4 - Suno Api系列教程,耗费1个星期,输出14篇文章

Viggle AI开放照片唱歌API,新年快乐唱起来

Docker入门篇SpringBoot之Docker实战系列 - 第534篇

Docker 的安装和基本使用SpringBoot之Docker实战系列 - 第535篇

国内最全的Spring Boot系列之八 ------ 汇聚8年500多篇文章,值得收藏

Docker 基本概念SpringBoot之Docker实战系列 - 第536篇

Docker 使用镜像SpringBoot之Docker实战系列 - 第537篇

Docker 操作容器SpringBoot之Docker实战系列 - 第538篇

Docker 仓库/私有仓库SpringBoot之Docker实战系列 - 第539篇

Docker中部署SpringBoot项目,超详细教程 - 第540篇

IDEA:别再用 StringBuilder 拼命了,用 + 吧 - 第541篇

实战派 Spring Boot:7个你一定用得上的技巧 - 第542篇

你以为你会写测试?Spring Boot 还藏了这些招!---让你的Spring Boot 测试不再只是"点个运行" - 第543篇

当生产环境卡成 PPT:Spring Boot 线程 Dump 捉妖指南 - 第544篇

相关推荐
噢,我明白了3 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅3 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
GreenTea3 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
考虑考虑3 小时前
synchronized字符串常量
java·后端·java ee
m0_587383003 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
颜进强4 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
GetcharZp4 小时前
定位不再一个个吐坐标:英伟达 LocateAnything 上手全攻略
后端
需要8264 小时前
分布式事务:Seata AT/TCC/SAGA 的取舍与踩坑
java·spring boot·分布式·spring·spring cloud
m0_587383005 小时前
深圳24小时自助健身房解决方案实战:从系统架构到部署指南
java·人工智能·spring boot·spring·系统架构·需求分析
郑州光合科技余经理5 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程