布隆过滤器
引言
面试题
如何在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,则被检元素很可能在。这就是布隆过滤器的基本思想。
原理
优缺点分析
- 存在误判率,比如假阳(实际上不存在,判定存在),因此如果需要严格判定存在行,需要进一步用其他方式来判定。
- 只能查询,不能取,毕竟元素值被hash后像地上层层叠叠的灰。
- 无法删除元素,只能重新加载。因为元素之间会有重叠的部分,如果删除的话,处理起来比较复杂,需要把占用那些位的元素都取出来重新映射一遍。
应用场景
布隆过滤器的主要用途,是根据其关键特性:快速确定目标值是不是不存在。目标值由布隆过滤器判定存在,并不能完全确定存在,还需要数据库查表等其他方式进一步确认。因此布隆过滤器可以作为一种优化手段,过滤手段,过滤非重复值。最合适的应用场景应符合以下条件:
- 数据量大,几千万、上亿,用redis或者Map等方式比较浪费内存的场景。
- 需要查重。
参考文献
[1] https://juejin.cn/post/7038779056996745224
[2] https://juejin.cn/post/7293786247655129129
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)