Hello#

新建#

# 创建一个预期容量100万,错误率1%的布隆过滤器
BF.RESERVE my_bloom 0.01 1000000

添加元素#

BF.ADD my_bloom item1
BF.MADD my_bloom item2 item3 item4

检查元素是否存在#

BF.EXISTS my_bloom item1  # 返回1(可能存在)
BF.EXISTS my_bloom itemX  # 返回0(绝对不存在)

批量查询#

BF.MEXISTS my_bloom item1 itemX

查看过滤器信息#

命令: BF.DEBUG my_bloom

total_items:4,num_blooms:1,bytes:2097152 bits:16777216 hashes:7 hashwidth:64 capacity:1750350 items:4 error_ratio:0.01

命令: TYPE my_bloom

exbloom--

重要特性说明#

特性说明
误判率可能误报(假阳性),但不会漏报(假阴性)
空间效率100万元素+1%误判率约占用1.7MB内存
不可删除元素标准布隆过滤器不支持删除,可用Cuckoo FilterCF命令)替代
自动扩容如果不使用RESERVE,过滤器会动态扩容,但错误率可能上升

Python 代码示例#

import redis

# 连接Redis
r = redis.Redis(host='localhost', port=6379)

# 创建布隆过滤器(如果不存在)
try:
    r.execute_command("BF.RESERVE", "user_filter", 0.01, 1000000)
except redis.exceptions.ResponseError as e:
    if "item exists" not in str(e):
        raise

# 添加数据
r.execute_command("BF.ADD", "user_filter", "user123")
r.execute_command("BF.MADD", "user_filter", "user456", "user789")

# 检查是否存在
print(r.execute_command("BF.EXISTS", "user_filter", "user123"))  # 1
print(r.execute_command("BF.EXISTS", "user_filter", "unknown"))  # 0

# 重建
## 1. 查询所有需要保留的元素
existing_items = get_all_valid_items()  # 自定义获取有效元素的逻辑
## 2. 删除旧过滤器
r.delete("my_bloom")
## 3. 创建新过滤器并重新添加有效元素
r.execute_command("BF.RESERVE", "my_bloom", 0.01, 1000000)
r.execute_command("BF.MADD", "my_bloom", *existing_items)