app直播原始碼,當前使用者截止當前時間在本月的連續簽到統計

云豹科技-苏凌霄發表於2024-03-23

需求:實現下面介面,統計當前使用者截止當前時間在本月的連續簽到天數

有使用者有時間我們就可以組織出對應的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直播原始碼,當前使用者截止當前時間在本月的連續簽到統計, 更多內容歡迎關注之後的文章

相關文章