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

    1、缓存穿透

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

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

      解决办法:

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

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

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

    2、缓存击穿

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

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

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

    3、缓存雪崩

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

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

  • 相关阅读:
    logging日志模块
    mysql数据库--explain(查询表是否走索引)各个字段含义
    函数的命名空间、作用域、闭包函数
    模块
    Hibernate Stack Overflow
    PostgreSQL ----- No relations found.
    spring杂记
    JUnit test case 执行顺序
    转换成maven时报错
    参考网页
  • 原文地址:https://www.cnblogs.com/AlmostWasteTime/p/10630946.html
Copyright © 2011-2022 走看看