布隆过滤器浅析

背景

布隆过滤器是一个叫Bloomer的哥们基于哈希算法改进发明的一种应用,应用面很多很广啦,经常见到网站、Redis等都会提到布隆过滤器等等…

概念

布隆过滤器如其名是一种过滤器,过滤啥?基本场景就是,有1条数据A,让程序(过滤器)判断这条数据在某张表T中有没有。对于布隆过滤器来说,它能给出下面2种答案中的1种。

  1. 数据A在表T中不存在。
  2. 或者告诉你:数据A在表T中可能是存在的。

对于布隆过滤器来说,上面的答案2选1,布隆过滤器只能回答你1或2。将上面布隆过滤器的逻辑做个不恰当的比喻。你是一个腰缠万贯的土豪,偶尔也会马虎在自己家门口掉(人民币)毛票。有一别人在你家门口捡了钱,人家问你,这钱是你的吗?你看了看钱,然后回答:

  1. 你捡的这钱是美元啊,一定不是我的!
  2. 你捡的这钱是(人民币)毛票,有可能是我的。

当然,对于上面答案1来说,是存在一定误报率的!!!

特点

布隆过滤器有以下特点:

  1. 基于HASH算法实现,HASH计算时间复杂度是O(1)。
  2. 正是基于HASH算法,为了保证HASH低冲突率,需要使用大量的内存空间,导致空间利用效率不高,于是采用了多HASH组合函数减少冲突概率,提高空间使用率,多HASH计算时间复杂度是N*O(1),N是哈希函数个数。
  3. 适用于判断"某样东西一定不存在"这类场景。
  4. 传统的Bloomer不支持删除操作,删除了会有问题的,但是有些变种的Bloomer支持删除。

原理

链接原理介绍的比较全面,不码字了。
引用链接:https://www.jianshu.com/p/2104d11ee0a2

参数选择

同引用:https://www.jianshu.com/p/2104d11ee0a2
k:哈希函数数量
m:过滤器长度(占用的空间大小)
n:插入的元素个数
p:误报率

公式:
m = -nlnp/(ln2)^2
k = m/n(ln2)
PS: ln是以e为底!!!
一般情况下使用逻辑:我有一个业务场景,知道大概要判断多少数据量(n),根据业务容忍度设定一个误报率(p)。通过公式,可求得REDIS中需要使用的内存占用量(m),以及需要使用的哈希函数个数(k),哈希函数过多也会影响性能!

举个例子:
n = 10000 p = 0.001 时,(对10000条记录进行判断,保持误报率万分之1)
根据公式可得m = 143775(准备143775这么大的空间,1个空间能存1条记录),k= 9.91(约10个哈希函数)。

应用场景

  1. 白名单过滤
    在布隆过滤器中的阵列位中的元素都是合法的,如果输入一个元素,被判定为不存在于阵列位中,可认为其是非法的。
  2. 防止缓存穿透
    业务中提供了对外暴露的某类可请求服务,当恶意WEB请求对查询键(KEY)中不存在的值进行查询请求,可通过布隆过滤器将其过滤掉,防止大量无效请求 压到 后端 系统(DB、逻辑层)中。

留个疑问,场景1,2中面临共同的挑战是,需要定期或有策略的从后台DB中将所有存在的(合法)KEY的哈希值更新到布隆过滤器的缓存中,如果没有及时更新KEY值,哪怕漏掉一个合法的KEY值,那么对于这个合法的KEY的请求,布隆过滤器也会将其过滤掉,相当于拒绝服务了。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_29047189/article/details/106760473
今日推荐