06_布隆过滤器BloomFilter_副本

06——布隆过滤器BloomFilter

一、是什么

由一个初始值都为零的bit数组多个哈希函数构成,用来快速判断集合中是否存在某个元素

image-20230313220219220

设计思想:

1. 目的:减少内存占用
1. 方式:不保存数据信息,只是在内存中做一个是否存在的标记flag
1. 本质:判断具体数据是否在一个大的集合中

备注:布隆过滤器时一种类似set的数据结构,只是统计结果在巨量数据下有 小瑕疵,不够完美

image-20230313221000238

二、能干嘛

  1. 高效地插入和查询,占用空间少,返回的结果是不确定性+不够完美(哈希冲突)。
  2. 重点:一个元素如果判断结果:存在时,元素不一定存在,但是判断结果不存在时,则一定不存在。
  3. 布隆过滤器可以添加元素,但是不能删除元素,由于涉及hascode判断依据,删除元素会导致误判率增加。
  4. 总结:
    1. 有:可能有
    2. 无:一定无

三、原理

  1. 布隆过滤器实现原理和数据结构

    image-20230313221926014

    添加key与查询key

    image-20230313222003879

    hash冲突导致数据不准确

    image-20230313222316910

    查询某个变量的时候,只需要看看这些点是不是都是1,就可以大概率知道集合中是否存在了。

    如果这些点,有任何一个为零,则查询的key一定不存在。

    如果全部是1,则被查询的key很大概率存在。(因为使用的hash散列函数,会有碰撞冲突)

    正是基于布隆过滤器的快速检测特性,我们可以在把数据写入数据库时,使用布隆过滤器做个标记。当缓存缺失后,应用查询数据库时,可以通过查询布隆过滤器快速判断数据是否存在。如果不存在,就不用再去数据库中查询了。这样一来,即使发生缓存穿透了,大量请求只会查询Rdis和布隆过滤器,而不会积压到数据库,也就不会影响数据库的正常运行。布隆过滤器可以使用Rdis实现,本身就能承担较大的并发访问压边。

    hash函数冲突

    image-20230313222823506

    image-20230313222909547

  2. 使用步骤

    1. 初始化bitmap

    2. 添加元素占坑位

      image-20230313223405750

    3. 判断元素是否存在

      image-20230313223542751

  3. 布隆过滤器误判率,为什么不要删除

    布隆过滤器的误判是指多个输入经过哈希之后在相同的t位置1了,这样就无法判断究竞是哪个输入产生的,因此误判的根源在于相同的bt位被多次映射且置1。

    这种情况也造成了布隆过滤器的删除问题,因为布隆过滤器的每一个bt并不是独占的,很有可能多个元素共享了某一位。

    如果我们直接删除这一位的话,会影响其他的元素

    特性:布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。

  4. 总结

    1. 有:很可能有
    2. 无:一定无

    使用时最好不要让实际元素数量远大于初始化数量,一次给够,避免扩容

    当实际元素数量超过初始化数量时,应该对布隆过滤器进行重建,重新分配一个size更大的过滤器,再将所有的历史元素批量add。

四、使用场景

  1. 解决缓存穿透的问题,和redis结合bitmap使用

    image-20230313224636964

    image-20230313224736356

  2. 黑名单校验,识别垃圾邮件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t4q2Ghs9-1692427437178)(/Users/coder/Library/Application Support/typora-user-images/image-20230313224905294.png)]

  3. 安全连接网址,全球数10亿的网址判断

五、尝试手写布隆过滤器

  1. 整体架构

    image-20230313225140967

  2. 步骤设计

    redis的setbit和getbit

    image-20230313225324193

    setBit的构建过程

    1. 初始化白名单
    2. 计算元素的hash值
    3. 通过hash值计算对应二进制数组的坑位
    4. 将对应坑位的值修改为1,表示存在

    getBit查询是否存在

    1. 计算元素的hash值
    2. 通过hash值计算对应二进制数组的坑位
    3. 查看数组中对应位置上的值
  3. 编码实现

  4. 案例

六、布隆过滤器优缺点

  1. 优点:高效地插入和查询,内存占用bit空间少
  2. 缺点:
    1. 不能删除元素,因为存在哈希冲突,删除元素可能把其他元素的标志删除
    2. 存在误判,不能精准过滤

七、布谷鸟过滤器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值