红色的过滤器和redis过滤器怎么用,教程里讲了不少东西感觉挺实用的
- 问答
- 2026-01-08 08:20:39
- 2
首先需要说明一下,“红色的过滤器”这个说法,很可能是一个口误或特定场景下的俗称,在技术圈里,它通常指的是 布隆过滤器,这个名字的由来可能与其发明者布隆(Bloom)的名字音译有关,被一些人戏称为“红色过滤器”或直接理解为其颜色代表,下面我们将主要讲解布隆过滤器和Redis过滤器的使用。
布隆过滤器是什么?
想象一下你需要解决一个问题:你要判断一个人是不是你的网站的新访客,最笨的办法是每次有人访问,你就去翻一遍所有老访客的记录本,看看有没有他的名字,如果网站有上亿用户,这个查询会非常慢。
布隆过滤器就是一个聪明的小工具,它帮你用很小的空间代价,快速回答“某个东西可能在集合里”或者“肯定不在集合里”,它本质上是一个很长的二进制向量(你可以想象成一个超长的、只由0和1组成的数组)和一系列哈希函数。
它的工作方式很像你在参加一个大型会议时领取的胸牌,工作人员不需要记住所有参会者的脸,他们只需要看你胸前有没有挂那个特定的胸牌,有胸牌,你可能是参会者(因为胸牌可能被仿制或冒用);但没有胸牌,你肯定不是参会者。
对应到技术层面:
- 二进制数组:就像是一排初始状态都是“0”的开关。
- 哈希函数:就像几个不同的印章,能把任何数据(比如一个用户名)盖出一个或多个独特的“印记”(即计算出几个数字位置)。
- 添加元素:当你要把一个数据加入过滤器时,就用这几个“印章”(哈希函数)在它身上盖一下,得到几个位置,然后把二进制数组上对应这些位置的开关从“0”拨到“1”。
- 查询元素:当你要查询一个数据是否存在时,同样用这些“印章”盖一下,得到几个位置,如果这些位置全部都是“1”,那么系统会说:“这个数据可能存在”,如果其中任何一个位置是“0”,那么系统会肯定地说:“这个数据肯定不存在”。
为什么是“可能”存在? 因为不同的数据经过哈希计算后,有极小的概率会指向二进制数组中完全相同的位置(这被称为哈希碰撞),布隆过滤器存在一定的误判率,但它绝不会漏判(即不会把存在的说成不存在)。
Redis过滤器又是什么?
Redis本身是一个速度极快的内存数据库,而Redis过滤器,其实就是Redis数据库提供的一种功能,让你能够直接使用布隆过滤器的能力,因为布隆过滤器需要存储那个很长的二进制数组,并且保证多个服务都能访问到它,而Redis正好完美满足这个需求:它速度快(内存操作),并且支持分布式访问。
当我们说“使用Redis过滤器”时,通常指的是使用Redis的 RedisBloom 模块,这个模块为Redis增加了布隆过滤器等概率性数据结构的命令。
具体怎么用?(基于RedisBloom模块的教程)
教程中通常会教你如何安装RedisBloom模块,然后在命令行或者代码中使用它,这里用简单的语言描述一下核心步骤和命令:
-
安装准备:你需要确保你的Redis服务器加载了RedisBloom模块,这可能需要在启动Redis时通过参数指定模块路径,或者使用已经预装该模块的云Redis服务。
-
创建一个布隆过滤器: 在Redis中,你不需要显式地“创建”一个过滤器,你会在第一次使用的时候定义它,关键命令是
BF.RESERVE,这个命令允许你预先设定这个过滤器的容量和可接受的误判率。 在Redis命令行中输入:BF.RESERVE my_filter 0.01 100000这行命令的意思是:创建一个名叫
my_filter的布隆过滤器,它预计要存放10万个元素,并且期望的误判率不超过1%(0.01),提前设置能优化性能。 -
向过滤器中添加元素: 使用
BF.ADD命令。BF.ADD my_filter "user123"这表示把字符串 "user123" 添加到名为
my_filter的过滤器中,如果添加成功,Redis会返回整数1。 -
检查元素是否存在: 使用
BF.EXISTS命令。BF.EXISTS my_filter "user123"Redis会返回
1,表示“很可能存在”。 如果你查询一个没加过的:BF.EXISTS my_filter "hacker"Redis会返回
0,表示“肯定不存在”。 -
批量操作: 教程里肯定会提到批量操作很实用,因为能减少网络请求,对应的命令是
BF.MADD(批量添加)和BF.MEXISTS(批量检查)。 一次性检查多个用户:BF.MEXISTS my_filter "user123" "user456" "hacker"Redis会返回一个数组,
[1, 1, 0],分别对应每个元素的检查结果。
教程里觉得实用的场景有哪些?
教程通常会强调布隆过滤器在解决特定问题上的巨大威力:
- 缓存穿透问题:这是最经典的用法,如果黑客一直请求一个数据库中根本不存在的数据,每次请求都会穿过缓存直接打到数据库上,可能导致数据库崩溃,在查询缓存和数据库之前,先用布隆过滤器查一下,如果过滤器说“肯定不存在”,就直接拒绝请求,完美保护了数据库。
- 推荐系统去重:比如给用户推送新闻,需要避免推送已经读过的,可以把用户读过的新闻ID放进布隆过滤器,推送前检查一下,虽然可能有极小的误判(某条新闻没读过但被判定为读过,从而不推送),但保证了绝不会重复推送,用很小的误差换来了巨大的性能提升。
- 垃圾邮件识别:判断一个邮件地址是否是已知的垃圾邮件发送者。
布隆过滤器(可能被称作红色过滤器)是一个用空间换时间、允许一点点误差的“侦察兵”,而Redis过滤器则是让你在分布式系统中方便地启用这个“侦察兵”的强大工具,教程的价值就在于用具体的命令和场景,告诉你如何把这个看似复杂的理论,变成几行代码就能解决的实际问题。

本文由雪和泽于2026-01-08发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/76705.html
