本地缓存+分布式缓存,性能翻倍还是踩坑?Caffeine+Redis实战全解析!
一、开场白:缓存用得好,系统跑得快!
还记得第一次做高并发接口优化,老板一句话:“加缓存!”我一拍脑门,Redis走起!结果流量一大,Redis压力山大,延迟飙升。后来加了本地缓存Caffeine,性能直接起飞!
今天咱们就聊聊,本地缓存和分布式缓存怎么协同用,Caffeine+Redis到底有啥门道?
二、为什么要本地缓存+分布式缓存?
单用Redis,网络IO、序列化、反序列化,还是有延迟,热点数据高并发下Redis也扛不住。
单用本地缓存,数据不一致、内存有限、重启就丢,分布式场景下很难hold住。
所以,本地缓存+分布式缓存=强强联合:
- 本地缓存(Caffeine):极致性能,纳秒级访问,适合热点数据、短时高频访问。
- 分布式缓存(Redis):数据共享、容量大、持久化,适合全局一致性和大数据量场景。
三、常见协同方案
1. 经典双层缓存架构
请求
|
v
Caffeine(本地缓存)
|
v
Redis(分布式缓存)
|
v
数据库
- 先查本地缓存,命中直接返回,速度飞快。
- 本地没命中,再查Redis。
- Redis也没命中,查数据库,回写到Redis和本地缓存。
2. Spring Cache一把梭
Spring Cache天然支持多级缓存,配合Caffeine和Redis,配置简单,开发无感知。
四、Caffeine+Redis实战配置
以Spring Boot为例,简单配置如下:
spring:
cache:
type: caffeine
caffeine:
spec: maximumSize=10000,expireAfterWrite=60s
redis:
host: localhost
port: 6379
Java代码示例:
@Cacheable(cacheNames = "user", key = "#userId")
public User getUser(Long userId) {
// 先查本地Caffeine,再查Redis,最后查数据库
return userMapper.selectById(userId);
}
只需加个注解,Spring帮你搞定多级缓存,开发体验贼爽!
五、常见“坑”与解决方案
1. 缓存一致性
多节点本地缓存,数据更新时容易不一致。常见做法:
- 缓存失效通知(如Redis发布订阅,通知各节点清理本地缓存)
- 设置较短的本地缓存TTL,降低不一致窗口
2. 缓存雪崩
热点数据同时失效,大量请求打到Redis甚至数据库。解决办法:
- 缓存过期时间加随机值,错峰失效
- 热点数据预热
3. 穿透与击穿
- 缓存穿透:查询不存在的数据,缓存空值
- 缓存击穿:热点key失效瞬间大量请求,提前加锁或互斥
六、最佳实践建议
- 热点数据优先本地缓存,极致性能。
- 本地缓存容量别太大,防止OOM。
- 本地缓存TTL要短,降低不一致风险。
- 结合Redis发布订阅,保证多节点一致性。
- 监控缓存命中率,动态调整策略。
七、总结
本地缓存+分布式缓存不是银弹,但用得好,性能真能飞。Caffeine+Redis组合拳,既快又稳,但也要注意一致性和容量管理。
关注服务端技术精选,获取更多后端实战干货!
你在多级缓存中遇到过哪些坑?欢迎在评论区分享你的故事!