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

Redis的Bitmaps数据类型如何高效统计日活用户?

落枫同学_6584

落枫同学_6584

发布时间:2026-07-24 08:02:07

|

603人浏览过

|

来源于php中文网

原创

日活统计必须每日更换key,如active:2026-07-13,避免数据污染;user_id需归一化为紧凑offset以防内存浪费;bitcount不支持按用户范围统计,全量统计用bitcount key即可;需用户明细时应配合set等结构。

redis的bitmaps数据类型如何高效统计日活用户?

日活统计必须每天换 key,不能复用同一个 key

直接往一个固定 key(比如 daily_active_users)里反复 setbit,会导致数据污染:昨天的用户状态会和今天混在一起,bitcount 统计的是所有历史置位的总和,不是当日活跃数。

正确做法是把日期嵌入 key 名,例如:active:2026-07-13、play:2026-07-13。用户登录或触发行为时,执行:
setbit active:2026-07-13 user_id 1

  • key 命名建议带业务前缀(如 login:、view:),避免不同场景冲突
  • 日期格式统一用 yyyy-mm-dd,便于按字符串范围扫描或 TTL 设置
  • 不要用时间戳做 key 后缀(如 active:1752406500),可读性和运维排查成本高

user_id 直接当 offset 用?先确认是否从 0 开始

Redis 的 setbit 要求 offset 是非负整数,且越界会自动扩容。但很多系统 user_id 是从 100001、888888 这类大数开始的——如果直接传原始 id,会导致 bitmap 前面大量空字节,浪费内存。

例如 user_id = 100001,setbit active:2026-07-13 100001 1 会分配至少 100001/8 ≈ 12.5KB 空间,其中前 12.5KB 几乎全是 0。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 若 user_id 连续且基数小(如内部测试账号 1~10000),可直接用
  • 若 user_id 分散或起始值大,应做归一化:减去最小 ID(如 user_id - 100000),或用哈希映射到紧凑区间
  • 归一化逻辑必须稳定,否则同个用户不同请求算出不同 offset,统计就乱了

bitcount 性能够快,但别在大 offset 场景下误用 start/end 参数

bitcount key [start] [end] 的 start 和 end 指的是字符串字节索引,不是 bit 位偏移。很多人以为 bitcount active:2026-07-13 0 9999 是统计前 10000 个用户,实际是读取 value 的第 0 到第 9999 字节——这可能只覆盖前 8 万个 bit,也可能根本没覆盖目标用户。

日常统计全量日活,直接用 bitcount active:2026-07-13 就行,复杂度 O(N),N 是底层字符串长度,但 Redis 内部做了优化,百万级用户通常几毫秒内返回。

  • 需要查某段用户区间(如 uid 10000–19999)时,不要依赖 bitcount 的 range 参数
  • 要么提前归一化 offset 范围,让目标用户落在低偏移区;要么用 get 拿出整个 bitmap,客户端解析(适合离线批处理)
  • 高频实时查询建议加缓存,比如定时每 5 分钟跑一次 bitcount,结果写入另一个 key

bitmap 不是万能的,别在需要精确用户列表时硬扛

bitcount 只返回数字,没法告诉你“哪些用户活跃”。如果业务需要导出今日活跃 UID 列表、做二次画像或推送,bitmap 本身不支持反查 —— 它没有索引,只能逐 bit getbit 扫描,O(N) 时间且不可并发加速。

这时候得搭配其他结构:比如同时往 set 里 sadd active_set:2026-07-13 user_id,或者用 hyperloglog 做去重基数 + set 存明细。

  • 纯数字指标(DAU、WAU、留存率)→ bitmap 是最优解
  • 要用户明细、要分群、要关联其他属性 → bitmap 只适合做第一层快速过滤,后面必须接其他存储
  • 注意 set 内存开销比 bitmap 高一个数量级,别无脑替换

热门AI工具

更多
豆包大模型

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Seko
Seko Hot

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

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

WorkBuddy

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

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2911

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

534

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

502

2026.02.12

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

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

570

2025.09.05

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

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

323

2025.11.16

golang map原理
golang map原理

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

513

2025.11.17

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

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

283

2025.11.27

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

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

4489

2023.11.02

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

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

精品课程

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

共0课时 | 0人学习

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

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