防止缓存击穿?请用布隆过滤器!

作者:微信小助手

发布时间:2020-03-28T10:04:31

往期热门文章:

1、 往期精选优秀博文都在这里了!
2、start.aliyun.com 正式上线!极速构建 Spring Cloud 应用
3、腾讯和阿里在B站“打起来了”,你何时见过这场面?
4、面试必备41道 SpringBoot 面试题,不看亏大了!
5、差距大,没想到成人网站用的技术都甩我们几条街!

本文来源公众号:码洞

原文作者:卢玮,掌阅资深后端工程师

为什么引入

我们的业务中经常会遇到穿库的问题,通常可以通过缓存解决。如果数据维度比较多,结果数据集合比较大时,缓存的效果就不明显了。

因此为了解决穿库的问题,我们引入Bloom Filter。

适合的场景

  • 数据库防止穿库 Google Bigtable,Apache HBase和Apache Cassandra以及Postgresql 使用BloomFilter来减少不存在的行或列的磁盘查找。

    避免代价高昂的磁盘查找会大大提高数据库查询操作的性能。如同一开始的业务场景。如果数据量较大,不方便放在缓存中。需要对请求做拦截防止穿库。

  • 缓存宕机 缓存宕机的场景,使用布隆过滤器会造成一定程度的误判。

    原因是除了Bloom Filter 本身有误判率,宕机之前的缓存不一定能覆盖到所有DB中的数据,当宕机后用户请求了一个以前从未请求的数据,这个时候就会产生误判。

    当然,缓存宕机时使用布隆过滤器作为应急的方式,这种情况应该也是可以忍受的。

  • WEB拦截器 相同请求拦截防止被攻击。用户第一次请求,将请求参数放入BloomFilter中,当第二次请求时,先判断请求参数是否被BloomFilter命中。可以提�