布隆过滤器的学习

布隆过滤器的学习

1、Bloom Filter是什么?

由一个初值为0的bit数组和多个hash函数构成,用于快速判断某个数据是否存在。

image-20220514144025724

当有变量加入集合时,通过N个hash函数映射到bit数组中,将其置为1

image-20220514144831054

查询某个变量的时候我们只要看看这些点是不是都是 1, 就可以大概率知道集合中有没有它了

2、Bloom Filter的特点

  • 高效地插入和查询,占用空间少
  • Bloom Filter判定存在,是极大可能在;判定不存在,则肯定不存在
  • 可以添加元素,但不能删除
  • 有误判率,只会发生在没有添加过的元素

3、Bloom Filter使用场景

3.1、解决缓存穿透问题

缓存穿透:

一般情况下,先查询缓存redis是否有该条数据,缓存中没有时,再查询数据库。

当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。

缓存透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。

使用布隆过滤器解决缓存穿透问题:

  1. 把已存在数据的key存在布隆过滤器中,相当于redis前面挡着一个布隆过滤器。
  2. 当有新的请求时,先到布隆过滤器中查询是否存在:
  3. 如果布隆过滤器中不存在该条数据则直接返回;
  4. 如果布隆过滤器中已存在,才去查询缓存Redis,如果Redis里没查询到则穿透到MySQL数据库
3.2、黑名单校验

假设黑名单的数量是数以亿计的,存放起来就是非常耗费存储空间的,布隆过滤器则是一个较好的解决方案。

把所有黑名单都放在布隆过滤器中,在收到邮件时,判断邮件地址是否在布隆过滤器中即可。

4、Bloom Filter实现步骤

  1. 初始化一个长度为m的bit数组

    image-20220514145926871

  2. 使用多个hash函数对key进行运算,得到下标索引,将其置为1,当实际长度大于初始化长度时,进行扩容

  3. 将key通过多个hash函数进行运算,查看对应位置是否全为1。全为1,则极可能存在。如果这几个位置有一个位为0,则不存在。可能出现误判,如:

y通过多个hash函数进行运算,查看对应位置是否全为1。全为1,则极可能存在。如果这几个位置有一个位为0,则不存在。可能出现误判,如:

image-20220514150530710

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redisson布隆过滤器是基于Redis实现的Java分布式布隆过滤器。它可以在多个JVM节点或其他进程中通过相同的KEY获取到布隆过滤器布隆过滤器的主要功能是判断某个元素是否存在于容器中,因此非常适合解决缓存穿透问题和检查数据是否重复的场景。使用Redisson布隆过滤器时,需要单独开一个定时任务来初始化布隆过滤器的数据,并在删除或更新数据时重新刷新布隆过滤器。虽然使用布隆过滤器可能稍显麻烦,但可以使用Redis的Set类型来替代。\[1\]\[2\] 在代码示例中,可以看到使用Redisson布隆过滤器的示例代码。首先通过redisson.getBloomFilter方法获取布隆过滤器实例,然后使用tryInit方法初始化布隆过滤器的容量和误差率。接下来可以使用add方法向布隆过滤器中添加元素,使用contains方法判断元素是否存在于布隆过滤器中。\[2\]\[3\] 总结来说,Redisson布隆过滤器是一种解决缓存穿透和检查数据重复的有效工具,但在使用时需要注意初始化和刷新布隆过滤器的操作。 #### 引用[.reference_title] - *1* *2* *3* [从头开始学Redisson--------布隆过滤器](https://blog.csdn.net/yanluandai1985/article/details/104848454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值