布隆过滤器

引言

面试题
如何在10e的数据中,检查用户是否存在?

朴素方法:
在数据库里直接查,虽然可以建索引,10亿级的数据索引树也大的不得了。这种方式会产生性能问题,造成数据库的不太有价值的负载。

select count(1) from user_info where user_id = GGJHAGJH123123123123;

缓存方法:

SISMEMBER user_id_key GGJHAGJH123123123123

这个快是快,但是多少都得吃个几十G内存。
不过话又说回来,就算小公司,加个几十G内存也不算事。
不过话又说回来,作为一个开发工程师,要有追求,这么点事吃个几十G,都够跑一个大业务系统了。

布隆过滤器:
布隆过滤器的原理是,当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点(offset),把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:如果这些点有任何一个 0,则被检元素一定不在;如果都是 1,则被检元素很可能在。这就是布隆过滤器的基本思想。

原理

image

优缺点分析

  1. 存在误判率,比如假阳(实际上不存在,判定存在),因此如果需要严格判定存在行,需要进一步用其他方式来判定。
  2. 只能查询,不能取,毕竟元素值被hash后像地上层层叠叠的灰。
  3. 无法删除元素,只能重新加载。因为元素之间会有重叠的部分,如果删除的话,处理起来比较复杂,需要把占用那些位的元素都取出来重新映射一遍。

应用场景

布隆过滤器的主要用途,是根据其关键特性:快速确定目标值是不是不存在。目标值由布隆过滤器判定存在,并不能完全确定存在,还需要数据库查表等其他方式进一步确认。因此布隆过滤器可以作为一种优化手段,过滤手段,过滤非重复值。最合适的应用场景应符合以下条件:

  1. 数据量大,几千万、上亿,用redis或者Map等方式比较浪费内存的场景。
  2. 需要查重。

参考文献

[1] https://juejin.cn/post/7038779056996745224
[2] https://juejin.cn/post/7293786247655129129

posted @ 2023-12-05 23:46  月落随山隐  阅读(33)  评论(0)    收藏  举报