当前位置:首页 > 问答 > 正文

红色的过滤器和redis过滤器怎么用,教程里讲了不少东西感觉挺实用的

首先需要说明一下,“红色的过滤器”这个说法,很可能是一个口误或特定场景下的俗称,在技术圈里,它通常指的是 布隆过滤器,这个名字的由来可能与其发明者布隆(Bloom)的名字音译有关,被一些人戏称为“红色过滤器”或直接理解为其颜色代表,下面我们将主要讲解布隆过滤器和Redis过滤器的使用。

布隆过滤器是什么?

想象一下你需要解决一个问题:你要判断一个人是不是你的网站的新访客,最笨的办法是每次有人访问,你就去翻一遍所有老访客的记录本,看看有没有他的名字,如果网站有上亿用户,这个查询会非常慢。

布隆过滤器就是一个聪明的小工具,它帮你用很小的空间代价,快速回答“某个东西可能在集合里”或者“肯定不在集合里”,它本质上是一个很长的二进制向量(你可以想象成一个超长的、只由0和1组成的数组)和一系列哈希函数。

它的工作方式很像你在参加一个大型会议时领取的胸牌,工作人员不需要记住所有参会者的脸,他们只需要看你胸前有没有挂那个特定的胸牌,有胸牌,你可能是参会者(因为胸牌可能被仿制或冒用);但没有胸牌,你肯定不是参会者。

对应到技术层面:

  • 二进制数组:就像是一排初始状态都是“0”的开关。
  • 哈希函数:就像几个不同的印章,能把任何数据(比如一个用户名)盖出一个或多个独特的“印记”(即计算出几个数字位置)。
  • 添加元素:当你要把一个数据加入过滤器时,就用这几个“印章”(哈希函数)在它身上盖一下,得到几个位置,然后把二进制数组上对应这些位置的开关从“0”拨到“1”。
  • 查询元素:当你要查询一个数据是否存在时,同样用这些“印章”盖一下,得到几个位置,如果这些位置全部都是“1”,那么系统会说:“这个数据可能存在”,如果其中任何一个位置是“0”,那么系统会肯定地说:“这个数据肯定不存在”。

为什么是“可能”存在? 因为不同的数据经过哈希计算后,有极小的概率会指向二进制数组中完全相同的位置(这被称为哈希碰撞),布隆过滤器存在一定的误判率,但它绝不会漏判(即不会把存在的说成不存在)。

Redis过滤器又是什么?

Redis本身是一个速度极快的内存数据库,而Redis过滤器,其实就是Redis数据库提供的一种功能,让你能够直接使用布隆过滤器的能力,因为布隆过滤器需要存储那个很长的二进制数组,并且保证多个服务都能访问到它,而Redis正好完美满足这个需求:它速度快(内存操作),并且支持分布式访问。

当我们说“使用Redis过滤器”时,通常指的是使用Redis的 RedisBloom 模块,这个模块为Redis增加了布隆过滤器等概率性数据结构的命令。

具体怎么用?(基于RedisBloom模块的教程)

教程中通常会教你如何安装RedisBloom模块,然后在命令行或者代码中使用它,这里用简单的语言描述一下核心步骤和命令:

  1. 安装准备:你需要确保你的Redis服务器加载了RedisBloom模块,这可能需要在启动Redis时通过参数指定模块路径,或者使用已经预装该模块的云Redis服务。

  2. 创建一个布隆过滤器: 在Redis中,你不需要显式地“创建”一个过滤器,你会在第一次使用的时候定义它,关键命令是 BF.RESERVE,这个命令允许你预先设定这个过滤器的容量和可接受的误判率。 在Redis命令行中输入:

    BF.RESERVE my_filter 0.01 100000

    这行命令的意思是:创建一个名叫 my_filter 的布隆过滤器,它预计要存放10万个元素,并且期望的误判率不超过1%(0.01),提前设置能优化性能。

  3. 向过滤器中添加元素: 使用 BF.ADD 命令。

    BF.ADD my_filter "user123"

    这表示把字符串 "user123" 添加到名为 my_filter 的过滤器中,如果添加成功,Redis会返回整数 1

  4. 检查元素是否存在: 使用 BF.EXISTS 命令。

    BF.EXISTS my_filter "user123"

    Redis会返回 1,表示“很可能存在”。 如果你查询一个没加过的:

    BF.EXISTS my_filter "hacker"

    Redis会返回 0,表示“肯定不存在”。

  5. 批量操作: 教程里肯定会提到批量操作很实用,因为能减少网络请求,对应的命令是 BF.MADD(批量添加)和 BF.MEXISTS(批量检查)。 一次性检查多个用户:

    BF.MEXISTS my_filter "user123" "user456" "hacker"

    Redis会返回一个数组,[1, 1, 0],分别对应每个元素的检查结果。

教程里觉得实用的场景有哪些?

教程通常会强调布隆过滤器在解决特定问题上的巨大威力:

  • 缓存穿透问题:这是最经典的用法,如果黑客一直请求一个数据库中根本不存在的数据,每次请求都会穿过缓存直接打到数据库上,可能导致数据库崩溃,在查询缓存和数据库之前,先用布隆过滤器查一下,如果过滤器说“肯定不存在”,就直接拒绝请求,完美保护了数据库。
  • 推荐系统去重:比如给用户推送新闻,需要避免推送已经读过的,可以把用户读过的新闻ID放进布隆过滤器,推送前检查一下,虽然可能有极小的误判(某条新闻没读过但被判定为读过,从而不推送),但保证了绝不会重复推送,用很小的误差换来了巨大的性能提升。
  • 垃圾邮件识别:判断一个邮件地址是否是已知的垃圾邮件发送者。

布隆过滤器(可能被称作红色过滤器)是一个用空间换时间、允许一点点误差的“侦察兵”,而Redis过滤器则是让你在分布式系统中方便地启用这个“侦察兵”的强大工具,教程的价值就在于用具体的命令和场景,告诉你如何把这个看似复杂的理论,变成几行代码就能解决的实际问题。

红色的过滤器和redis过滤器怎么用,教程里讲了不少东西感觉挺实用的