redis的bitmap实现用户签到天数统计

我们知道 redis中的bitmap对应有二的三十二次幂个bit位,我们们统计每个用户当前月的 每一天的是否签到,我们只需要把月份跟bit位进行 对应,比如现在是 2021年的10月,我们把10月1号当天是否签到对应第一个bit位,签到了把对应bit位改为1,没有签到,就使用原始数字0,这样就能完成签到功能

签到功能代码

我们把 10月第1天 第四天 第五天 第21天 22天的bit位都设置为1,代表着签到 ,在我们的 图形化界面中 是从左往右看的

我们可以看到 第0 号位 3 4 20 21号位都设置为1了,因为设置的时候是 从0号位开始,我们得到当天的天数之后,需要减一 天数,才是对应的bit位

对应的代码如下

统计签到天数

我们统计签到天数的话,以10月为例子,我们统计从10月1号到今天10月22号的签到天数的话

1.首先获得本月的第几天

2.然后把获得到的redis的对应的 bitmap的值拿出来,按位与上1,如果最后一位是1,则代表签到过,那么就把计数器加一

3.如果按位与是0,那就代表着 今天没签到

4.做完这些动作之后,再把bitmap的值拿出来,向右移动一位,这样每次按位与 1的话得到的都是上一天的是否签到

代码如下

java 复制代码
    @Test
//查看用户连续签到天数
    public void redisBitMapTest2(){
        //获取到 本月的第几天
        int dayOfMonth = LocalDateTime.now().getDayOfMonth();
        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));

        BitFieldSubCommands bitFieldSubCommands = BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth )).valueAt(0);
        List<Long> list1 = stringRedisTemplate.opsForValue()
                .bitField(RedisConstants.USER_SIGN_KEY + 1 + format, bitFieldSubCommands);
        Long l = list1.get(0);
        System.out.println(l);
        String binaryNumber =   Long.toBinaryString(l);
        System.out.println("十进制数字 " + l+ " 的二进制表示为: " + binaryNumber);
        int count=0;
        while (dayOfMonth>0){
    if((l&1)==0){
      dayOfMonth--;
    }else {
        count++;
    }
    l=l>>>1;
}
        System.out.println(count);
    }

具体的bitmap的redis的api大家可以自行百度

运行结果如下

最后打印的count的值为5,也就是说 跟我们之前设置的签到次数是一样的

相关推荐
whcyhhh13 分钟前
头歌实践教学平台:数据科学与大数据技术导论(七上)
大数据·数据库·python
夕除1 小时前
redis--007
数据库·分布式
润乾软件1 小时前
CodeBuddy+SQLazy 编写复杂 SQL 详解
数据库·sql·codebuddy·sqlazy
360智汇云1 小时前
MySQL-DTS数据同步工具:告别手动拼方案,迁移同步一站完成
数据库·mysql
东方护航数据恢复(深圳)1 小时前
国产信创数据库(达梦DM8/人大金仓)损坏恢复技术:从DMF文件解析到数据字典重建
大数据·数据库
这个DBA有点耶1 小时前
GaussDB和金仓KingbaseES本质差异:技术路线、Oracle兼容度、适用场景全解析
数据库·oracle·架构
LINgZone22 小时前
系统架构与分支规范
java·数据库·架构
这个DBA有点耶2 小时前
SQL优化进阶:读懂“索引下推”,告别回表噩梦
数据库·sql·性能优化
发量惊人的中年网工2 小时前
如何验证DDoS高防真的生效?从源站隐藏到正常访问的完整验收方法
运维·网络·数据库·ddos
Aloudata3 小时前
数据治理台账 vs 元数据知识图谱:数据资产如何从文档走向计算化
数据库·人工智能·知识图谱·数据治理·元数据·数据资产·数据血缘