缓存穿透、缓存雪崩、缓存击穿
文章图片
缓存穿透
缓存穿透的意思是查询一个一定不存在的数据,因为缓存中没有这个信息,则会去数据库查询,从系统层面来看就像穿透了缓存层,直接到达db进行查询,从而称为缓存穿透。失去了缓存层的保护,这种查询一定不存在的数据对系统来说是很危险的,如果有人恶意通过这种方式不停的请求数据库,会对数据库造成压力甚至会导致系统崩溃。
解决方案:
- bloom filter: 类似哈希表的一种算法,用所有可能的查询条件生成一个bitmap,在进行数据查询的时候,先用这个bitmap进行过滤,如果不存在其中,就直接过滤,从而减轻数据库层面的压力。Guava中有实现BloomFilter的算法。
- 空值缓存:一种比较简单的解决方法,在第一次查询完不存在的数据后,将key和空值也缓存起来,并设置较短的失效时间,例如60s。这样则可以避免短时间的大量该key的攻击,设置较短时间的失效时间是因为该值可能与业务无关,存在的意义不大,且该次查询未必是攻击者发起,无过久存储的必要。
解决方案:
- 线程互斥:只让一个线程构建缓存,其他的线程等待缓存构建完毕直接从缓存中拿数据,这个时刻只有一个线程在执行请求,减轻了db的压力,但缺点也很明显,降低了系统的qps。
- 交错失效的时间:这是一个比较简单粗暴的方法,既然同一时间失效会对db产生相当大的压力,那么我们就错开缓存失效的时间,在相对合理的区间内设置随机的失效时间即可。
【缓存穿透、缓存雪崩、缓存击穿】参考:https://www.cnblogs.com/zhangww/p/9942390.html
推荐阅读
- 一个人的碎碎念
- 野营记-第五章|野营记-第五章 讨伐梦魇兽
- Shell-Bash变量与运算符
- 清明,是追思、是传承、是感恩。
- 牛人进化+|牛人进化+ 按自己的意愿过一生
- 七老修复好敏感、角质层薄、红血丝
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 螃蟹和这些食物同吃,轻则腹泻、重则中毒!要小心哦~
- 八、「料理风云」