什么是布隆过滤器?如何实现布隆过滤器?

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它基于位数组和多个哈希函数的原理,可以高效地进行元素的查询,而且占用的空间相对较小,如下图所示: 

 根据 key 值计算出它的存储位置,然后将此位置标识全部标识为 1(未存放数据的位置全部为 0),查询时也是查询对应的位置是否全部为 1,如果全部为 1,则说明数据是可能存在的,否则一定不存在

也就是说,如果布隆过滤器说一个元素不在集合中,那么它一定不在这个集合中;但如果它说一个元素在集合中,则有可能是不存在的(存在误差)

1.布隆执行过程

布隆过滤器的具体执行步骤如下:

  1. 在 Redis 中创建一个位数组,用于存储布隆过滤器的位向量。
  2. 初始化多个哈希函数,并将每个哈希函数的计算结果对应的位数组位置设置为 1。
  3. 添加元素到布隆过滤器时,对元素进行多次哈希计算,并将对应的位数组位置设置为 1。
  4. 查询元素是否存在时,对元素进行多次哈希计算,并检查对应的位数组位置是否都为 1。

2.布隆使用场景

布隆过滤器的主要使用场景有以下几个:

  1. 大数据量去重:可以用布隆过滤器来进行数据去重,判断一个数据是否已经存在,避免重复插入。
  2. 缓存穿透:可以用布隆过滤器来过滤掉恶意请求或请求不存在的数据,避免对后端存储的频繁访问。
  3. 网络爬虫的 URL 去重:可以用布隆过滤器来判断 URL 是否已经被爬取,避免重复爬取。

3.如何实现布隆过滤器?

在 Redis 中不能直接使用布隆过滤器,但我们可以通过 Redis 4.0 版本之后提供的 modules (扩展模块) 的方式引入,它的实现步骤如下。

① 打包RedisBloom插件

git clone github.com/RedisLabsMo…

cd redisbloom

make # 编译redisbloom

编译正常执行完,会在根目录生成一个 redisbloom.so 文件。

② 启用RedisBloom插件

重新启动 Redis 服务,并指定启动 RedisBloom 插件,具体命令如下:

redis-server redis.conf --loadmodule ./src/modules/RedisBloom-master/redisbloom.so

③ 创建布隆过滤器

创建一个布隆过滤器,并设置期望插入的元素数量和误差率,在 Redis 客户端中输入以下命令:

BF.RESERVE my_bloom_filter 0.01 100000

④ 添加元素到布隆过滤器

在 Redis 客户端中输入以下命令:

BF.ADD my_bloom_filter leige

⑤ 检查元素是否存在

在 Redis 客户端中输入以下命令:

BF.EXISTS my_bloom_filter leige

课后思考

以上我们介绍了什么是布隆过滤器?它的使用场景和执行流程,以及在 Redis 中它的使用,那么问题来了,在日常开发中,也就是在 Java 开发中,我们又将如何操作布隆过滤器呢?欢迎评论区留下您的实现方案。

本文已收录到我的面试小站 公众号:【技术分享官】,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 布隆过滤器(Bloom Filter)是一种数据结构,用于判断一个元素是否在一个集合中。它可以快速的判断出一个元素是否在集合中,但是可能会把不在集合中的元素误判成在集合中。因此,布隆过滤器并不能精确地判断一个元素是否在集合中,而是可以快速的判断出一个元素可能在集合中。 布隆过滤器实现方式通常是使用一个位数组和多个哈希函数。首先,创建一个由 0 和 1 组成的位数组,然后使用多个哈希函数对每个要添加到集合中的元素进行哈希。每个哈希函数会生成一个数字,该数字表示在位数组中的位置。将位数组中对应的位置的值设为 1,表示该元素可能在集合中。 当要判断一个元素是否在集合中时,同样使用多个哈希函数对该元素进行哈希,得到对应的位置。如果位数组中对应的位置的值都为 1,则该元素可能在集合中;如果位数组中对应的位置的值有 0,则该元素一定不在集合中。 布隆过滤器的优点在于,它可以快速的判断出一个元素是否在集合中 ### 回答2: 布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于集合中。它使用位数组和多个哈希函数来进行存储和判定。 布隆过滤器实现过程如下: 1. 初始化:创建一个长度为m的位数组,全部初始化为0。 2. 添加元素:将待添加的元素通过k个哈希函数分别映射到位数组的k个位置上,将这些位置的值设为1。 3. 判断元素是否存在:将待判断的元素同样通过k个哈希函数映射到位数组的k个位置上,如果发现其中任何一个位置的值为0,则说明该元素一定不存在于集合中;如果所有位置的值都为1,则该元素可能存在于集合中。 布隆过滤器的基本原理是通过哈希函数将元素映射到位数组上,从而实现高效的元素判定。它具有空间效率高、查询速度快的特点,但有一定的误判率。这是因为多个不同的元素可能映射到位数组的同一个位置上,因此当查询时,有可能判断某个元素存在于集合中,但实际上该元素并不存在。 布隆过滤器在实际应用中具有广泛的用途,如URL去重、缓存穿透、垃圾邮件过滤等。在设计时需要合理选择位数组长度(m)和哈希函数个数(k),以较小的误判率为前提,同时兼顾时间和空间效率。 ### 回答3: 布隆过滤器是一种数据结构,用于快速判断某个元素是否存在于一个大规模集合中。它通过使用位数组和多个哈希函数来实现。 在布隆过滤器中,首先需要创建一个长度为m的位数组,并将所有位初始化为0。同时,我们需要选择k个哈希函数,每个哈希函数将元素映射到位数组中的一个位上。 当要插入一个元素时,需要将该元素经过k个哈希函数得到对应的k个位置,并将这些位置的位值设为1。当要查询一个元素是否存在时,同样需要将该元素经过k个哈希函数,然后检查对应的k个位置的位值。如果其中任何一个位值为0,则表明该元素一定不存在于集合中。但如果所有位值都为1,则该元素可能存在或者是误判,可能需要进一步验证。 布隆过滤器实现主要依赖于位数组和哈希函数。位数组可以使用一个比特位模拟,节约存储空间。哈希函数可以选择常用的哈希函数,如MD5、SHA等,也可以使用布谷鸟哈希等特殊的哈希函数,以提高过滤器的效果。 然而,布隆过滤器也存在一些缺点。首先,无法删除已插入的元素,因为删除操作会影响到其他元素的判断结果。其次,布隆过滤器的判断结果有一定的误判率,即存在一定的概率将不存在的元素判断成存在。 布隆过滤器常被应用于快速判断一个元素是否存在,例如在大规模的缓存系统和分布式系统中,可以通过布隆过滤器减少对底层存储系统的查询次数,提高系统的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值