9.Redis实战—用户签到

用户签到 :

逻辑实现 :

9.Redis实战—用户签到_第1张图片

9.Redis实战—用户签到_第2张图片

9.Redis实战—用户签到_第3张图片

代码实现 :

// TODO 实现用户签到功能
@Override
public Result sign() {
    // TODO 1.获取用户信息 :
    Long userId = UserHolder.getUser().getId();
    // TODO 2.获取日期信息
    LocalDateTime now = LocalDateTime.now();
    String keySuffix = now.format(DateTimeFormatter.ofPattern("yyyy:MM"));
    // TODO 3.拼接key
    String key = "sign:" + userId + keySuffix;
    // TODO 4.获取今天是本月的第几天 , 注意这里是从1 到 31 ,
    //  而我们的redis的值是从0 到 30 , 所以 , 这里要减一
    int dayOfMonth = now.getDayOfMonth();
    // TODO 5.写入Redis . SETBIT key offset 1 , 这里使用boolean值是为了节省空间 , 所以这里使用true
    stringRedisTemplate.opsForValue().setBit(key,dayOfMonth - 1,true);
    return Result.ok();
}

签到统计 :

统计连续签到天数 :

//TODO 获取连续签到天数 
@Override
public Result signCount() {
    // TODO 1.获取用户信息 :
    Long userId = UserHolder.getUser().getId();
    // TODO 2.获取日期信息
    LocalDateTime now = LocalDateTime.now();
    String keySuffix = now.format(DateTimeFormatter.ofPattern("yyyy:MM"));
    // TODO 3.拼接key
    String key = "sign:" + userId + keySuffix;
    // TODO 4.获取今天是本月的第几天 , 注意这里是从1 到 31 ,
    //  而我们的redis的值是从0 到 30 , 所以 , 这里要减一
    int dayOfMonth = now.getDayOfMonth();
    // TODO 5.获取本月截止今天为止的签到记录 , 返回的是一个十进制数字
    List<Long> list = stringRedisTemplate.opsForValue().bitField(
            key,
            BitFieldSubCommands.create()
                    .get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0)
    );
    if (list == null || list.isEmpty()) {
        // 没有签到结果
        return Result.ok(0);
    }
    Long num = list.get(0);
    if (num == null || num == 0){
        return Result.ok(0);
    }
    int count = 0;
    // TODO 6.循环遍历
    while (true) {
        // TODO 7.让这个数字与1做与运算 , 得到数字的最后一个bit位
        // TODO 8.判断这个bit位是否是0
        if ((num & 1) == 0) {
            // 为零说明未签到 , 结束
            break;
        }else{
            // 不为零 , 说明已签到 , 计数器 +1
            count++;
        }
        // TODO 9.把数字右移一位 , 继续下一个bit位
        num >>>= 1;
    }

    return Result.ok(count);
}

你可能感兴趣的:(Redis,redis)