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篇

相关推荐
_UMR_19 分钟前
springboot集成Jasypt实现配置文件启动时自动解密-ENC
java·spring boot·后端
程序员小假25 分钟前
我们来说说 Cookie、Session、Token、JWT
java·后端
短剑重铸之日44 分钟前
《SpringBoot4.0初识》第一篇:前瞻与思想
java·开发语言·后端·spring·springboot4.0
it_czz1 小时前
LangSmith vs LangFlow vs LangGraph Studio 可视化配置方案对比
后端
蓝色王者1 小时前
springboot 2.6.13 整合flowable6.8.1
java·spring boot·后端
花哥码天下2 小时前
apifox登录后设置token到环境变量
java·后端
廋到被风吹走3 小时前
【Spring】Spring MVC核心原理与RESTful最佳实践详解
spring·mvc·restful
hashiqimiya3 小时前
springboot事务触发滚动与不滚蛋
java·spring boot·后端