暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

想进大厂,不懂这 6 个布隆过滤器关键,面试必挂!

大头讲架构 2024-12-21
44

深入探究布隆过滤器:原理、应用与局限

在处理缓存相关问题时,想必大家对上一节提及的缓存穿透现象并不陌生。当频繁查询那些数据库中压根不存在的值时,系统压力骤增,缓存形同虚设,服务器苦不堪言。此时,布隆过滤器宛如一位 “救星” 闪亮登场,为我们巧妙化解难题。

布隆过滤器工作原理

布隆过滤器本质上是一串由二进制数字构成的序列,其中仅包含 “0” 和 “1” 两个元素,它们恰似信号灯,“0” 示意对应元素不存在,“1” 则暗示可能存在。


其工作流程犹如一场精密的 “定位游戏”。借助哈希算法,对需要处理的数据进行运算,而后将运算结果针对布隆过滤器的长度执行取余操作,通过这一操作精准锁定该数据在布隆过滤器中的具体位置,随即把对应位置的数值设定为 “1”。

不妨来看一个实例:假设有一个长度为 32 的布隆过滤器,初始状态为:

00000 00000 00000 00000 00000 00000 00

当我们缓存了值 “张三”,经过哈希计算:hash (张三) % 32 = 2 ,此时布隆过滤器摇身一变:

01000 00000 00000 00000 00000 00000 00

接着,又缓存了 “李四”,hash (李四) % 32 = 8 ,布隆过滤器更新为:

01000 00100 00000 00000 00000 00000 00

而当查询 “张三” 时,重复哈希取余流程,结果为 2,此时只需查看布隆过滤器第二位是否为 “1”。若为 “1”,表明 “张三” 有存在的可能性。这是为何呢?原因在于哈希算法存在冲突风险,也许其他值(如 “王五”)经哈希取余后同样指向位置 2,所以无法确凿判定就是 “张三” 存在,仅能知晓存在这种可能;反之,若该位为 “0”,则能笃定 “张三” 这个值一定不存在。如此一来,便成功实现将不存在的值 “拒之门外”,极大减轻后续查询压力。

布隆过滤器的缺点剖析

存在误判风险

如前文所述,哈希冲突是引发误判的 “罪魁祸首”。那该如何应对呢?一种可行策略是采用多次哈希运算。当多次哈希取余结果均为 “1” 时,元素存在的可信度随之提升,进而有效降低哈希冲突导致误判的概率。但只要我们核心诉求是精准筛除 “确定不存在” 的元素,那偶尔的误判在一定程度上是可接受的。

不支持删除操作

这一短板同样与哈希冲突紧密相连。鉴于存在误判可能,冒然删除元素极有可能 “误伤” 其他无辜值。不过,聪明的开发者们想出了应对之策:摒弃单纯的二进制存储,改用存储计数器的方式。

例如,“张三” 和 “王五” 的哈希计算结果都指向位置 2,此时布隆过滤器呈现:

02000 00100 00000 00000 00000 00000 00 当需要删除时,对应计数器减 1 即可。但这种方法也并非十全十美,相较于紧凑的二进制存储,存储数值类型无疑会消耗更多空间,在存储空间有限的场景下,这无疑是个棘手问题。 三、总结与应用思考

布隆过滤器作为应对缓存穿透等问题的得力工具,在使用前务必审慎考量应用场景。它恰似一把精准的 “筛子”,擅长剔除那些 “确定不存在” 的元素,在缓存体系中扮演着举足轻重的 “守门人” 角色。尽管存在误判风险以及删除不便等瑕疵,但通过巧妙运用多次哈希、合理权衡空间与功能需求等手段,能使其更好地服务于系统。

各位开发者朋友们,在实际项目搭建缓存架构时,不妨多问问自己:系统面临的缓存穿透压力有多大?是否能容忍一定程度的误判?存储空间是否宽裕?依据这些问题的答案,灵活抉择是否引入以及如何优化布隆过滤器,让系统性能得以飞跃提升。相信随着大家对布隆过滤器理解的逐步深入,定能在技术实践的道路上扬帆远航,打造出更加稳健、高效的系统架构。

此刻,关于布隆过滤器的奥秘已然呈现在大家面前,大家在使用过程中有遇到什么独特的问题或者巧妙的解决方案吗?欢迎在评论区分享交流,让我们携手共进,攻克更多技术难关。


文章转载自大头讲架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论