26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?

146 阅读3分钟

缓存雪崩(大面积风险)

  • 基本概念:大量请求无法在redis中处理,最终都转发到数据库层,导致数据库压力激增

  • 导致出现雪崩的原因

    • 缓存中大量数据同时过期
    • redis实例发生故障宕机
  • 缓存中大量数据同时过期的解决方案\

    • 首先避免给大量数据相同的过期时间,随机增加一些过期时间(随机增加1~3min)

    • 其次可以采用服务降级

      • 针对非核心数据,暂停从缓存中查询数据
      • 核心数据,查询缓存,缓存缺失就读数据库
  • redis实例发生故障宕机的解决方案\

    • redis实例一般可以支持数万请求的吞吐量,数据库支持千级别的请求吞吐量

    • 首先可以在业务系统中实现服务熔断或者请求限流(事后处理)

      • 熔断是防止引发连锁的数据库雪崩,最终导致整个系统崩溃  直接返回静态数据,避免产生更坏的影响

        • 需要时刻监控负载指标  每秒请求数、CPU 利用率、内存利用率
      • 限流是指业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求被发送到数据库

        • 将流量限制在数据库可处理的范围内
    • 其次 事前预防

      • 通过主从节点的方式构建 Redis 缓存高可靠集群\

\

缓存击穿(热点数据)

  • 基本概念:针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增
  • 出现的原因:参考缓存雪崩
  • 解决办法:可以针对热点数据不设置过期时间(确定不用后手动删除掉)

\

缓存穿透

  • 基本概念:缓冲中和数据库都没有的数据,导致每次都需要到数据库中查询

  • 出现的原因:

    • 缓存中的数据和数据库中的数据被误删除了,所以缓存和数据库中都没有数据\

    • 恶意攻击

  • 解决方案

    • 1.缓存空值或缺省值,避免大量穿透请求

    • 2.使用布隆过滤器  bitmap+hash值 会拦截大量请求

      • 写操作

        • 使用n个hash函数计算hash值
        • 对bitmap取模
        • 将bitmap设置为1
      • 读操作

        • 计算hash\

        • 取模

        • 判断是否为1

    • 3.前端进行请求检测

      • 原因:大量的恶意请求访问不存在的数据,进行合理的参数校验\

\

总结

  • 只要发生缓存雪崩、击穿和穿透就会导致所有请求到达数据库层,最终导致数据库当或故障

  • 缓存雪崩和击穿是因为数据没有在缓冲中

  • 缓存长投是既不在缓存中也不在数据库中

  • 其中

    • 熔断和限流是有损方案

    • 尽量使用预防式方案

      • 针对缓存雪崩,合理地设置数据过期时间,以及搭建高可靠缓存集群\

      • 针对缓存击穿,在缓存访问非常频繁的热点数据时,不要设置过期时间\

      • 针对缓存穿透,提前在入口前端实现恶意请求检测,或者规范数据库的数据删除操作,避免误删除