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 Filter(CF命令)替代 |
| 自动扩容 | 如果不使用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)