Bloom 过滤器是一种 节省空间的概率数据结构,可用于测试某个元素是否为集合成员。使用这种类型的结构,可能会出现假正例。例如,过滤器可能会指示某个元素在集合中,即使该元素不在集合中也是如此。不过,您不会遇到假负例。因此,如果您向集合中添加一个元素,那么过滤器必须指示该元素在集合中。
过滤器通过使用多个哈希函数将元素映射到固定大小的位数组中的多个位来实现此目的。如需控制假正例的概率,您可以调整数组中的位数和使用的哈希函数数量。
使用场景
本部分介绍使用 Bloom 过滤器的以下使用场景:
对广告和事件进行重复数据去重:如果您有电子商务网站、 流媒体服务、广告网络或营销平台,那么 Bloom 过滤器可以帮助您确定用户是否看到了广告、收到了 促销电子邮件或通知,或者购买了产品。
您可以使用 Bloom 过滤器存储用户购买的所有产品。
- 如果产品不在过滤器中,则向用户展示广告并将产品添加到过滤器中。
- 如果产品在过滤器中,则用户可能看到了相关广告并购买了该产品。因此,请找到其他广告向用户展示。
检测欺诈行为:您可以使用 Bloom 过滤器检测信用卡是否被 标记为被盗。为此,请使用包含被报告为被盗的卡的过滤器。使用卡时,请检查该卡是否出现在过滤器中。
- 如果卡不在过滤器中,则不会被标记为被盗。
- 如果卡在过滤器中,您可以根据主数据库检查该卡或拒绝购买。
过滤垃圾内容和有害内容:您可以使用 Bloom 过滤器来筛查 内容,以查找潜在威胁、有害材料和垃圾内容。为此,请创建一个包含恶意网址、垃圾电子邮件地址和垃圾手机号码的过滤器。当用户输入网址或收到电子邮件或短信时,请检查此信息是否出现在过滤器中。
- 如果网址、电子邮件或短信不在过滤器中,则允许用户访问网址所代表的网站,或接收电子邮件或短信。
- 如果网址、电子邮件或短信在过滤器中,则拒绝用户访问关联的网站,或阻止用户接收电子邮件或短信。
检测重复的用户名:您可以使用 Bloom 过滤器确定 用户名是新的还是已存在。为此,请使用过滤器跟踪注册您的电子商务网站或流媒体服务的每个用户名。当新用户尝试使用其用户名注册时,请检查该用户名是否出现在过滤器中。
- 如果用户名不在过滤器中,则创建账号并将用户名添加到过滤器中。
- 如果用户名在过滤器中,则拒绝该用户名。
如需详细了解这些使用场景,请参阅 Bloom 过滤器的常见使用场景。
可用性
如果您创建 Memorystore for Valkey 实例(版本 8.0 及更高版本),则 Bloom 数据类型及其关联命令的版本 1.0 会自动提供。此数据类型与以下 Valkey 客户端库的 Bloom 过滤器命令语法兼容:
Bloom 过滤器类型
您可以拥有以下类型的 Bloom 过滤器:
- 扩缩:此类过滤器没有固定容量,因此过滤器 可以扩容。如果过滤器达到容量上限,并且您向过滤器添加新的唯一项,则过滤器会横向扩容并创建一个新的子过滤器。此子过滤器的容量比过滤器大。
- 非伸缩:此类过滤器具有固定容量,因此您可以添加到过滤器的项数有限制。如果过滤器达到容量上限,并且您尝试向过滤器添加新的唯一项,则会收到错误。
如需详细了解这些类型的 Bloom 过滤器之间的区别, 请参阅 伸缩和非伸缩 Bloom 过滤器。
Bloom 过滤器属性
Bloom 过滤器具有以下属性:
- 容量:Bloom 过滤器在 扩容(对于伸缩过滤器)或 拒绝添加其他项(对于非伸缩过滤器)之前可以容纳的项数。
- 假正例率:控制 Bloom 过滤器操作 导致假正例的概率的速率。例如,您用于检查元素是否在过滤器中的操作指示该元素在过滤器中,即使该元素不在过滤器中也是如此。
- 扩容:此属性与伸缩 Bloom 过滤器相关联。它控制过滤器因达到容量上限而横向扩容时总容量的增长。
- 伸缩或非伸缩:Bloom 过滤器是伸缩过滤器还是非伸缩 过滤器。
如需详细了解 Bloom 过滤器的属性,请参阅 Bloom 属性。
Bloom 过滤器对象
Bloom 过滤器对象最多可以消耗 128 MB 的内存。如需检查 Bloom 过滤器消耗的内存量,请使用 BF.INFO key SIZE 命令,其中 key 是过滤器的键名称,
SIZE 是过滤器消耗的字节数。
Bloom 类别
如需管理对 Bloom 命令和数据的访问权限,请使用 @bloom
类别。除了此类别之外,以下类别也使用 Bloom 命令:@read、@write 和 @fast。
下表指明了您是否可以将 Bloom 命令映射到 @read、@write、@fast 和 @bloom 类别。
| Bloom 命令 | @bloom |
@read |
@write |
@fast |
|---|---|---|---|---|
BF.ADD |
是 | N | 是 | 是 |
BF.CARD |
是 | 是 | N | 是 |
BF.EXISTS |
是 | 是 | N | 是 |
BF.INFO |
是 | 是 | N | 是 |
BF.INSERT |
是 | N | 是 | 是 |
BF.MADD |
是 | N | 是 | 是 |
BF.MEXISTS |
是 | 是 | N | 是 |
BF.RESERVE |
是 | 是 | N | 是 |
Bloom 指标
如需监控 Bloom 数据类型的使用情况,Memorystore for Valkey 中提供了以下 Cloud Monitoring 指标:
objects_countused_memory
如需详细了解这些指标,请参阅 Bloom 过滤器和 JSON 指标。
Bloom 命令
本部分列出并介绍了可用于对 Bloom 数据类型执行 Bloom 操作的 Bloom 命令。
| 命令 | 说明 |
|---|---|
BF.ADD |
向 Bloom 过滤器添加单个项。如果过滤器不存在,则 该命令会创建过滤器。 |
BF.CARD |
返回 Bloom 过滤器的基数。 |
BF.EXISTS |
确定 Bloom 过滤器是否包含您指定的项。 |
BF.INFO |
返回 Bloom 过滤器的使用情况信息和属性。 |
BF.INSERT |
创建包含 0 个或多个项的 Bloom 过滤器,或向现有 过滤器添加项。 |
BF.MADD |
向 Bloom 过滤器添加一个或多个项。如果过滤器不存在, 则该命令会创建过滤器。 |
BF.MEXISTS |
确定 Bloom 过滤器是否包含一个或多个项。 |
BF.RESERVE |
使用您指定的属性创建空 Bloom 过滤器。 |
检查 Bloom 过滤器
您可以检查有关 Bloom 过滤器的以下信息:
- 内存用量:检查过滤器是否达到内存用量限额。如需检查
过滤器使用的内存量,请使用
BF.INFO命令。 - 容量:检查过滤器是否为伸缩过滤器。如果是,请扩容过滤器,使其达到容量上限,然后横向扩容。
如需详细了解如何检查 Bloom 过滤器的内存用量和容量,请参阅处理大型 Bloom 过滤器。