1.什么是布隆过滤器
布隆过滤器是一个叫“布隆”的人提出的,本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure)。它本身是一个很长的二进制向量,特点是高效地插入和查询,可以用来确定 “某一条数据一定不存在或者可能存在一个集合中”。
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少(因为是个二进制的向量),但是缺点是其返回的结果是概率性的,而不是确切的。
2.布隆过滤器数据结构
布隆过滤器是一个 bit 向量或者说 bit 数组,长度为8的布隆过滤器,默认值都是0,就像下面这样:

如果我们要映射一个值到布隆过滤器中,需要使用多个不同的哈希函数生成多个哈希值,并将bit向量里位置 等于哈希值的元素设置为1。例如针对值 userId=10的数据 进行三个不同的哈希函数分别生成了哈希值 1、4、7,则布隆过滤器转变为:

我们现在再存一个值 userId=18的数据,如果三次哈希函数返回0、 4、6 的话,布隆过滤器图继续变为:

需要注意的是:bit向量index=4位置由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。现在如果想查询 userId=20 这个数据在布隆过滤器中是否存在,三次哈希函数返回了 1、5、7三个值,结果发现 bit向量index=4位置的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说userId=20 这个数据不存在布隆过滤器中。
而当查询 userId=10 这个数据是否存在的话,那么三次哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么可以说 userId=10 这个数据在布隆过滤器中存在了么?答案是不一定,只能是 userId=10 这个值可能存在。为什么是这样呢?因为随着增加的数据越来越多,被置为 1 的 bit 位也会越来越多,比如某个userId=1的数据即使没有被存储过,但是万一三次哈希后返回的三个 bit 位都被其它值置位了 1 ,那么还是不能判断 userId=1 这个值在布隆过滤器中存在。
所以得出了布隆过滤器的结论:可以用来

本文深入探讨布隆过滤器的工作原理,包括其数据结构特点、误报率影响因素及最佳实践。介绍了布隆过滤器在黑名单过滤、防止缓存击穿等场景的应用,并提供了guava和redis实现布隆过滤器的代码示例。
最低0.47元/天 解锁文章
1185

被折叠的 条评论
为什么被折叠?



