通过 roaringbitmap 判断百万级数据是否存在
533 字
3 分钟
通过 roaringbitmap 判断百万级数据是否存在
问题描述
有以下用户订阅关系表
CREATE TABLE `template_subscribe` ( `id` bigint NOT NULL COMMENT 'ID主键', `template_id` varchar(32) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模板id', `user_id` bigint NOT NULL COMMENT '用户主键', PRIMARY KEY (`id`) USING BTREE, KEY `idx_user_id_template_id` (`user_id`, `template_id`) USING BTREE);先给定一个 CSV 文件 和一个 template_id,只包含 userId, 数量预计在百万级别,要求判断 有多少 userId 在 template_subscribe 表中存在
纯数据库方案
分批次,通过 sql 从数据库中查询,比如每次 1000 个
select count(*) from template_subscribe where user_id in (x1,x2,x3 ...) and template_id = y;100W数据 需要 1000次循环,假设每次查询需要 1s,一共需要 1000 秒,该方案耗费时间太长不可接受,也会对数据库造成压力
bloom filter方案
基于数据库中的 template_id 做分组,通过定时任务生成每个分组的 bloom filter 数据结构,判断时,循环遍历csv文件中每个userId,判断是否在 bloom filter 中存在。每个id判断时间查找复杂度大概在 O(k) k为hash函数数量,100W约为 100W * k次,但是会有误判率(数据比真实数量大)。
bitmap 方案
基于数据库中的 template_id 做分组,通过定时任务生成每个分组的 bitmap 数据结构 A1,判断时,通过循环遍历csv文件中每个userId,生成一个 bitmap A2,通过对 A1、A2 取交集原算得到 A3, 直接判断A3 中的数据量即可得到人数
roaringbitmap 方案
bitmap 方案的升级版本,解决了内存消耗过大的问题

对比总结
| 特性 | bloom filter | bitmap | roaringbitmap |
|---|---|---|---|
| 类型 | 概率型数据结构 | 精确数据结构 | 精确数据结构 |
| 准确性 | 有误判率 | 准确 | 准确 |
| 空间效率 | 固定空间消耗 | 与最大值线性相关 | 自适应压缩存储 |
| 查询复杂度 | O(k) | O(1) | O(1) |
| 支持数据类型 | 任意可hash的对象 | 整数 | 整数 |
| 内存消耗 | 中等可控 | 稀疏时存在浪费 | 高 |
| 写入性能 | 快 | 快 | 中等 |
| 支持集合运算 | 否 | 是 | 是 |
| 删除操作 | 不支持 | 支持 | 支持 |
📎 参考文章
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
通过 roaringbitmap 判断百万级数据是否存在
https://blog.sephy.top/posts/通过-roaringbitmap-判断百万级数据是否存在/相关文章智能推荐
1
在 PVE 上给软路由虚拟机加一个网络 Watchdog
技术分享在 PVE 宿主机上用 Bash 和 systemd timer 实现一个网络 watchdog:先检测公网连通性,连续失败后重启软路由虚拟机,多次自愈无效再升级为重启 PVE 宿主机。
2
命令行自动登录 JumpServer:SSH、TOTP 与密码提示的自动化
技术分享把 JumpServer 登录流程拆成凭据读取和终端交互两层:zsh 从密码管理器安全读取 TOTP seed 与可选密码,expect 只负责响应 SSH 登录过程中的 password 和 Code 提示。
3
git 个人开发工作流
技术分享介绍个人 Git 分支协作流程:以基线分支(如 feature-a)+ 个人开发分支(feature-a-xxx)进行开发,开发分支定期 rebase 同步上游,最终通过 merge(必要时先 squash 整理提交)合回基线;并提供 grebase/gmergebase 等脚本,支持自动推导基线分支、预览计划、带 autostash 的安全 rebase,以及可选 squash/推送/删除分支的安全 merge-back。
4
使用 docker-atrust 连入深信服
技术分享使用 Docker 容器运行深信服 aTrust 客户端,通过 VNC 完成登录,并结合本机 mihomo 配置实现公司内网的 DNS 解析与按域名、IP 的精确代理分流;宿主机暴露 1080 与 8888 端口供 socks5 和 HTTP 代理使用,从而在不安装原生客户端的情况下实现零信任接入并降低对本机的影响。
5
mihomo 使用
技术分享2025-09-30
随机文章随机推荐













