针对黑马点评。
bitmap签到
在传统的签到系统中的数据库的表一般都采取直接存储的形式,类似于一种记录表,但是如果用户的数量特别大,签到上几个月之后,这种表的数据量特别大,同时,存储的数据也会占用很多的内存资源。
so BitMap这种通过二进驻存储的思想就出现了。
简单命令使用
直接存储二进制
bitmap的操作一般都是存储在String数据结构中。
java实操:
@Override
public Result sign() {
//1.获取当前登录的用户
Long userId = UserHolder.getUser().getId();
//2.获取日期
LocalDateTime now = LocalDateTime.now();
//3.拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyy/MM"));
String key = USER_SIGN_KEY + userId + keySuffix;
//4.获取今天是本月的第几天
int dayOfMonth = now.getDayOfMonth();
//5.写入Redis setrbit key offset 1
Boolean b = stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
return Result.ok();
}
如果代码不好阅读,可以直接看注释,学习一种思想,不是学习一块代码
签到统计
统计思想
java实战
@Override
public Result signCount() {
//1.获取当前登录的用户
Long userId = UserHolder.getUser().getId();
//2.获取日期
LocalDateTime now = LocalDateTime.now();
//3.拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyy/MM"));
String key = USER_SIGN_KEY + userId + keySuffix;
//4.获取今天是本月的第几天
int dayOfMonth = now.getDayOfMonth();
//5.获取本月截止今天为止的所有的签到记录并返回一个十进制的数字
List<Long> result = stringRedisTemplate.opsForValue().bitField(
key,
BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0)
);
System.out.println("result:"+result);
if(result == null || result.isEmpty()){
//没有任何签到结果
return Result.ok(0);
}
Long num = result.get(0);
//6.循环遍历
int count = 0;
while(true){
//6.1让这个数字与1做与运算,的刀片数字的最后一个bit位 //判断这个bit位是否为0
if( (num & 1) == 0 ){
//如果为0,说明未签到,结束
break;
}else {
//如果不为0,说明已签到,计数器+1
count++;
}
//把数字右移一位,抛弃最后一个bit位,继续下一个bit位
num >>>= 1;
}
System.out.println("count:"+count);
return Result.ok(count);
}
同样,如果代码阅读有问题,建议只看注释