zoukankan      html  css  js  c++  java
  • 缓存

    缓存穿透:

    查询一个不存在的数据,缓存中没有该数据信息,直接去数据库层进行查询。从整体上看,就仿佛穿透了缓存直接到达数据库,从而称为缓存穿透。没有缓存的保护,这种查询不存在的数据对系统有可能造成危害,如果有人恶意频繁查询不存在的数据攻击系统,请求直接到达数据层会导致db瘫痪引起系统故障。

    解决方案:

    空值存储:

    一种简单的解决办法,在第一次查询完不存在的数据后,可以将该key进行空值存入缓存中,只是设定较短的失效时间。这样可以应对段时间的大量的该key攻击,之所有设置较短时间是因为该至无业务上的意义,因此没有必要过久存储。

    bloom filter:(待学习)

    类似于哈希表的一种算法,用所有可能的查询条件生成一个bitmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。guava中有实现BloomFilter算法

    缓存雪崩:

    缓存一般都有失效时间,如果缓存同一时间失效,那么大量的请求就会直达数据库,db可能无法承受如此大的压力导致系统崩溃。

    解决方案

    线程互斥:

    只让一个线程构建缓存,其他线程等待构建缓存的线程执行完,重新从缓存获取数据才可以,每个时刻只有一个线程在执行请求,减轻了db的压力,但缺点也很明显,降低了系统的qps。

    交错失效时间:

    这种方法时间比较简单粗暴,既然在同一时间失效会造成请求过多雪崩,那我们错开不同的失效时间即可从一定长度上避免这种问题,在缓存进行失效时间设置的时候,从某个适当的值域中随机一个时间作为失效时间即可。

    缓存击穿

    缓存击穿实际上是缓存雪崩的一个特例,大家使用过微博的应该都知道,微博有一个热门话题的功能,用户对于热门话题的搜索量往往在一些时刻会大大的高于其他话题,这种我们成为系统的“热点“,由于系统中对这些热点的数据缓存也存在失效时间,在热点的缓存到达失效时间时,此时可能依然会有大量的请求到达系统,没有了缓存层的保护,这些请求同样的会到达db从而可能引起故障。击穿与雪崩的区别即在于击穿是对于特定的热点数据来说,而雪崩是全部数据。

    解决方案

    二级缓存

    对于热点数据进行二级缓存,并对于不同级别的缓存设定不同的失效时间,则请求不会直接击穿缓存层到达数据库。

  • 相关阅读:
    图的m着色问题 (回溯搜索)
    部落卫队 (回溯搜索)
    子集和问题 (回溯搜索)
    有重复元素的排列问题
    分书 回溯搜索
    选择工作 回溯搜索
    Problem E 
    Problem B
    Problem A
    Problem A
  • 原文地址:https://www.cnblogs.com/amberbar/p/11393998.html
Copyright © 2011-2022 走看看