• 缓存穿透、缓存击穿、缓存雪崩


    1、缓存穿透

      当查询一条数据,该数据不存在缓存和数据库的时候,每次请求都会请求到数据库。这种现象就叫缓存穿透

      当一个人拿一个并不存在的 id 一直查询,就会产生大量的请求到数据库查询,数据库就可以因为压力过大而崩掉。

      解决办法:

        1)、可以为这些查询不到的 id 在缓存中设置为 key,值设置为 null,这样就可以直接从缓存中拿到不需要请求数据库;

        2)、用一个布隆过滤,如果不存在布隆过滤中,说明肯定肯定不存在于缓存和数据库中。

      优缺点:第一种解决方法,如果是攻击的时候用大量不存在的 id 去请求,可能在缓存中产生大量的 key 和 值 null,可能会不太适合。第二种方案可以直接过滤掉不存在的 id,这样对缓存的压力不大。

    2、缓存击穿

      在高并发系统中,大量的请求同时查询一个 key 时,而这个 key 正好失效,就会导致大量的请求都到数据库。这种现象就叫缓存击穿

      可能会造成数据库请求量过大,压力增大。

      解决办法:高并发是多线程同时去请求,可以在第一个查询数据的请求上使用一个互斥锁,其他线程到达缓存就等待。等第一个线程查询到数据,缓存到缓存工具里,然后第二个线程就可以拿到数据了。

    3、缓存雪崩

      某一时刻发生大规模的缓存失效的情况,比如缓存服务器停电,宕机等。此时请求就会大量到数据库。这种现象就叫缓存雪崩

      解决办法:使用集群缓存,分布式架构。并且使用 Hystrix 限流&降级,当发生很多失败的请求时,就对请求限流或者降级。开启缓存持久化机制,尽快恢复缓存集群。

  • 相关阅读:
    C#面向对象
    CSS样式表---------第三章:样式属性
    CSS样式表-------第二章:选择器
    CSS样式表------第一章:样式表的基本概念
    解决Web部署 svg/woff/woff2字体 404错误
    sql server 2012 如何收缩事务日志
    input file类型,文件类型的限制
    C#对XML、JSON等格式的解析
    SQL实现表名更改,列名更改,约束更改
    sql 坐标距离排序计算距离(转)
  • 原文地址:https://www.cnblogs.com/AlmostWasteTime/p/10630946.html
Copyright © 2020-2023  润新知