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++;
}
}
}
}
