本文主要是介绍黑马点评10——用户签到-BitMap数据结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- BitMap用法
- 签到功能
- 签到统计
BitMap用法
其实数据库完全可以实现签到功能
但签到数据比较大,借鉴签到卡的思想
布隆过滤器也是使用BitMap实现的.
签到功能
因为是当前用户的当天,所以保存需要的年月日不需要参数,可以直接获取。
@Overridepublic Result sign() {// 1. 获取当前登录用户Long userId = UserHolder.getUser().getId();// 2. 获取日期LocalDateTime now = LocalDateTime.now();// 3. 拼接KeyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String key = USER_SIGN_KEY + userId + keySuffix;// 4. 获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();// 5. 写入redis SETBIT key offset 1stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);return Result.ok();}
签到统计
@Overridepublic Result signCount() {// 1. 获取当前登录用户Long userId = UserHolder.getUser().getId();// 2. 获取日期LocalDateTime now = LocalDateTime.now();// 3. 拼接KeyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));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));if(result == null || result.isEmpty()){return Result.ok();}Long num = result.get(0);if(num == null || num == 0){return Result.ok();}// 6. 循环遍历,统计1的个数int count = 0;while(num != 0){if((num & 1) == 1){count++;}else{break; // 因为是连续签到,缺勤的就结束统计}num >>>= 1;}return Result.ok(count);}
这篇关于黑马点评10——用户签到-BitMap数据结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!