【黑马点评学习笔记 | 实战篇 】| 10-用户签到+UV统计
Bug如山勤为径代码似海苦作舟。友友们好这里是苦瓜大王。今天学习的是黑马点评项目实战篇——用户签到UV统计部分的学习。学完这一部分主播会暂时将后面的高级篇和原理篇搁置后面有时间了再学习。本节笔记如下后续会一直更新黑马点评学习过程中的笔记、问题等请多多支持哦文章目录一、用户签到1.BitMap基本命令2.实现签到功能3.统计连续签到二、UV统计1.HyperLogLog的用法2.实现UV统计一、用户签到使用位图进行签到统计1.BitMap基本命令示例11100111u指转成无符号数i指转为有符号数2.实现签到功能UserController/** * 签到功能 */PostMapping(/sign)publicResultsign(){returnuserService.sign();}UserServiceImpl/** * 签到功能 * return */publicResultsign(){// 1.获取当前登录用户LonguserIdUserHolder.getUser().getId();// 2.获取日期LocalDateTimenowLocalDateTime.now();// 3.拼接keyStringkeySuffixnow.format(DateTimeFormatter.ofPattern(:yyyyMM));StringkeyUSER_SIGN_KEYuserIdkeySuffix;// 4.获取今天是本月的第几天intdayOfMonthnow.getDayOfMonth();// 5.写入Redis SETBIT key offset 1stringRedisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);returnResult.ok();}前端没有做这个功能所以用ApiFox测试http://localhost:8080/api/user/signPOST记得带上令牌哦然后查看Redis里是否在你当前日期签到了3.统计连续签到实现签到统计用1做与运算就能得到最后一个比特位UserController/** * 统计连续签到 */GetMapping(/sign/count)publicResultsignCount(){returnuserService.signCount();}UserServiceImpl/** * 统计连续签到 */publicResultsignCount(){// 1.获取当前登录用户LonguserIdUserHolder.getUser().getId();// 2.获取日期LocalDateTimenowLocalDateTime.now();// 3.拼接keyStringkeySuffixnow.format(DateTimeFormatter.ofPattern(:yyyyMM));StringkeyUSER_SIGN_KEYuserIdkeySuffix;// 4.获取今天是本月的第几天intdayOfMonthnow.getDayOfMonth();// 5.获取本月截止今天为止的所有的签到记录返回的是一个十进制的数字 BITFIELD sign:5:202203 GET u14 0 ListLong result stringRedisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if(resultnull||result.isEmpty()){// 没有任何签到结果returnResult.ok(0);}Longnumresult.get(0);if(numnull||num0){returnResult.ok(0);}// 6.循环遍历intcount0;while(true){// 6.1.让这个数字与1做与运算得到数字的最后一个bit位 // 判断这个bit位是否为0if((num1)0){// 如果为0说明未签到结束break;}else{// 如果不为0说明已签到计数器1count;}// 把数字右移一位抛弃最后一个bit位继续下一个bit位num1;}returnResult.ok(count);}二、UV统计1.HyperLogLog的用法所以引入了HLL不仅操作简单而且占内存小而且HLL不会计算重复的数据2.实现UV统计通过info memory查看当前redis占用内存前后进行对比我们会发生他的误差是在允许范围内并且内存占用极小TestvoidtestHyperLogLog(){// 准备数组,装用户数据String[]usersnewString[1000];// 数组角标intindex0;for(inti1;i1000000;i){// 赋值users[index]user_i;// 每1000条发送一次if(i%10000){index0;stringRedisTemplate.opsForHyperLogLog().add(hll1,users);// 统计数量LongsizestringRedisTemplate.opsForHyperLogLog().size(hll1);System.out.println(size size);}}}以上就是黑马点评实战篇——用户签到UV统计部分的学习笔记仅供参考多多支持主播对于黑马点评部分的学习会暂时告一段落因为后面的部分对于校招找工作来说暂时有点深奥用不上所以一般的路线不会再继续学下去了但是主播后续一定会捡起来重新学习 。接下来我应该会找一个项目做做同样也会在CSDN上持续更新友友们可以先点赞关注后续会有其他的Java后端内容发布哦
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433797.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!