温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Cache缓存如何降低数据库压力

发布时间:2026-01-01 14:49:57 来源:亿速云 阅读:81 作者:小樊 栏目:编程语言

Java Cache 降低数据库压力的总体思路

  • 读多写少计算昂贵重复请求的结果放入缓存,命中后直接返回,避免访问数据库。
  • 通过合理的失效与更新策略保证缓存与数据库的一致性,避免脏读与过期堆积。
  • 在并发场景下用互斥/防击穿机制,在容量与可用性上做分层与高可用设计,防止缓存成为新的瓶颈。

缓存架构选型与适用场景

方案 典型技术 优点 局限 适用场景
本地内存缓存 Caffeine、Guava、Ehcache 访问极快、零网络开销、低延迟 容量受限、实例重启丢失、集群一致性差 单体或同实例内热点数据、配置/字典等
分布式缓存 Redis、Memcached 跨实例共享、高可用、可扩展 网络与序列化开销、一致性复杂 微服务、共享数据与高并发
多级缓存 本地 + Redis 兼顾性能与一致性、命中率更高 实现与维护复杂度更高 极致性能与热点明显的场景
说明:本地缓存适合“读多写少、数据量可控”的场景;分布式缓存适合“跨服务共享、横向扩展”的场景;多级缓存适合“热点集中、对延迟极敏感”的场景。

缓存读写策略与落地方式

  • 常用读写策略
    • Cache-Aside(旁路):读先查缓存,未命中回源数据库并回填;写先更数据库,再删缓存(下次按需回填)。实现简单、普适性强。
    • Read-Through:缓存未命中时由缓存组件自动调用“加载器”从数据库加载并写入缓存,对业务透明。
    • Write-Through:写入同时更新缓存与数据库,数据强一致但写放大,适合写后立即可读的场景。
    • Write-Behind(异步写回):先更新缓存,由后台批量写回数据库,吞吐高但存在数据丢失风险,需谨慎使用。
  • Spring Cache 快速落地
    • 依赖与启用:引入spring-boot-starter-cache,在启动类加**@EnableCaching**。
    • 常用注解:
      • @Cacheable:方法前先查缓存,命中直接返回;未命中执行方法并回填。
      • @CachePut:执行方法并用结果更新缓存(常用于更新场景)。
      • @CacheEvict:删除缓存(常用于删除/更新后失效)。
    • 示例(商品详情,防击穿用 sync):
      • @Service public class ProductService { @Autowired private ProductMapper productMapper; private static final String CACHE_PREFIX = “product:”; @Cacheable(value = “product”, key = “#id”, sync = true) public Product getProductById(Long id) { return productMapper.selectById(id); } @CacheEvict(value = “product”, key = “#product.id”) public void updateProduct(Product product) { productMapper.updateById(product); } } 以上策略与注解用法可显著降低数据库读/写次数,提升吞吐与稳定性。

高并发下的稳定性设计

  • 缓存穿透
    • 现象:查询不存在的数据导致每次都打到数据库。
    • 对策:缓存空对象(设置较短 TTL)、使用布隆过滤器前置拦截不存在的 key。
  • 缓存击穿
    • 现象:热点 key过期瞬间大量并发回源数据库。
    • 对策:互斥锁(只允许一个线程重建)、逻辑过期/永不过期 + 异步刷新(先返回旧值,后台更新)。
  • 缓存雪崩
    • 现象:大量 key 同时过期导致数据库瞬时压力骤增。
    • 对策:为 TTL 增加随机抖动、关键数据永不过期 + 异步更新、构建Redis 哨兵/集群提升可用性。
  • 其他要点
    • 合理设置 TTL/TTILRU/LFU 等淘汰策略,避免缓存膨胀与频繁重建。
    • 写策略尽量采用先更库后删缓存,必要时配合消息/延迟双删降低不一致窗口。

监控与容量规划

  • 明确缓存目标:设定命中率目标(如>95%)、平均回源时延数据库 QPS 下降幅度等可观测指标。
  • 容量与淘汰:结合对象大小与实例内存,设置maximumSizeexpireAfterWrite/Access,避免 OOM 与频繁淘汰。
  • 高可用与降级:Redis 采用主从/哨兵/集群;缓存异常时快速失败并回源数据库,同时限流保护后端。
  • 多级缓存联动:本地缓存设置较短 TTL做热点加速,Redis 作为一致性兜底,并在热点变更时主动批量失效相关前缀。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI