Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis布隆Bloom过滤器

Redis布隆Bloom过滤器

作者头像
物流IT圈
发布于 2019-07-16 03:53:56
发布于 2019-07-16 03:53:56
1.5K0
举报
文章被收录于专栏:物流IT圈物流IT圈

  Redis提供了三种强大数据结构:HyperLogLog,布隆过滤器和布谷鸟过滤器。本文讨论布隆过滤器:

布隆过滤器是最具代表性的概率数据结构,可用于各种应用,数据库,网络设备甚至加密货币都广泛使用布隆过滤器来加速内部操作。

客户端可以向服务查询某个数据是否已经被缓存了,Redis以名为ReBloom的模块方式提供,此数据结构允许你测试某个数据项是否属于一个大型集合的一分子,但无需将整个集合保存在内存中。

值得注意的是,你可以指定0%到100%之间的误报概率(不包括极值),并避免误报,关于布隆过滤器最重要的一点是布隆过滤器总是回复“可能是”或“绝对没有”。

使用ReBloom时,空间使用与目标错误率成反比。

此外,ReBloom支持增长过滤器,让你为每个过滤器动态分配内存,这对于没有“一条裤子适合所有人”的解决方案的情况非常有用(例如跟踪社会网络中的关系,这遵循幂律分布),虽然过滤器会自动增长,但为了确保最佳的空间和CPU效率,当你已经知道集合近似大小时,尽可能准确地分配过滤器空间非常重要。

适用情况:

1. 检查用户名可用性 2. 欺诈检测和缓解某些类型的网络攻击 3. 跟踪已知URL的Web爬虫

基本用法

加载ReBloom模块后,添加数据项时,redis将为你无缝创建到key:

BF.ADD <key> <item>

如果要指定更多选项,可以使用:

BF.RESERVE <key> <error_rate> <size>

这将创建一个名为<key>的过滤器,该过滤器最多可容纳<size>项,目标错误率为<error_rate>。一旦溢出原始<size>估计值,过滤器将自动增长。

不会重复抓取网址

假设你正在运行网络抓取工具,并且希望确保它每次都不会无限制地抓取已经抓取过的网址。

当你抓取一个域名网站,保存所有已知URL的列表可能不是问题,但是,如果该范围大小在接近Google规模之间的某种程度,你可能会浪费太多资源来更新和阅读这个列表(甚至可能不再适合放入内存)。

使用布隆过滤器可以解决同样的问题,例如:

BF.ADD crawled "redis.io/documentation"

要测试URL是否已被抓取,你可以使用:

BF.EXISTS crawled "redis.io/maybe-new-url"

回答将是:

0(绝对没有):这是一个新的URL,你可以抓取它; 要么 1(可能是):这很可能是一个已知的URL。

在积极的情况下,由你决定是否接受跳过某些URL并继续前进的可能性很小,或者在磁盘中中跟踪这些URL,这样你可以查询这些URL以获得精确的、尽管速度较慢的结果。

Bloom过滤器需要多少空间?

一个大小为100MB的过滤器可以容纳多达1亿个单独数据项,错误率为2%。

比特币还使用布隆过滤器优化客户端通信。

布隆不够时:布谷鸟Cuckoo过滤器

布隆过滤器是一种经过时间考验的惊人数据结构,可满足大多数需求,但它们并不完美,他们最大的缺点是无法删除项目,由于是一种数据存储在过滤器内的方式,一旦添加了项目,就无法将其与其他数据项完全分开,在不引入新的错误的前提下几乎无法删除。

Cuckoo过滤器提供更新的概率数据结构,它以不同方式存储信息,导致性能特征略有不同,并且能够在需要时删除项目。

布谷鸟过滤器在下面情况比布隆过滤器更好:

1. 删除项目 2. 更快的查找(因为更好的内存位置) 3. 空间效率(当目标错误率低于3%时) 4. 更快的插入(当过滤器的填充率低于80%时)

在以下情况下,布谷鸟过滤器比布隆过滤器更糟糕:

1. 你的填充率超过80%;在这种情况下,布谷鸟过滤器的插入速度很快就会低于布隆。

2. 你有更宽松的目标错误率(大于3%),使布谷鸟过滤器的空间效率降低

3. 你需要高度可预测的行为(因为布谷鸟过滤器在插入过程中使用随机源来提供性能改进)

基本用法:

Cuckoo过滤器也存在于Redis的ReBloom中,可以像使用Bloom一样使用,唯一的区别是命令前缀是CF而不是BF,并且你有一个新的删除命令:

CF.DEL <key> <item>

其他所有内容都可以使用与布隆过滤器相同的方式建模。

结论 概率数据结构优雅地解决了许多类型的问题,否则,这些问题需要更多的计算能力、成本和开发工作,在本文中,我们介绍了三种有用的概率数据结构:

1. HyperLogLog(包含在Redis中)来计算集合中的元素。

2. 布隆过滤器(在ReBloom中可用),用于跟踪集合中存在或缺失的元素。

3. Cuckoo过滤器(ReBloom中提供)可以像布隆一样跟踪元素,但具有从集合中删除元素的附加功能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 驼马精英 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
在Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」。
码哥字节
2022/04/08
15.8K0
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
布隆过滤器 | 亿级数据处理原理与实战
布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。
Rude3Knife的公众号
2020/05/15
2.1K0
基于 Redis 布隆过滤器实现海量数据去重及其在 PHP 爬虫系统中的应用
在上篇教程中,学院君给大家介绍了 UV 统计功能的实现思路,如果访问量较小,使用 SET 即可,如果访问量很大,可以使用 HyperLogLog 来降低存储空间和优化性能。
学院君
2021/01/22
2.1K0
Redis之布隆过滤器(Bloom Filter)解读
在实际开发中,会遇到很多要判断一个元素是否在某个集合中的业务场景,类似于垃圾邮件的识别,恶意ip地址的访问,缓存穿透等情况。类似于缓存穿透这种情况,有许多的解决方法,如:redis存储null值等,而对于垃圾邮件的识别,恶意ip地址的访问,我们也可以直接用 HashMap 去存储恶意ip地址以及垃圾邮件,然后每次访问时去检索一下对应集合中是否有相同数据。
一个风轻云淡
2023/10/15
8390
Redis之布隆过滤器(Bloom Filter)解读
Redis(5)——亿级数据过滤和布隆过滤器
上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求。但是如果我们想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供类似于 contains 的这种方法。
我没有三颗心脏
2020/03/20
1.4K0
Redis(5)——亿级数据过滤和布隆过滤器
技术分享 | 缓存穿透 - Redis Module 之布隆过滤器
假设目前有一后端接口GET /userinfo/100,实际数据库内也只有最大ID为100的用户。
爱可生开源社区
2022/12/21
9110
详细解析Redis中的布隆过滤器及其应用
布隆过滤器(Bloom Filter)是由Howard Bloom在1970年提出的一种比较巧妙的概率型数据结构,它可以告诉你某种东西一定不存在或者可能存在。当布隆过滤器说,某种东西存在时,这种东西可能不存在;当布隆过滤器说,某种东西不存在时,那么这种东西一定不存在。
Bug开发工程师
2020/02/19
2.3K0
详细解析Redis中的布隆过滤器及其应用
Redis系列之什么是布隆过滤器?
前面的学习,我们知道了Redis的很多应用场景,但是最常见的还是缓存,“性能不够,缓存来凑”,在一些高并发的场景合理的使用缓存,还是可以减缓系统压力的。
SmileNicky
2022/07/28
5360
Redis系列之什么是布隆过滤器?
布隆过滤器过时了,未来属于布谷鸟过滤器?
为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世。论文《Cuckoo Filter:Better Than Bloom》作者将布谷鸟过滤器和布隆过滤器进行了深入的对比。相比布谷鸟过滤器而言布隆过滤器有以下不足:查询性能弱、空间利用效率低、不支持反向操作(删除)以及不支持计数。
老钱
2019/06/17
3.4K0
技术分享 | 缓存穿透 - Redis Module 之布隆过滤器
假设目前有一后端接口GET /userinfo/100,实际数据库内也只有最大ID为100的用户。
爱可生开源社区
2022/12/21
4170
技术分享 | 缓存穿透 - Redis Module 之布隆过滤器
Redis布隆过滤器原理与实践
在高并发请求时,业务数据一般会对数据进行缓存,提高系统并发量,因为磁盘IO和网络IO相对于内存IO的成百上千倍的性能劣势。 做个简单计算,如果我们需要某个数据,该数据从数据库磁盘读出来需要0.1s,从交换机传过来需要0.05s,那么每个请求完成最少0.15s(当然,事实上磁盘和网络IO也没有这么慢,这里只是举例),该数据库服务器每秒只能响应67个请求;而如果该数据存在于本机内存里,读出来只需要10us,那么每秒钟能够响应100,000个请求。 通过将高频使用的数据存在离cpu更近的位置,以减少数据传输时间,从而提高处理效率,这就是缓存的意义。
全栈程序员站长
2022/11/08
5290
Redis布隆过滤器原理与实践
redis缓存穿透穿透解决方案-布隆过滤器
相信绝大多数同学都是这么处理请求的,这样用redis能够给mysql抵挡住大部分的请求。其实这样是存在一定的问题的
程序员小饭
2020/10/26
6660
redis缓存穿透穿透解决方案-布隆过滤器
redis中的布隆过滤器
redis 在 4.0 的版本中加入了 module 功能,布隆过滤器可以通过 module 的形式添加到 redis 中,所以使用 redis 4.0 以上的版本可以通过加载 module来使用 redis 中的布隆过滤器。但是这不是最简单的方式,使用 docker 可以直接在 redis 中体验布隆过滤器。
名字是乱打的
2021/12/22
6850
Redis 之布隆过滤器与布谷鸟过滤器
大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景:
玄姐谈AGI
2021/11/23
8630
一文搞懂布隆过滤器
在开发软件时,我们经常需要判断一个元素是否在一个集合中,比如,如何判断单词的拼写是否错误(判断单词是否在已知的字典中);在网络爬虫里,如何确认一个网址是否已经爬取过;反垃圾邮件系统中,如何判断一个邮件地址是否为垃圾邮件地址等等。
somenzz
2021/09/14
3610
Go语言实现布谷鸟过滤器
在我们工作中,如果遇到如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断一般想到的是将集合中所有元素保存起来,然后通过比较确定。如果通过性能最好的Hash表来进行判断,那么随着集合中元素的增加,我们需要的存储空间也会呈现线性增长,最终达到瓶颈。
luozhiyun
2021/02/28
1.3K0
Redis布隆过滤器实现与总结
问题一:原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?
兔云小新LM
2021/04/13
3.4K0
Redis布隆过滤器实现与总结
布隆过滤器Bloom Filter简介
当需要判断一个元素是否存在于海量数据集合中,不仅查找时间慢,还会占用大量存储空间,接下来看一下布隆过滤器如何解决这个问题
全栈程序员站长
2022/06/29
5080
布隆过滤器Bloom Filter简介
布隆过滤器与缓存击穿
公司用户中心,有大量的用户请求,为防止缓存击穿,需要设计一个缓存策略 ,将恶意请求过滤掉。
袁新栋-jeff.yuan
2020/08/26
8960
布隆过滤器与缓存击穿
布隆过滤器
布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
Vincent-yuan
2022/05/06
4780
布隆过滤器
相关推荐
硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档