讲师中心 微信公众号
AI工具推荐 视频效率加速

Redis Bitmap如何统计日活用户_利用SETBIT与BITCOUNT位运算

阿枫君_8872

阿枫君_8872

发布时间:2026-05-09 07:49:19

|

360人浏览过

|

来源于php中文网

原创

因为SETBIT操作的是位数组的下标offset而非UID本身,直接用UID会导致内存爆炸和稀疏空洞;必须通过哈希或取模映射到合理范围,且需保证映射规则长期一致。

redis bitmap如何统计日活用户_利用setbit与bitcount位运算

SETBIT 写入用户 ID 时为什么必须转成偏移量,不能直接用 UID?

因为 SETBIT 操作的是一个位数组的**下标位置**(即 offset),不是用户 ID 本身。Redis Bitmap 本质是字符串,每个字节 8 位,offset 从 0 开始连续计数。如果你把用户 ID 123456789 直接当 offset 写进去,就等于在第 1.2 亿个 bit 上写值——这会撑爆内存、触发 Redis 的 string 长度限制(512MB),而且绝大多数位置都是稀疏空洞。

  • 正确做法:用用户 ID 做哈希或取模,映射到合理范围,比如 uid % 10000000(覆盖千万级用户)
  • 更稳妥的方式是用 xxHash 或 MurmurHash 对 uid 做一致性哈希,再对位图总长度取模,避免热点偏移
  • 如果业务用户量稳定且已知上限(如 200 万),可直接用 uid 作为 offset,但必须确保 uid 是连续正整数且从 0 或 1 开始

BITCOUNT 统计单日活跃时,KEY 名怎么设计才不串天?

Bitmap 是按 KEY 统计的,KEY 名必须带日期维度,否则所有天的数据混在一起,BITCOUNT 算出来的是累计值,不是日活。常见错误是固定用 user_active 这种 KEY,每天覆盖写,结果第二天一查,前一天数据没了;或者不清理旧 KEY,导致内存只增不减。

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • 推荐格式:active:20240520(年月日)或 active:2024-05-20,用冒号分隔便于 scan 批量管理
  • 写入前先确认当天 KEY 是否存在,不存在则无需 DEL;若需精确到小时,可用 active:20240520:14
  • 别用 SETBIT active:20240520 ${uid} 1 后立刻 BITCOUNT active:20240520 —— 如果并发高,可能漏掉刚写入但未刷完的 bit,建议加小延迟或用 pipeline 包裹

为什么 BITCOUNT 在大 Bitmap 上变慢,以及怎么压低延迟?

BITCOUNT 时间复杂度是 O(N),N 是字符串字节数。一个覆盖 1000 万用户的 Bitmap,底层字符串约 1.25MB(10^7 / 8),每次调用都要遍历全部字节。实测在普通 SSD + Redis 7.0 上,单次耗时可能达 3–8ms,QPS 上千时容易成为瓶颈。

  • 用 BITCOUNT 的 start 和 end 参数分片统计,比如每 64KB 一段,多线程/协程并行算再汇总(注意 Redis 单线程,实际是客户端并发)
  • 更常用的是预聚合:每天凌晨用 BITCOUNT 算出当日值,存进另一个 KEY 如 dau:20240520,查日活直接 GET,毫秒级
  • 避免在主从同步链路中高频调用 BITCOUNT,它不阻塞,但会增加主节点 CPU 和网络压力,尤其在从库上执行时可能拖慢同步

SETBIT + BITCOUNT 组合无法区分新老用户?那怎么补漏?

Bitmap 只记录“今天有没有活跃”,不保留历史状态。你没法从 active:20240520 和 active:20240519 两个 KEY 里直接算出“今天首次活跃的用户数”,因为 BITOP AND / XOR 能做集合运算,但需要手动维护多天 KEY,且 BITOP 生成的新 KEY 会额外占内存。

  • 若只需“新增用户”指标,建议另起一套逻辑:用 HyperLogLog 存每日独立用户(PFCOUNT 快、省内存),再用 PFDUMP + 客户端比对(不推荐)或定期导出交集
  • 更现实的做法是放弃纯 Redis 解决,用 Bitmap 存日活,同时往数仓写明细日志,新增用户数由离线任务计算后回填到 Redis 的 new_user:20240520
  • 注意:不要对不同日期的 Bitmap 做 BITOP XOR 后直接 BITCOUNT 当新增——如果某用户昨天活跃、今天也活跃,XOR 结果是 0;只有今天有、昨天无才是 1,这确实能算新增,但前提是两天 KEY 的 offset 映射规则完全一致,否则结果错得离谱
事情说清了就结束。最常被忽略的其实是 offset 映射的一致性——只要换了一次哈希函数或取模基数,历史 KEY 就废了,重算成本极高。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3708

2023.11.20

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

690

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

553

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.27

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4849

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4415

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

8472

2024.04.02

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn