zoukankan      html  css  js  c++  java
  • Java微服务:缓存穿透和缓存雪崩

    Java微服务:缓存穿透和缓存雪崩

    缓存穿透

      缓存是对数据库的一道保护墙,缓存穿透就是冲破了我们的保护墙。即调用方传来的永远都是我们缓存中不存在的Key,这样每次都需要去数据库中查询一次,当大量这样的请求过来时,瞬时数据库的压力会很大,相当于没用到缓存,同时还增加了去缓存中查找数据的时间,这就是所谓的缓存穿透。

    解决方案

    • 将该Key缓存下来,以便下次走缓存。但是恶意估计下,Key肯定不固定,该方案没用。
    • 根据Key的规则做一些过滤,判断Key的合法性,不合法直接返回默认值。这种方案可以解决一部分问题,使用场景较少。
    • 通过布隆过滤器实现对缓存的校验。

    缓存雪崩

      缓存雪崩指的是,大量缓存同一时间失效,这样所有的请求都会直接去查询数据库,导致数据库压力过大,然后挂掉的情况。

    注:缓存穿透也可以导致缓存雪崩的发生,但是根本原因不一样,所以两个概念不能混用!

      缓存雪崩乐观情况下是存储层能抗住,但是用户体验会受到影响,数据返回慢,当压力过大时会导致存储层直接挂掉,整个系统直接挂掉。对于要做到99.99%高可用的产品,是绝对不允许出现缓存雪崩的现象。

    解决方案

    • 缓存存储高可用,比如Redis集群。
    • 缓存失效时间设置好,避免同一时间失效。
    • 热点数据,定时更新,避免自动失效。
    • 服务限流和接口限流。
    • 对数据库查询做优化,下策为加锁,可以避免数据库挂掉。

    参考资料

    • 《Spring Cloud微服务 入门、实战与进阶》
  • 相关阅读:
    分布式事务基本概念
    rocketmq源码分析3-consumer消息获取
    Mac下的Eclipse不能记住工作空间问题
    rocketmq源码分析2-broker的消息接收
    rocketmq源码分析1-benchmark学习
    metrics
    slf4j与logback对接是如何将日志写到控制台的
    Spring AOP
    hibernate数据库连接池,常用配置
    动态代理
  • 原文地址:https://www.cnblogs.com/MrSaver/p/13202669.html
Copyright © 2011-2022 走看看