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

如何在Spring Boot中使用Redis的Bitmap实现签到打卡

夏辰吖_4342

夏辰吖_4342

发布时间:2026-09-11 07:16:19

|

480人浏览过

|

来源于php中文网

原创

Redis Bitmap本质是String的位操作,需用SETBIT/GETBIT等原生命令,Spring Data Redis不提供高级封装;键名应含用户ID与日期,如sign:uid:123:20240501;签到用setBit设对应offset为1;批量操作推荐BITFIELD;统计用BITCOUNT并注意空key与过期设置。

如何在spring boot中使用redis的bitmap实现签到打卡

Bitmap在Redis里不是独立数据类型,而是string的位操作

很多人一看到“Redis Bitmap”就以为是新结构,其实它只是对SETBIT、GETBIT、BITCOUNT这些命令的操作封装,底层还是String。Spring Data Redis提供了RedisTemplate和StringRedisTemplate两种模板,但直接用opsForValue()没法做位操作——必须用execute()配合RedisCallback或SessionCallback。

常见错误是试图用redisTemplate.opsForValue().set("sign:20240501", "1")来模拟签到,这完全没用:它存的是字符串,不是位图;后续BITCOUNT会报错或返回0。

  • Bitmap操作必须走原生命令,Spring Data Redis不提供高级API封装
  • 键名设计建议带用户ID和日期维度,比如sign:uid:123:20240501,避免单个key过大
  • 如果想按月统计,可用BITOP AND合并多日key,但要注意key数量不能超1024(Redis限制)

用execute()调用SETBIT实现每日签到

签到本质就是把某一天对应的位置设为1。假设用户ID=123,今天是2024-05-01,我们约定:每月1号对应bit 0,2号对应bit 1……31号对应bit 30。那么5月1日就是bit 0。

redisTemplate.execute((RedisConnection connection) -> {
    String key = "sign:uid:123:202405";
    long offset = 0; // 5月1日 → offset=0
    connection.setBit(key.getBytes(), offset, true);
    return null;
});

注意几个关键点:

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

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

下载
  • key.getBytes()必须用字节数组,不能传String;否则setBit会静默失败
  • offset是long类型,最大支持2^64-1,但实际别超过几百万,否则key体积暴涨
  • 不要在循环里反复调用execute(),批量签到要用BITFIELD(见下一条)

用BITFIELD一次完成多日签到或查询连续签到天数

BITFIELD是Redis 3.2+引入的原子命令,能在一个请求里读写多个位,比多次SETBIT/GETBIT快得多,也避免并发问题。比如要查用户最近7天是否全签到,可以这样:

List<Long> results = redisTemplate.execute((RedisConnection connection) -> {
    String key = "sign:uid:123:202405".getBytes();
    return connection.bitField(key,
        BitFieldSubCommand.get(BitFieldSubCommand.BitFieldType.unsigned(7)).offset(0)
    );
});
// results.get(0) 就是低7位组成的整数,值为127表示7天全签到

更实用的是计算「当前连续签到天数」:从今天往前扫,直到遇到第一个0。这时用BITFIELD配合GET和足够大的位宽(比如32)一次取回,再在Java里遍历判断,比发32次GETBIT强太多。

  • BITFIELD返回的是List<Long>,每个元素对应一个GET子命令的结果
  • 位宽选太小(如u1)只能读1位,没意义;选太大(如u64)可能读到未设置的高位,默认补0
  • 如果跨月(比如4月30日→5月1日),必须拆成两个key查,Redis不支持跨key位运算

用BITCOUNT统计当月签到次数时,小心key过期和空key

BITCOUNT统计指定key中值为1的bit个数,很适合算当月打卡总数。但容易踩两个坑:

  • 如果用户当月从未签到,key不存在,BITCOUNT返回0——这是对的;但如果key存在但全是0(比如误操作写了0),也会返回0,无法区分“没签过”和“全签了0”
  • 没设过期时间的话,sign:uid:123:202405会一直占内存;建议在创建key时用EXPIRE设32天过期(覆盖整月+缓冲)
  • 高并发下,多个线程同时对同一key执行SETBIT是安全的(Redis单线程),但BITCOUNT前要不要加锁?不用——它只读,且结果实时

真正麻烦的是“首次签到自动建key+设过期”,得在execute()里用SETNX + EXPIRE组合,或者干脆用SET key value EX 2592000 NX一条命令搞定。

热门AI工具

更多
Lovart
Lovart Hot

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

咔片AIPPT

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

WorkBuddy

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞绘文

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

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

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

豆包大模型

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

DeepSeek

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2211

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

417

2026.01.26

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

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

430

2025.09.05

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

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

323

2025.11.16

golang map原理
golang map原理

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

493

2025.11.17

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

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

243

2025.11.27

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

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

4169

2023.11.02

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

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

3635

2023.11.14

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

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

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