Redis 命令及数据类型 -- BF(Bloom Filter)
摘要
- 本文介绍 Redis 扩展模型 RedisBloom 中的 Bloom Filter 数据类型
- 本文基于
redis-7.4.7,springboot-3.5.8 - Redis官网:https://redis.io/
- Redis 命令文档:https://redis.io/docs/latest/commands/
- RedisBloom 的安装参见 Redis 扩展模块 -- RedisBloom 的安装方法
- 示例代码:GitHub
Bloom Filter(布隆过滤器)
-
布隆过滤器是一种用于快速判断元素是否存在的 probabilistic data structure(概率数据结构),非常适合海量数据且不要求绝对精确的场景。
-
生产环境推荐使用 Redisson的布隆过滤器
-
布隆过滤器使用一个很长的二进制位数组和一系列哈希函数来保存元素。
- 优点: 非常节省空间、查询快
- 缺点: 有一定的误判概率、无法删除元素、无法给元素计数
-
布隆过滤器判断一个元素不在集合中,那么这个元素肯定不在集合中。但是,布隆过滤器判断一个元素在集合中,那么这个元素有可能不在集合中。

-
位数组(Bit Array):布隆过滤器使用一个长度固定的位数组来存储数据。每个位置只占用一个比特(0或1),初始时所有位都设置为0。位数组的长度和哈希函数的数量决定了过滤器的误报率和容量。
-
哈希函数集合:布隆过滤器使用多个哈希函数,每个函数都会将输入数据映射到位数组的一个不同位置。哈希函数的选择对过滤器的性能有很大影响,理想的哈希函数应该具有良好的散列性,使得不同的输入尽可能均匀地映射到位数组的不同位置。
-
如何降低误判率?
- 更大的位数组
- 更多的哈希函数
-
很多人都是用过Google开源的Guava的布隆过滤器,但其是JVM层的布隆过滤器,若需要分布式布隆过滤器,就可以使用RedisBloom提供的BF(Bloom Filter)。
BF 命令说明
-
对应Redis命令:
BF.xxx
| 命令 | 功能说明 | 是否创建 Filter | 关键参数含义 | 返回值 | 示例 | 使用要点 / 备注 |
|---|---|---|---|---|---|---|
| BF.RESERVE | 显式创建 Bloom Filter | 是(已存在则报错) | error_rate:误判率capacity:预计元素数EXPANSION:扩容倍率 |
OK | BF.RESERVE user:bf 0.001 1000000 |
✅ 生产推荐 显式规划容量与误判率,避免隐式创建 |
| BF.ADD | 添加单个元素 | 是(不存在则创建) | 无 | 1 新增0 可能已存在 |
BF.ADD user:bf user_1 |
Key 必须已存在,否则报错 |
| BF.MADD | 批量添加元素 | 是(不存在则创建) | item...:多个元素 |
0/1 列表 |
BF.MADD user:bf u1 u2 u3 |
⚠ 使用默认配置,不建议生产 |
| BF.INSERT | 批量插入(可控参数) | 是 | CAPACITY:容量ERROR:误判率NOCREATE:不自动创建过滤器NONSCALING: 不扩容,达到capacity时,过滤器返回错误EXPANSION expansion:扩容时,新建子过滤器的容量增长倍率,默认2 ITEMS:元素列表 |
0/1 列表 |
BF.INSERT user:bf CAPACITY 10000 ERROR 0.001 ITEMS u1 u2 |
✅ 最推荐的写入方式 支持初始化 + 插入 |
| BF.EXISTS | 判断单个元素是否存在 | 否 | item:待判断元素 |
1 可能存在0 一定不存在 |
BF.EXISTS user:bf user_1 |
不存在结果 绝对可靠 |
| BF.MEXISTS | 批量判断是否存在 | 否 | item...:多个元素 |
0/1 列表 |
BF.MEXISTS user:bf u1 u9 |
高并发批量查询首选 |
| BF.CARD | 返回插入元素数量(近似) | 否 | 无 | 整数 | BF.CARD user:bf |
用于容量监控,非精确 |
| BF.INFO | 返回 Bloom Filter 元信息 | 否 | 无 | KV 列表 | BF.INFO user:bf |
运维、容量与内存分析必备 |
| BF.SCANDUMP | 分块导出 Bloom Filter | 否 | iterator:游标 |
iterator + data |
BF.SCANDUMP user:bf 0 |
用于迁移、备份 |
| BF.LOADCHUNK | 从 dump 数据恢复 Filter | 是 | iteratordata |
OK | BF.LOADCHUNK user:bf 1 "xxx" |
必须与 SCANDUMP 配合使用 |
BF 命令示例
1 | # 初始化一个BloomFilter,错误率0.01,元素数量1000 |
SpringBoot 集成
-
SpringBoot 的 RedisTemplate 中没有提供对
RedisBloom的封装,需要自己封装,我这里封装了一个简易的RedisBloomFilterTool
1 | package com.example.redisbloom; |
SpringBoot 与 Redisson 集成之 BloomFilter 的使用方法
1 | <dependency> |
1 |
|