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)." "; 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 = equest()->get(uid); $day1 = equest()->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++; } } } }