9.Redis实战—用户签到

用户签到 :

逻辑实现 :

image-20220420202625827

image-20220420202752630

image-20220420203940842

代码实现 :

// 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);
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值