【数据结构】布隆过滤器 BoomFilter 的应用场景

前言

对比数据结构的区别,从其空间、时间复杂度下手观察。BoomFilter 特殊的地方在于它在元素存储上做了努力。本文归纳下 BoomFilter 与 HashTable 的区别,进而引出 BoomFilter 善于支持的应用场景。

1. 时间、空间复杂度

BoomFilter 与 HashTable 都用了hash函数对存储元素进行散列存储,查找的时候都是 O(1) 的时间复杂度。二进制数组存储散列值,两者都是 O(n) 的复杂度

2. BoomFilter 的取舍

BoomFilter 不会存储 元素,比如 “刘德华” 加入 BoomFilter 后会映射成为散列值。想用散列值还原 “刘德华” 则无法实现。这种取舍的效果:

  • 能让 BoomFilter 有比 HashTable 更少的元素存储空间 (HashTable 会把 “刘德华” 存进数据结构)
  • 失去了根据 key 查找 value 的能力,仅仅保留了 contains 的能力。

3. BoomFilter 能做什么

上文讲到, BoomFilter 保留了 contains 的能力,其实是不准确的。
BoomFilter contains 能力简述:

  • BoomFilter.contains(“刘德华”) == true => “刘德华” 可能在 元素集合中
  • BoomFilter.contains(“刘德华”) == false => “刘德华” 一定不在 元素集合中

具体原因可以看 [布隆过滤器BloomFilter] 举例说明+证明推导

综上,BoomFilter 能够断定元素不存在集合中,仅能推测元素可能在集合中(存在误差但是不大)。

4. BoomFilter 不能做什么

除了失去根据 key 查找 value 的能力,BoomFilter 天然不支持删除功能。其原因是 BoomFilter 不处理哈希冲突。举一个例子

未映射元素的 BoomFilter 
[0, 0, 0, 0, 0]
  • 加入刘德华
[0, 0, 0, 0, 0]
⬇
刘德华
⬇
hash映射为: [0, 1, 0, 0, 1]
⬇
加入 BoomFilter[0, 1, 0, 0, 1]
  • 加入张学友
[0, 1, 0, 0, 1]
⬇
张学友 (增量加入)
⬇
hash映射为: [0, 1, 0, 1, 0]
⬇
加入 BoomFilter (发生了hash冲突,但是第二位的 "1" 不做处理)[0, 1, 0, 1, 1]
  • 删除张学友
[0, 1, 0, 0, 1]
⬇
张学友 (删除)
⬇
hash映射为: [0, 1, 0, 1, 0]
⬇
踢出 BoomFilter[0, 0, 0, 1, 0]

删除张学友的同时,破坏了刘德华的元素映射,所以 BoomFilter 原生不支持删除操作

4.1 优化 BoomFilter

上文说到 BoomFilter 原生不支持删除操作,是因为 BoomFilter 不处理hash冲突。如果为二进制数组中的每个 “1” 维护一个计数器,就能标识hash冲突了。在删除元素的时候就不会把 “刘德华” 的 “1” 直接删除,而是让计数器 -1。通过一个简单的计数器,BoomFilter 又能支撑删除操作了。

5. BoomFilter 的误判及指导意义

[布隆过滤器BloomFilter] 举例说明+证明推导
这篇文章把误判率给推导出来了。我们可以得到一个结论:当哈希函数个数不变时,BoomFilter 中二进制“1” 的密度越大,误判率越高。为了减少误判率:

  • 提前训练 BoomFilter
    如果是白名单策略,可以把系统所有白名单都加入到 BoomFilter 中,在上线后尽量不维护元素。上线前根据 BoomFilter 的训练情况进行调参,使得 “1” 的密度减少。

  • BoomFilter.contains(“刘德华”) == true 依旧要做兜底策略
    只要存在误判的可能,通过BoomFilter校验的元素依旧可能不是白名单,要做权限控制或者服务降级的可能。

6. BoomFilter 的应用场景

6.1 业务系统应用

防止缓存穿透。作为热点数据(MySQL)的一个缓存层,如果查询的key不存在数据库,则不需要再访问数据库,缓解数据库的压力。

6.2 性能优化的应用

BoomFilter.contains("刘德华") == false 的结论特别好用。在IO操作时,提前判断有没有必要操作。在表链接时提前判断有没有必要链接都是很有用的。当然,训练BoomFilter的开销更节约成本时,优化才有意义。

后记

这次博文是看了 《Streaming System》后有的灵感。BoomFilter 处在大数据领域和Web开发领域的交集处。这个书把 BoomFilter 介绍的恰到好处。看这本书也算是了解了下大数据,对大数据领域又充满了敬畏。未来如果有大数据的工作任务,再回来啃这本书。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值