当前位置:首页 > 技术分析 > 正文内容

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

ruisui882个月前 (03-10)技术分析14

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

布隆过滤器的原理

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

第一步

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

第二步

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

第三步

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

第四步

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

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

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代码示例

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

pip install redis redisbloom

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

import redis
from redisbloom.client import Client

# 连接Redis
client = Client(host='localhost', port=6379)

# 创建布隆过滤器,误报率0.01,期望容量1000000
client.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'))  # 返回 True
print(client.bfExists('my_bloom_filter', 'element3'))  # 返回 False

布隆过滤器的应用场景

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

总结

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

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2673.html

分享给朋友:

“如何通过Redis快速实现布隆过滤器?” 的相关文章

厅监控结算中心加强高速公路联网收费系统运行管理

厅监控结算中心加强高速公路联网收费系统运行管理,一是严格PSAM卡管理要求,加强跟踪各营运公司PSAM卡使用情况,切实做到PSAM卡专人保管,定期核查,做好联网收费系统基础安全工作。二是督促各营运公司加强3G备份链路管理,保障数据应急通道的畅通,确保车道数据正常传输。三是落实标识站建设工作,督促各营...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN 编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理:慢即是快,重视架构设计和代码质量,确保每一行代码都经得起时间的考验。作者 | Sotiris Ko...

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...

Vue2的16种传参通信方式

前言先直入主题列出有哪些传参方式,下面再通过事例一一讲解。props(父传子)$emit与v-on (子传父)EventBus (兄弟传参).sync与update: (父子双向)v-model (父子双向)ref$children与$parent$attrs与$listeners (爷孙双向)pr...

三勾点餐系统java+springboot+vue3,开源系统小程序点餐系统

项目简述前台实现:用户浏览菜单、菜品分类筛选、查看菜品详情、菜品多属性、菜品加料、添加购物车、购物车结算、个人订单查询、门店自提、外卖配送、菜品打包等。后台实现:菜品管理、订单管理、会员管理、系统管理、权限管理等。 项目介绍三勾点餐系统基于java+springboot+element-plus+u...

SpringCloudalibaba+Vue开发仿社交小程序-青牛白马七香车

Spring Cloud Alibaba和Vue是当今开发领域中最为流行的技术组合之一。本文将介绍如何使用Spring Cloud Alibaba和Vue开发仿社交小程序。download: https://www.97yrbl.com/t-1632.html项目概述本项目是一个仿社交小程序,包括用...