需求:實現下面介面,統計當前使用者截止當前時間在本月的連續簽到天數
有使用者有時間我們就可以組織出對應的key,此時就能找到這個使用者截止這天的所有簽到記錄,再根據這套演算法,就能統計出來他連續簽到的次數了
程式碼
UserController
@GetMapping("/sign/count") public Result signCount(){ return userService.signCount(); }
UserServiceImpl
@Override public Result signCount() { // 1.獲取當前登入使用者 Long userId = UserHolder.getUser().getId(); // 2.獲取日期 LocalDateTime now = LocalDateTime.now(); // 3.拼接key String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM")); String key = USER_SIGN_KEY + userId + keySuffix; // 4.獲取今天是本月的第幾天 int dayOfMonth = now.getDayOfMonth(); // 5.獲取本月截止今天為止的所有的簽到記錄,返回的是一個十進位制的數字 BITFIELD sign:5:202203 GET u14 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); } // 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; } return Result.ok(count); }
以上就是app直播原始碼,當前使用者截止當前時間在本月的連續簽到統計, 更多內容歡迎關注之後的文章