如何通过Redis快速实现布隆过滤器?

360影视 2025-01-09 05:32 2

摘要:布隆过滤器是一种空间效率非常高的概率性数据结构,主要的作用是用来测试某个元素是否属于一个集合,能够实现用较少的空间来实现大数据量的存储,并且实现了快速查找操作。但是布隆过滤器可能会产生误报,也就是说通过布隆过滤器可以告诉你某个元素存在,但这个存在可能是一个误报

布隆过滤器是一种空间效率非常高的概率性数据结构,主要的作用是用来测试某个元素是否属于一个集合,能够实现用较少的空间来实现大数据量的存储,并且实现了快速查找操作。但是布隆过滤器可能会产生误报,也就是说通过布隆过滤器可以告诉你某个元素存在,但这个存在可能是一个误报。如果布隆过滤器告诉你某个元素不在集合中,那么就可以百分之百确定元素不在集合中。但可以确定的布隆过滤器是一定不会出现漏报的情况。

  布隆过滤器是通过一个位数组和多个哈希函数来实现数据管理的,基本工作流程如下所示。

第一步

  存在一个初始长度为m且初始元素数据都为0的位数组,这个位数组的每个位置都代表一个比特位,也就是存储1和0两个数据值。

第二步

  存在k个不同的哈希函数,每个哈希函数都可以接受一个元素作为输入然后返回一个索引位置来代表位数组中的某个索引位置。

第三步

  准备好之后,接下来就是执行元素添加操作。在向布隆过滤器中添加元素的时候,布隆过滤器会通过k个哈希函数来对元素进行计算,从而得到k个索引,这个时候,会将按照这k个索引将位数组中的对应索引位置上的数据都设置为1。

第四步

  当我们需要查询一个元素是否在这个集合中的时候,布隆过滤器通过k个哈希值的计算得到k个索引,然后判断这k个索引位置上的元素都为1的时候,就说明该元素存在于集合中,否则如果任意一个位置为零的时候就表示元素不在这个集合中。

  了解完其原理之后,接下来我们就来看看如何在Redis中快速实现布隆过滤器。

  在Redis中提供了内置的布隆过滤器的支持,我们可以通过redisBloom来实现布隆过滤器,如下所示,我们首先需要安装RedisBloom扩展模块。使用docker运行Redis并启用RedisBloom模块

docker run -d --name redis-bloom -p 6379:6379 redislabs/rebloom

  当然如果是采用源码的方式安装的话可以参考RedisBloom的官方文档。

  安装完成之后,我们就可以通过BF.RESERVE命令来初始化布隆过滤器,并且设置好期望的错误率以及容量信息,如下所示。

BF.RESERVE my_bloom_filter 0.01 1000000

  其中参数含义如下。

my_bloom_filter:过滤器的名称。0.01:误报率,例如0.01就表示存在1%的误报率。1000000:期望存储的元素数量,此参数会影响过滤器的大小和哈希函数的选择。

  接下来我们就可以通过BF.ADD命令来添加元素到布隆过滤器中。如下所示。

BF.ADD my_bloom_filter "element1"BF.ADD my_bloom_filter "element2"BF.ADD my_bloom_filter "element3"

  其中my_bloom_filter是过滤器的名称,"element1"、"element2"等则是需要添加的元素。

  然后通过BF.Exists命令来检查某个元素是否存在于布隆过滤器中,如下所示,如果元素存在则返回1,否则就返回0。

BF.EXISTS my_bloom_filter "element1"

  这里需要注意布隆过滤器是有一定的误报率的,所以如果当你检查到一个元素存在,它可能会存在误报的行为,所以需要一些补偿机制来进行检查。

  下面我们就以Python代码为例,给出如何通过Redis连接并且使用布隆过滤器。如下所示。需要通过redis-py库与Redis交互,所以我们需要先安装对应的依赖。

pip install redis redisbloom

  接下来就是通过代码来实现布隆过滤器。

import redisfrom redisbloom.client import Client# 连接Redisclient = Client(host='localhost', port=6379)# 创建布隆过滤器,误报率0.01,期望容量1000000client.bfReserve('my_bloom_filter', 0.01, 1000000)# 添加元素到布隆过滤器client.bfAdd('my_bloom_filter', 'element1')client.bfAdd('my_bloom_filter', 'element2')# 检查元素是否存在print(client.bfExists('my_bloom_filter', 'element1')) # 返回 Trueprint(client.bfExists('my_bloom_filter', 'element3')) # 返回 False

  在实际应用过程中,布隆过滤器可以用来进行缓存检查,判断某个数据是否存在于缓存中,避免出现重复查询的情况。另外在一些Web爬虫中,可以用来判断那些URL已经被访问过,避免出现重复查询。布隆过滤器的核心应用场景就是用来检查数据重复,所以在检查数据重复的场景中有着大量的使用。

  布隆过滤器是一种高效的空间节省数据结构,适合用于大规模数据集合中的成员数据测试操作。其优势就在于空间效率高、查询速度快,但存在误报的风险,并且不能准确删除元素。适合在需要快速判断元素是否存在,且可以容忍一定误报的场景中使用。

来源:从程序员到架构师

相关推荐