缓存 - 缓存名词学习

缓存穿透:

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

解决方案:

空值存储:

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

bloom filter:(待学习)

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

缓存雪崩:

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

解决方案

线程互斥:

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

交错失效时间:

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

缓存击穿

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

解决方案

二级缓存

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

posted @ 2019-08-22 14:09  amberbar  阅读(172)  评论(0编辑  收藏  举报