zoukankan      html  css  js  c++  java
  • 缓存穿透、缓存击穿、缓存雪崩

    1、缓存穿透

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

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

      解决办法:

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

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

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

    2、缓存击穿

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

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

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

    3、缓存雪崩

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

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

  • 相关阅读:
    GitHub之初体验
    梦过去了
    转载:获取ISAPI_Rewrite重写后的URL
    看《分手合约》
    我们的家
    一盏灯的思考
    网站爱好者:开篇文
    致我们终将逝去的青春
    一起看看百度转码有多无耻!
    RPM
  • 原文地址:https://www.cnblogs.com/AlmostWasteTime/p/10630946.html
Copyright © 2011-2022 走看看