注意 比特位是二进制只可以是 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博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
评论(0)