spring boot 使用缓存的场景
【摘要】 在 Spring Boot 中,缓存(Caching)是一种优化性能、减少重复计算和数据库查询的有效手段。以下是适合使用缓存的典型场景及注意事项: 1. 适合使用缓存的场景 (1) 频繁读取但较少修改的数据示例:配置信息(如系统参数、静态字典)。商品详情、用户基本信息等(读多写少的业务数据)。天气数据、汇率等第三方 API 返回的稳定结果。原因:缓存可以避免每次请求都查询数据库或调用外部服务...
在 Spring Boot 中,缓存(Caching)是一种优化性能、减少重复计算和数据库查询的有效手段。以下是适合使用缓存的典型场景及注意事项:
1. 适合使用缓存的场景
(1) 频繁读取但较少修改的数据
- 示例:
- 配置信息(如系统参数、静态字典)。
- 商品详情、用户基本信息等(读多写少的业务数据)。
- 天气数据、汇率等第三方 API 返回的稳定结果。
- 原因:缓存可以避免每次请求都查询数据库或调用外部服务,显著降低响应时间。
(2) 计算密集型操作的结果
- 示例:
- 复杂的报表生成、数据分析结果。
- 机器学习模型的推理结果(如推荐系统)。
- 原因:缓存计算结果可以避免重复消耗 CPU 资源。
(3) 热点数据(Hot Data)
- 示例:
- 电商首页的促销商品列表。
- 社交媒体的热门话题或趋势。
- 原因:热点数据访问频率极高,缓存能大幅减轻后端压力。
(4) 分布式系统中的数据共享
- 示例:
- 多个微服务需要共享的参考数据(如国家列表、状态码)。
- 原因:通过分布式缓存(如 Redis)避免数据不一致和重复加载。
(5) 避免雪崩或穿透的中间层
- 场景:
- 高并发下防止数据库被击穿(如缓存空值或默认值)。
- 工具:结合布隆过滤器(Bloom Filter)或本地缓存(如 Caffeine)。
2. 不适合使用缓存的场景
- 数据频繁更新:缓存频繁失效会导致性能下降(如实时交易数据)。
- 数据量极大:缓存全部数据可能占用过多内存(如用户行为日志)。
- 强一致性要求:缓存与数据库的延迟可能导致数据不一致(如金融账户余额)。
- 一次性查询:仅执行一次的查询无需缓存。
3. Spring Boot 中缓存的实现方式
(1) 本地缓存(单机)
- 工具:
Caffeine
(推荐):高性能的 Java 缓存库,支持过期策略和大小限制。Guava Cache
:Google 的缓存库,功能类似但较旧。Ehcache
:支持分布式和持久化(但通常用于本地)。
- 配置示例(Caffeine):
spring: cache: type: caffeine caffeine: spec: maximumSize=1000,expireAfterWrite=10m
@Cacheable(value = "products", key = "#id") public Product getProductById(Long id) { return productRepository.findById(id).orElse(null); }
(2) 分布式缓存(集群)
- 工具:
- Redis:支持持久化、高可用和多种数据结构。
- Memcached:简单的键值存储,性能高但功能较少。
- 配置示例(Redis):
spring: cache: type: redis redis: time-to-live: 600000 # 缓存过期时间(毫秒)
@Cacheable(value = "users", key = "#username") public User getUserByUsername(String username) { return userRepository.findByUsername(username); }
(3) 自定义缓存
- 通过实现
CacheManager
接口,可以集成其他缓存系统(如 Hazelcast、Apache Ignite)。
4. 缓存策略与注意事项
- 过期策略:
- 设置合理的 TTL(Time To Live)避免数据过时。
- 使用
@CacheEvict
手动清除缓存(如数据更新时)。
@CacheEvict(value = "products", key = "#product.id") public void updateProduct(Product product) { productRepository.save(product); }
- 缓存穿透:
- 缓存空值或使用布隆过滤器拦截无效请求。
- 缓存雪崩:
- 随机化过期时间,避免大量缓存同时失效。
- 缓存一致性:
- 通过消息队列(如 Kafka)通知缓存更新(最终一致性模型)。
5. 总结
- 用缓存:读多写少、计算耗时、热点数据、分布式共享。
- 不用缓存:频繁更新、数据量大、强一致性、一次性查询。
- 工具选择:
- 单机应用:Caffeine。
- 分布式系统:Redis。
- 监控:使用 Spring Boot Actuator 或 Redis 监控缓存命中率(Hit Rate)。
通过合理使用缓存,可以显著提升系统性能,但需权衡一致性、内存占用和复杂度。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)