欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Redis中BitMap实现签到与统计连续签到功能

Redis中BitMap实现签到与统计连续签到功能

2025/10/21 18:25:31 来源:https://blog.csdn.net/weixin_53515812/article/details/142724871  浏览:    关键词:Redis中BitMap实现签到与统计连续签到功能

服务层代码
//签到@Overridepublic Result sign() {//1.获取当前登录的用户Long userId = UserHolder.getUser().getId();//获取日期LocalDateTime now = LocalDateTime.now();//拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;//获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();//写入Redis SETBIT key offset 1stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);return Result.ok();}//统计连续签到@Overridepublic Result signCount() {//1.获取当前登录的用户Long userId = UserHolder.getUser().getId();//获取日期LocalDateTime now = LocalDateTime.now();//拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;//获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();//获取本月截止今天为止的所有签到记录,返回的是一个十进制的数字  BITFIELD sign:5:202409 GET u14 0  14为要查多少位即当月为几号  0为从1号开始查List<Long> result = stringRedisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if (result == null || result.isEmpty()){//没有任何签到结果return Result.ok(0);}Long num = result.get(0);if(num == null || num == 0){return Result.ok(0);}//循环遍历int count = 0;while(true){//让这个数据与1作与运算,得到数字的最后一个bit位   判断这个bit位是否为0if((num & 1) == 0){//如果为0,说明未签到,结束break;} else {//如果为1,说明已签到,计数器加1count++;}num >>>= 1;}return Result.ok(count);}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词