布隆过滤器

引言

面试题
如何在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 @   月落随山隐  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示