什么是布隆过滤器?
数据结构,做一些过滤性质的使用,或者是查找类型的,增加和查询比较快,缺点是有一定的误识别率,及删除比较困难
布隆过滤器原理:
参考文章:zhuanlan.zhihu.com/p/43263751
为什么有布隆过滤器?
从过滤的发展来讲,原有的从一堆数据中查找某一个数据,一般可使用hashMap等,时间复杂度o(1),但是随着数据量的增大,hashmap占据空间也越来越大,这是弊端,因此引申出新的查找方法--布隆过滤器来
布隆过滤器用法:
一般布隆过滤器提供两个方法:test--查询是否存在;add新增数据
- test方法:
- 返回false:说明一定不存在
- 返回true,可能存在,关于这块,布隆过滤器有个假正率的概念,随着数据的增大而增大,也与所用的hash函数有关系
布隆过滤器使用场景:
- Google 著名的分布式数据库 Bigtable 使用了布隆过滤器来查找不存在的行或列,以减少磁盘查找的IO次数
- 在很多Key-Value系统中也使用了布隆过滤器来加快查询过程,如 Hbase,Accumulo,Leveldb,一般而言,Value保存在磁盘中,访问磁盘需要花费大量时间,然而使用布隆过滤器可以快速判断某个Key对应的Value是否存在,因此可以避免很多不必要的磁盘IO操作,
- 比如高并发秒杀系统中抢红包系统中判断用户是否今天已领取红包
- 在爬虫系统中,我们需要对URL进行去重,已经爬过的网页就可以不用爬了。但是URL太多了,几千万几个亿,如果用一个集合装下这些URL地址那是非常浪费空间的。这时候就可以考虑使用布隆过滤器。它可以大幅降低去重存储消耗,只不过也会使得爬虫系统错过少量的页面。
- 邮箱系统的垃圾邮件过滤功能也普遍用到了布隆过滤器,因为用了这个过滤器,所以平时也会遇到某些正常的邮件被放进了垃圾邮件目录中,这个就是误判所致,概率很低。
- Redis防雪崩(缓存穿透)