用户签到
BitMap
BitMap的用法
常用操作命令
签到功能
年月日的时间可以用LocalDateTime
@Override
public Result sign() {
Long userId = UserHolder.getUser().getId();
LocalDateTime now = LocalDateTime.now();
String yyyyMM = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
String key = "sign:"+userId+yyyyMM;
int dayOfMonth = now.getDayOfMonth();
stringRedisTemplate.opsForValue().setBit(key,dayOfMonth - 1, true);
return Result.ok();
}
签到统计
是否连续签到
@Override
public Result signCount() {
Long userId = UserHolder.getUser().getId();
LocalDateTime now = LocalDateTime.now();
String yyyyMM = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
String key = "sign:"+userId+yyyyMM;
int dayOfMonth = now.getDayOfMonth();
List<Long> results = stringRedisTemplate.opsForValue().bitField(
key,
BitFieldSubCommands.create()
.get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0)
);
if(results == null || results.isEmpty()) {
return Result.ok(0);
}
Long num = results.get(0);
if (num == null || num == 0) {
return Result.ok(0);
}
int count = 0;
while (true) {
if ((num & 1) == 0) {
break;
} else {
count++;
}
num >>>= 1;
}
return Result.ok(count);
}
num >>>= 1;
}
return Result.ok(count);
}