Redis 签到、补签、连续签到代码

1.先了解一下什么是Redis位图

Redis::setbit()//第一个参数是key 第二个参数是当月的月数 第三个是签到或者未签到 0和1表示

Redis::getbit()//第一个参数是key 第二个参数是当月的月数

Redis::bitcount()//计算签到总天数

签到

 /**
     * 签到
     * @return false|int
     */
    public function redisDemo(){
        $uid = 1;//用户id
        $day = date('d');// 日
        $key = 'user_'.date('m').'_'.$uid;//月
        $yes = date('d',strtotime('-1 day'));//$yes = 26 号
        $res = Redis::getbit($key,$day); //$day = 27 号
        $count = 1;
        if ($res == 1){
            //统计一个月签到总数
            echo '今天已经签到,这个月总共签到'.Redis::bitcount($key,1)."\n";
            return 11;
        }else{
            //判断昨天有没有签到   1签到 0没签到
            if (Redis::getbit($key,$yes) == 0){
                Redis::setbit($key,$day,1);
                return 22;
            }else{
                //判断连续签到
                Redis::setbit($key,$day,1);
                for ($i=intval($day)-1;$i>0;$i--){
                    if (Redis::getbit($key,$i) == 0){
                        echo '连续签到成功,已经连续签到'.$count.'天';
                        return  false;
                    }else{
                        $count+= 1;
                    }
                }

                return 333;
            }
        }
    }

补签

 /**
     * 补签
     * @return false|string
     */
    public function buqian()
    {
        $uid = \request()->get('uid');
        $day1 = \request()->get('day');
        $mon = date('m');
        $day2 = date('d');
        if ($day1 >= $day2){
            return "不能补签未来的签到";
        }
        $int1 = intval($day1);
        $int2 = intval($day2);
        $yes = date('d',strtotime('-1 day'));
        $key = 'user_'.$mon.'_'.$uid;//月
        $count = 1;
        if (Redis::getbit($key,$int1) == 1){
            return '第'.$day1.'天已签到';
        }else{
            Redis::setbit($key,$int1,1);
            //计算补签之后到今天的连签天数
            for ($i=$int2-1;$i>=$int1;$i--){
                if (Redis::getbit($key,$i) == 0){
                    echo "已连续签到".$count.'天';
                    return false;
                }else{
                    $count++;
                }
            }
            //计算补签那天以及之前是否连签
            for ($i=$int1-1;$i>=0;$i--){
                if (Redis::getbit($key,$i) == 0){
                    echo "已连续签到".$count.'天';
                    return false;
                }else{
                    $count++;
                }
            }
        }
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值