实战技巧、优化与常见问题
2025/9/17大约 3 分钟
Spring Cache 实战技巧、性能优化与常见问题
前置知识
建议你已掌握 Spring Cache 注解、实现与高级用法。
目录
开发调试实用技巧
- 日志调试:结合 @Slf4j 输出缓存命中/失效信息
- 单元测试:Mock CacheManager,验证缓存行为
- 缓存监控:Caffeine/Redis 支持监控命中率、容量等
- 参数调优:根据业务压力测试调整 maximumSize、expireAfterWrite 等
日志调试示例
@Slf4j
@Service
public class DemoService {
@Cacheable(value = "demo", key = "#id")
public String getData(Long id) {
log.info("查询数据库: {}", id);
return "data-" + id;
}
}
缓存设计与性能优化建议
- 热点数据优先缓存,低频数据不建议缓存
- 合理设置过期时间,防止缓存雪崩
- 分组与命名规范,如 user、product、order
- 避免大对象/大集合缓存,可拆分细粒度
- 结合 condition/unless 控制缓存粒度
- 多线程高并发场景建议开启 sync=true(Caffeine)
分布式一致性与多级缓存
- 多实例部署时推荐 Redis 等分布式缓存
- 多级缓存(本地+Caffeine+Redis)可提升性能,但需关注一致性
- 本地缓存失效后主动通知/定时清理,或用消息队列同步
多级缓存一致性方案
- 本地缓存失效时,主动清理 Redis
- Redis 变更时,发布消息通知各节点清理本地缓存
- 结合 Spring Event、MQ、Redisson 等实现
缓存安全与数据保护
- 敏感数据不建议缓存,如密码、Token 等
- 防止缓存穿透,空对象也缓存或用布隆过滤器
- 防止缓存污染,key 命名规范,避免 key 冲突
- 生产环境建议开启 Redis 认证与访问控制
常见报错与FAQ
常见报错
场景 | 报错信息 | 解决方案 |
---|---|---|
缓存未生效 | 无缓存命中 | 检查 @EnableCaching、注解、key 表达式 |
Redis 连接失败 | Connection refused | 检查 host/port/password、防火墙 |
Caffeine 缓存丢失 | 重启后数据丢失 | 需用 Redis 持久化 |
allEntries 无效 | 未清理全部缓存 | 检查 cacheName、allEntries=true |
缓存击穿/雪崩 | 数据库压力大 | 合理设置过期、sync、限流 |
FAQ
- Q: 如何动态指定缓存名称/Key?
A: 支持 SpEL 表达式,如 @Cacheable(value = "user", key = "#user.id+":info") - Q: 如何批量清理缓存?
A: @CacheEvict(allEntries = true) - Q: 如何只缓存部分结果?
A: 用 condition/unless 表达式灵活控制 - Q: 如何监控缓存命中率?
A: Caffeine/Redis 提供命中统计,或用 AOP 记录
学习资源与小结
- 推荐结合业务场景灵活设计缓存方案
- 性能、安全、监控同等重要
- 遇到问题优先查日志、官方文档、社区问答
- Spring Cache 是企业开发常用利器,深入理解有助于高效开发
本文为 Spring Cache 系列教程收官篇,感谢阅读,祝你学有所成!