Java 中怎么使用 Redis 的 Bitmap 实现用户签到与活跃状态的高效位图统计

陌瑶大大_7671

陌瑶大大_7671

2026-08-16

711人浏览

原创

java中用redis bitmap实现用户签到和活跃统计,核心是将用户每日行为映射为bit位,通过setbit、getbit、bitcount、bitop等命令操作,配合“sign:uid:{userid}:yyyymm”等合理key设计,以极低内存支持亿级日活/月活/连续签到统计。

java 中怎么使用 redis 的 bitmap 实现用户签到与活跃状态的高效位图统计

Java 中用 Redis Bitmap 实现用户签到和活跃状态统计,核心是把用户每日行为映射为一个位(bit),用 SETBIT、GETBIT、BITCOUNT 和 BITOP 等命令操作,配合合理的 key 设计,就能在极低内存下完成亿级用户的日活/月活/连续签到等统计。

设计签到 key:按用户+时间维度组织

Bitmap 本质是字符串,每个字符 8 bit,所以一个长度为 N 的字符串最多存 N×8 个位。合理设计 key 是高效前提:

  • 签到记录用 "sign:uid:{userId}:yyyyMM",比如 "sign:uid:123:202406" 表示用户 123 在 2024 年 6 月的签到位图
  • 每天对应一个 bit 位:第 1 天 → offset=0,第 15 天 → offset=14,第 30 天 → offset=29
  • 这样每月最多 31 个 bit,一个 key 只占约 4 字节(31/8 向上取整),非常节省空间

实现签到与查询:用 SETBIT 和 GETBIT

用户今天签到,只需设置对应 offset 为 1;查是否已签到,读对应位即可:

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载
  • 签到(假设今天是 6 月 18 日,即当月第 18 天 → offset=17):
    jedis.setbit("sign:uid:123:202406", 17, true);
  • 查是否签到:
    Boolean isSigned = jedis.getbit("sign:uid:123:202406", 17);
  • 注意:Jedis 的 setbit 第三个参数支持 true/false 或 "1"/"0",推荐用布尔值更直观

统计活跃用户:BITCOUNT + 时间范围聚合

要算某天有多少人签到,不能遍历所有用户——而是反向建“日期维度”位图(可选),但更常用的是按月扫描用户位图:

  • 单用户当月签到天数:
    Long days = jedis.bitcount("sign:uid:123:202406");
  • 全量用户月活(需结合业务数据源):通常用 Redis Pipeline 批量读多个用户的 bitcount,再在应用层累加
  • 若需“6 月 1 日到 6 月 5 日都签到的用户”,可用 BITOP AND 合并多日位图(需先为每天单独建位图 key,如 "sign:day:20240601")

判断连续签到:位运算 + offset 计算

连续签到 n 天,本质是检查最近 n 个 bit 是否全为 1。Redis 没有原生“连续 1”的指令,但可巧妙处理:

  • 获取最近 n 天的位区间(例如查连续 7 天,取 offset [d-6, d] 共 7 位)
  • 用 GETRANGE 获取对应字节范围(注意字节对齐),再在 Java 中解析 bit 并校验是否全 1
  • 更轻量做法:维护一个“最后签到日”字段(String 类型),配合签到逻辑判断间隔 —— 对大多数场景足够且更快
  • 高阶技巧:用 BITPOS key 0 0 -1 找从末尾起第一个 0 的位置,反推连续 1 长度(需保证位图右侧对齐签到日期)

不复杂但容易忽略:Bitmap 虽省空间,但 key 过多会增加 Redis 内存碎片;建议按月分片 + 定期过期(如设置 1 年 TTL),并用 SCAN 配合模式匹配做冷数据归档。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

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

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

下载

相关标签:

java redis

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10197

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7322

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6432

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2689

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20011

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1195

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习