Bloomfilter 一般用于检测某元素是否在集合中存在,它的目标是解决在大数据量情况的元素判定。它的优点是它提供的数据结构具有非常高的时间查询和空间存储效率,缺点是可能造成误判,就是说,它判定某元素在集合中,但是其实有可能他不在集合里面,当然,反过来说,如果他判定元素不在集合里面,那么元素肯定是不在集合里面的。因此它的应用场景实用于能够容忍小概率事件的误判产生的情况,简而言之,以正确率换空间和时间。
目前的应用场景比较多,整理如下:
-
黑名单
最典型的一个应用就是黑名单功能,对用户名称或者IP或者Email进行过滤,每次检查时用key进行hash后,如果不在黑名单内的,肯定可以通行,如果在的则不允许通过,误判情况增加一个排除名单来进行排除。
误判情况:将正常用户判定为黑名单用户
-
爬虫重复URL检测
在爬取网站URL时,要检测这条URL是否已经访问过。
误判情况:没有访问过的误判为访问过
-
字典纠错
检查单词拼写是否正确
误判情况:错误的单词误判为正确。
-
磁盘文件检测
将磁盘中或者数据库中数据key存入该结构中,检测要访问的数据是否在磁盘或数据库中,然后再发起访问,避免空查询造成磁盘或数据库压力。
误判情况:不存在该数据却误判为有该数据。
-
CDN(squid)代理缓存技术
先查找本地有无cache,如果没有则到其他兄弟 cache服务器上去查找。为了避免无谓的查询,在每个cache服务器上保存其兄弟服务器的缓存关键字,以bloomfilter方式存储,再去其他cache服务器查找之前,先检查该结构是否有url,如果有存在url,再去对应服务器查找。
误判情况: 对应服务器不存在该URL的缓存。