如何在Python中利用Redis实现海量URL布隆过滤器去重?

酷婷吖_6316

酷婷吖_6316

2026-11-02

970人浏览

原创

生产环境不能直接用 pybloom-live 存 Redis,因其将整个布隆过滤器序列化为字符串存入 SET 键,导致每次操作需 GET-DESERIALIZE-MODIFY-SERIALIZE-SET,开销大且并发写会覆盖而非合并,引发漏判;正确方案是使用 RedisBloom 模块的 BF.ADD/BF.EXISTS 原子指令,或用 BITFIELD 手动实现位图操作。

如何在python中利用redis实现海量url布隆过滤器去重?

直接用 redis-py + pybloom-live 或 redisbloom 模块能跑,但生产环境真这么干,大概率会在某天凌晨三点被报警叫醒——布隆过滤器的误判率、内存膨胀、Redis单点瓶颈、并发写冲突,一个都绕不开。

为什么不能直接用 pybloom-live 存 Redis?

它默认把整个布隆过滤器序列化成一个字符串塞进 Redis 的 SET 键里,每次 add() 或 contains() 都要 GET-DESERIALIZE-MODIFY-SERIALIZE-SET,网络往返+CPU反序列化开销大;更致命的是,多进程/多实例并发写同一个键时,SET 会覆盖而非合并,导致漏判。

  • 错误现象:add('a') 和 add('b') 并发执行后,可能只存下其中一个
  • 根本原因:Redis 原生不支持对布隆过滤器结构的原子位操作(除非用 RedisBloom 模块)
  • 替代方案:要么用 RedisBloom 的 BF.ADD/BF.EXISTS,要么自己用 BITFIELD 手搓位图操作

用 RedisBloom 模块做真正可落地的布隆过滤器

前提是 Redis 实例已加载 redisbloom 模块(6.2+ 可用 MODULE LOAD redisbloom.so;云 Redis 如阿里云、腾讯云需确认是否开启「TairBloom」或「RedisBloom 插件」)。Python 端用 redisbloom 客户端,不是 redis-py 自带的。

  • 安装:pip install redisbloom(注意不是 pybloom 或 pybloom-live)
  • 初始化:from redisbloom.client import Client; rbf = Client(host='x', port=6379); rbf.bfCreate('urls_bf', 0.01, 10000000) —— 这里 0.01 是期望误判率,10000000 是预估元素数,影响底层位数组大小
  • 去重判断:rbf.bfAdd('urls_bf', 'https://example.com/path?x=1') == 1 表示新增成功(首次插入),返回 0 表示已存在
  • 注意:bfAdd 是原子操作,天然支持高并发写入,不用加锁

当 RedisBloom 不可用时,用 BITFIELD 手动实现(兼容老 Redis)

核心思路:把 URL 做 hashlib.md5().digest() 得到 16 字节,取前 8 字节转为两个 uint64,再用 k 个哈希函数映射到位图索引(比如用 xxhash 对不同 seed 哈希),最后用 BITFIELD key SET u1 1 [offset] 原子置位。读时用 GET 批量取多个 offset 的 bit 值。

python-flask-vue-creator
python-flask-vue-creator

创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。

下载
  • 关键限制:单个 Redis String 最大 512MB,对应约 40 亿 bit → 最多支持约 4 亿 URL(误判率 ~1%)
  • 必须预分配位图:r.setbit('urls_bf_bitmap', 0, 0) 不行,得先 r.set('urls_bf_bitmap', b'\x00' * 64_000_000)(约 64MB)
  • 性能陷阱:一次 BITFIELD 最多操作 512 个字段,k=12 的布隆过滤器就得至少分 3 次命令,延迟翻倍
  • 推荐库:pyreBloom(已停更)风险高,不如直接用 redis-py 调 BITFIELD 自己封装

误判率与内存的硬平衡必须提前算清楚

布隆过滤器不是“越大越好”。1 亿 URL、误判率设成 0.1%,位数组只需约 14MB;设成 0.001%,则涨到 45MB——但实际业务中,0.1% 误判率意味着每 1000 个新 URL 就有 1 个被错判为重复,如果后续靠 MySQL 去重兜底,DB 压力反而更大。真实取舍点往往在 0.01%~0.05% 之间。

  • 计算工具:python -c "from pybloom_live import BloomFilter; print(BloomFilter(capacity=10000000, error_rate=0.0001).num_bits)"
  • Redis 内存监控重点:INFO memory | grep used_memory_human,避免单个布隆过滤器吃掉 >30% Redis 总内存
  • 冷热分离建议:高频爬取域名单独建 bf,低频长尾 URL 用本地 memoryview + mmap 文件缓存,减少 Redis 压力

最常被跳过的一步是预估容量——上线前按日增量 × 90 天算总规模,而不是拍脑袋填 1000000。填小了扩容只能重建,填大了内存浪费还拖慢 BITFIELD 批处理速度。布隆过滤器的“不可删除”特性,决定了初始设计比后期优化重要十倍。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

30037

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3567

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3587

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1243

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2783

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习