缓存 - 缓存名词学习
缓存穿透: 查询一个不存在的数据,缓存中没有该数据信息,直接去数据库层进行查询。从整体上看,就仿佛穿透了缓存直接到达数据库,从而称为缓存穿透。没有缓存的保护,这种查询不存在的数据对系统有可能造成危害,如果有人恶意频繁查询不存在的数据攻击系统,请求直接到达数据层会导致db瘫痪引起系统故障。 解决方案: 空值存储: 一种简单的解决办法,在第一次查询完不存在的数据后,可以将该key进行空值存入缓存中,只是设定较短的失效时间。这样可以应对段时间的大量的该key攻击,之所有设置较短时间是因为该至无业务上的意义,因此没有必要过久存储。 bloom filter:(待学习) 类似于哈希表的一种算法,用所有可能的查询条件生成一个bitmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。guava中有实现BloomFilter算法 缓存雪崩: 缓存一般都有失效时间,如果缓存同一时间失效,那么大量的请求就会直达数据库,db可能无法承受如此大的压力导致系统崩溃。 解决方案 线程互斥: 只让一个线程构建缓存,其他线程等待构建缓存的线程执行完,重新从缓存获取数据才可以,每个时刻只有一个线程在执行请求,减轻了db的压力,但缺点也很明显,降低了系统的qps。 交错失效时间: 这种方法时间比较简单粗暴,既然在同一时间失效会造成请求过多雪崩