注意 比特位是二进制只可以是 0 或 1。

Bitmaps 相关命令

  • BITCOUNT:统计(可选起始结束)数量 参数:Key Start End
  • BITFIELD:操作(查询、修改、自增)BitMap中bit数组指定位置的值
  • BITOP:将多个BitMap的结果做位运算(与、或、异或)
  • BITPOS:查找Bit数组中指定范围内第一个0或1出现的位置
  • GETBIT:获取指定位置的bit值
  • SETBIT:添加/修改元素 参数:Key 位 值

实验:实现签到

    @Test
    public void 签到() {
        LocalDateTime now = LocalDateTime.now();
        int dayOfMonth = now.getDayOfMonth();
        Boolean 签到结果 = redisTemplate.opsForValue().setBit("七月签到", dayOfMonth - 1, true);
        //Boolean 模拟昨天签到 = redisTemplate.opsForValue().setBit("七月签到", dayOfMonth - 2, true);
    }

Redis存储字符串是以字节存储,而1字节等于4比特位,今天是本月第一天,我签到就是1000,如果我仅第是6天签到显示的二进制就是00000600,也就是说第六天得占用2字节,没用的位的补0。

连续签到

原理:连续签到实现:循环(目标数与1做与运算,运算后判断是否是0,不是0,向右移1位)

    // 如果今天没有签到,结果就是0
    @Test
    public void 统计连续天数() {
        LocalDateTime now = LocalDateTime.now();
        Long 十进制结果 = (Long) redisTemplate.opsForValue()
                .bitField("七月签到", BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(now.getDayOfMonth())).valueAt(0))
                .get(0); // 获取目标数
        int count = 0; // 定义计数器
        while (true) {
            if ((十进制结果 & 1) == 0) { // 目标数与1进行与运算
                break;
            } else {
                count++; // 计数器+1
            }
            十进制结果 = 十进制结果 >>> 1; // 开始右移1位
        }
        System.out.println(count);
    }

    @Test
    public void 判断昨天有没有签到() {
        LocalDateTime now = LocalDateTime.now();
        Long 十进制结果 = (Long) redisTemplate.opsForValue()
                .bitField("七月签到", BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(now.getDayOfMonth())).valueAt(0))
                .get(0);
        int count = 0;
        十进制结果 = 十进制结果 >>> 1;

        if ((十进制结果 & 1) == 0) {
            System.out.println("昨天没有签到");
        } else {
            count++;
        }
        System.out.println(count);
    }
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤