1
2
-
SETBIT:向指定位置(offset)存入一个0或1 -
GETBIT:获取指定位置(offset)的bit值 -
BITCOUNT:统计BitMap中值为1的bit位的数量 -
BITFIELD:操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值 -
BITFIELD_RO:获取BitMap中bit数组,并以十进制形式返回 -
BITOP:将多个BitMap的结果做位运算(与 、或、异或) -
BITPOS:查找bit数组中指定范围内第一个0或1出现的位置
3
-
实现签到接口,将当前用户当天签到信息保存到Redis中
@PostMapping("sign")
public Result sign() {
return userService.sign();
}
public Result sign() {
//1. 获取登录用户
Long userId = UserHolder.getUser().getId();
//2. 获取日期
LocalDateTime now = LocalDateTime.now();
//3. 拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
String key = RedisConstants.USER_SIGN_KEY + userId + keySuffix;
//4. 获取今天是本月的第几天
int dayOfMonth = now.getDayOfMonth();
//5. 写入redis setbit key offset 1
stringRedisTemplate.opsForValue().setBit(key, dayOfMonth -1, true);
return Result.ok();
}
4
BITFIELD key GET u[dayOfMonth] 0
@GetMapping("/signCount")
public Result signCount() {
return userService.signCount();
}
public Result signCount() {
//1. 获取登录用户
Long userId = UserHolder.getUser().getId();
//2. 获取日期
LocalDateTime now = LocalDateTime.now();
//3. 拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
String key = RedisConstants.USER_SIGN_KEY + userId + keySuffix;
//4. 获取今天是本月的第几天
int dayOfMonth = now.getDayOfMonth();
//5. 获取本月截至今天为止的所有的签到记录,返回的是一个十进制的数字 BITFIELD sign:5:202301 GET u3 0
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);
}
//6. 循环遍历
int count = 0;
while (true) {
//6.1 让这个数字与1 做与运算,得到数字的最后一个bit位 判断这个数字是否为0
if ((num & 1) == 0) {
//如果为0,签到结束
break;
} else {
count ++;
}
num >>>= 1;
}
return Result.ok(count);
}
5
-
判断id<0 -
数据库为空的话,向redis里边把这个空数据缓存起来
-
第一种解决方案:遇到的问题是如果用户访问的是id不存在的数据,则此时就无法生效 -
第二种解决方案:遇到的问题是:如果是不同的id那就可以防止下次过来直击数据
6
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
往期推荐


