我正在努力理解布隆过滤器的用处。我得到了它的基础逻辑,空间压缩,快速查找,误报等。我只是不能将这个概念置于现实生活中,因为它是有益的。一个常见的应用是在Web缓存中使用bloom过滤器。我们使用bloom过滤器来确定给定的URL是否在缓存中。为什么我们不能简单地访问缓存来确定?如果我们得到肯定,我们仍然需要去缓存来检索网页(可能不存在),但是如果没有,我们可以使用缓存得到相同的答案(可能是为快速查找而优化的)无论如何?)。
答案 0 :(得分:31)
Bloom过滤器适用于假阴性是非常不好的情况并且可以接受假阳性的情况。
例如,假设您正在制作Web浏览器并拥有已知的诈骗网站黑名单。你的黑名单很庞大 - 数百GB - 所以你不能用浏览器发送它。但是,您可以将其存储在自己的服务器上。在这种情况下,您可以使用适当大小的Bloom过滤器运送浏览器,该过滤器包含所有URL。在访问网站之前,您可以在过滤器中查找它。然后,如果您收到“否”回答,则可以保证该URL不会被列入黑名单,只能访问该网站。如果您得到“是”答案,该网站可能是邪恶的,因此您可以让浏览器调用您的主服务器以获得真正的答案。您可以在不牺牲准确性的情况下将大量呼叫保存到服务器这一事实非常重要。
缓存的想法与此设置类似。您可以查询过滤器以查看该页面是否在缓存中。如果你得到一个“否”的答案,你可以保证它没有被缓存,并且可以通过昂贵的操作从主源获取数据。否则,您可以检查缓存以确定它是否真的存在。在极少数情况下,你可能需要检查缓存,看看它不在那里,然后从主源拔出,但你永远不会意外地错过缓存中的某些东西。
希望这有帮助!
答案 1 :(得分:3)
问题在于你的例子并不是那么好。
在网络缓存中,如果网址不存在,则无论如何都必须拨打昂贵的网络电话,因此保存磁盘访问权限不是什么大问题。所以你对此提出质疑(而且迭戈巴斯的评论并没有经过深思熟虑,imho)。
所以我去寻找你使用那个例子的原因。事实证明,维基百科文章提到鱿鱼网络缓存使用布隆过滤器。但他们按照你描述的方式 相反,它们用于决定从一组分布式缓存中选择哪个缓存。并且它们主要用于节省空间(因为squid可以缓存 lot 对象,因此这些表会非常大)。
有关squid和bloom过滤器的详细信息,请参阅http://wiki.squid-cache.org/SquidFaq/CacheDigests
否则,另一个来自templatetypedef的答案很好 - 检查不良网站是一个更好的例子。
答案 2 :(得分:3)
当满足以下条件的两个时,布隆过滤器可能很有用:
第一点非常简单。当布隆过滤器可以时,第二点通常变得很重要 存储在主存储器中但实际查找可能需要数据库命中,这相对于非常“昂贵” 在密钥上执行一些哈希值,然后进行内存中查找(即Bloom过滤器)。
如果只满足上述条件之一,则布隆过滤器不是解决问题的最佳方法。
当人们可以消除代价高昂的查询时会节省成本,因为众所周知,不可能获得匹配。这是第一点的值 - 布隆过滤器不会产生错误否定,因此如果在过滤器中找不到匹配,则无法检索与密钥关联的数据的下一个更昂贵的步骤。
当过滤器遇到命中时,需要进行代价高昂的查询以验证命中(消除误报)并检索相关数据。这里有可能由于误报而找不到任何东西,这就是为什么需要调整滤波器以将此风险降至可接受的水平。功能性布隆过滤器必须具有较低的误报率,因此查找的总体成本仍然很低。
现在,如果您的缓存已经为快速查找进行了优化,那么Bloom过滤器的实用程序可能会出现问题。