BitMap用法



实现签到功能

java
@Override
public Result sign() {
//获取当前用户
Long userId = UserHolder.getUser().getId();
//获取日期
LocalDateTime now = LocalDateTime.now();
//拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyMM"));
String key = USER_SIGN_KEY + userId + keySuffix;
//判断当前日期是本月第几天
int dayOfMonth = now.getDayOfMonth();
//存入bitmap SetBit key offset 1
stringRedisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);
return Result.ok();
}
统计连续签到


java
@Override
public Result signCount() {
//获取当前用户
Long userId = UserHolder.getUser().getId();
//获取日期
LocalDateTime now = LocalDateTime.now();
//拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyMM"));
String key = USER_SIGN_KEY + userId + keySuffix;
//判断当前日期是本月第几天
int dayOfMonth = now.getDayOfMonth();
//获取本月截止今天为止的所有的签到记录,返回的是一个十进制的数字 BITFIELD sing:5:202603 GET u24 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);
}
int count = 0;
while (true){
//让这个数字和1做与运算,得到数字的最后一个bit位,判断这个bit是否为0
if((num & 1) == 0){
//如果为0,说明这个日期没有签到,结束循环
break;
}else {
count++;
}
//数字右移一位,抛弃最后一个bit位,继续下一个bit位
num >>>= 1;
}
return Result.ok(count);
}
UV统计
HyperLogLog用法


java
@Test
void testHyperLogLog(){
String[] values = new String[1000];
int j = 0;
for (int i = 0; i < 1000000; i++) {
j = i % 1000;
values[j] = "user_" + i;
if(j ==999){
//发送到redis
stringRedisTemplate.opsForHyperLogLog().add("hl1",values);
}
}
Long hl1 = stringRedisTemplate.opsForHyperLogLog().size("hl1");
System.out.println("hl1 = " + hl1);
}
