Use Redis bitmap to sign in public numbers on a microengine

Keywords: Redis

First of all, business rules can be rewarded for first signing in and for two consecutive days can be rewarded for signing in.
Because openid is used instead of user's uid
So the key designed here is openid and the offset to determine whether the user checks in or not is calculated at a cheaper price that does not start at a certain starting time.
Another solution is to use the date of the day as the key and the offset as the user's uid.

redis event record RedisManager
Get the singleton getRedisConn
Check in setSignUser ($openid)
Judge today to check in getTodaySign ($openid)
Check in getThisDaySign ($openid,$date)
Calculate the total number of check-ins countAllSignDay ($openid)
Calculate countContinueSignDay ($openid)
It's a few times short of checking in getAward NeedDays ($openid)
Identify if today's lottery decision_award ($openid)

class RedisManager
{
    private static $redisInstance;

    const SIGNSTARTDATA="2019-01-03";
    const CANAWARD=2002;
    const NOTAWARD=2004;
    const SIGNDAYSCANAWARD=2006;
    const SIGNDAYSCANNOTAWARD=2007;
    const FISRTSIGN=2008;
    const REPEATSIGN=2009;
    const SUFFIX="_2019";
    const PREFIX="sign_";

    private function __construct(){}

     static public function getRedisConn(){
        if(!self::$redisInstance instanceof self){
            self::$redisInstance = new self;
        }
        $temp = self::$redisInstance;
        return $temp->connRedis();
    }

    static  function connRedis()
    {     
        try {
            $redis_ocean = new Redis();
            $redis_ocean->connect("127.0.0.1","6333");
            $redis_ocean->auth("Zdklingchen");

        }catch (Exception $e){
            echo $e->getMessage().'<br/>';
        }
        return $redis_ocean;
    }

    static function setSignUser($openid){//Sign in
        $redis=RedisManager::getRedisConn();
        $cacheKey=RedisManager::PREFIX.$openid.RedisManager::SUFFIX;
        $startDate = RedisManager::SIGNSTARTDATA;
        $todayDate = date("Y-m-d");       
        $startTime = strtotime($startDate);
        $todayTime = strtotime($todayDate);
        $offset = floor(($todayTime - $startTime) / 86400);
       return  $redis->setBit($cacheKey, $offset, 1);
    }

     static function getTodaySign($openid){//Judging an openid today
        $redis=RedisManager::getRedisConn();
        $cacheKey=RedisManager::PREFIX.$openid.RedisManager::SUFFIX;
        $startDate = RedisManager::SIGNSTARTDATA;
        $todayDate = date("Y-m-d");       
        $startTime = strtotime($startDate);
        $todayTime = strtotime($todayDate);
        $offset = floor(($todayTime - $startTime) / 86400);
        $bitStatus = $redis->getBit($cacheKey, $offset);
        return $bitStatus;
    }

    static function getThisDaySign($openid,$date){//Determine whether an openid checks in 0/1 on a particular day
        $redis=RedisManager::getRedisConn();
       $cacheKey=RedisManager::PREFIX.$openid.RedisManager::SUFFIX;
        $startDate = RedisManager::SIGNSTARTDATA;
        $todayDate = $date;       
        $startTime = strtotime($startDate);
        $todayTime = strtotime($todayDate);
        $offset = floor(($todayTime - $startTime) / 86400);
        $bitStatus = $redis->getBit($cacheKey, $offset);
        return $bitStatus;
    }

    static  function countAllSignDay($openid){//Calculate cumulative check-in times
        $redis=RedisManager::getRedisConn();
        $cacheKey=RedisManager::PREFIX.$openid.RedisManager::SUFFIX;
       return  $redis->bitCount($cacheKey);
    }

    static  function countContinueSignDay($openid){//Calculate the number of consecutive checkins
        $redis=RedisManager::getRedisConn();
        $cacheKey=RedisManager::PREFIX.$openid.RedisManager::SUFFIX;             
        $todayIsSign=RedisManager::getTodaySign($openid);
        if ($todayIsSign == 0) {
          $todayDate=date("Y-m-d",strtotime("-1 day"));       
        }else{
          $todayDate = date("Y-m-d"); 
        }
        $startDate = RedisManager::SIGNSTARTDATA;
        $startTime = strtotime($startDate);  
        $todayTime = strtotime($todayDate);

        $offset = floor(($todayTime - $startTime) / 86400);

        $countContinueSignDayNum=0;
        for ($i=$offset; $i >= 0; $i--) {            
            $BitRes=$redis->getBit($cacheKey, $i);
            if ($BitRes == 1) {
                $countContinueSignDayNum++;
                continue;
            }else{
                break;
            }
        }
        return $countContinueSignDayNum;
    }

    static function getAwardNeedDays($openid){
        $todayIsSign=RedisManager::getTodaySign($openid);
        $totalCountSign=RedisManager::countAllSignDay($openid);

         if ($totalCountSign == 1 && $todayIsSign == 1) {//I haven't checked in yet.
             $data=array(
                     "code"=>RedisManager::FISRTSIGN,
                     "needsDays"=>2,
                     "msg"=> "First sign has sign,can get arawd",
                 );
             return $data;
         }

        if ($totalCountSign == 0 && $todayIsSign == 0) {//I haven't checked in yet.
             $data=array(
                     "code"=>RedisManager::FISRTSIGN,
                     "needsDays"=>0,
                     "msg"=> "First sign has  not sign",
                 );
             return $data;

        }else{
             $YesterDay=date("Y-m-d",strtotime("-1 day"));
            $YesterDaySignData=RedisManager::getThisDaySign($openid,$YesterDay);
            if ($YesterDaySignData == 0) {//Didn't sign in yesterday
                   if ($todayIsSign == 0) {
                         $data=array(
                             "code"=>RedisManager::SIGNDAYSCANAWARD,
                             "needsDays"=>2,
                            "msg"=> "Today is  not sign And YesterDay is not sign ",
                             );
                        return $data;
                   }else{
                        $data=array(
                             "code"=>RedisManager::SIGNDAYSCANAWARD,
                             "needsDays"=>1,
                            "msg"=> "Today  has  sign But YesterDay is not sign  ",
                             );
                        return $data;
                   }
            }else{
               $continueSignNum=RedisManager::countContinueSignDay($openid);
                if ($totalCountSign == $continueSignNum && $totalCountSign > 0 ) {//Check-in has been uninterrupted
                        if ($todayIsSign == 0) {
                                if ($totalCountSign%2 == 0 ) {
                                         $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                            "needsDays"=>1,
                                            "msg"=> "Today is  not sign  But sign is continue  ",
                                        );
                                        return $data;
                                }else{
                                     $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                             "needsDays"=>2,
                                            "msg"=> "Today is  not sign  But sign is continue   ",
                                             );
                                 return $data;
                                }

                        }else{//Signed in today
                                  if ($totalCountSign%2 == 0 ) {
                                         $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                            "needsDays"=>1,
                                            "msg"=> "Today has sign And sign is continue  ",
                                        );
                                        return $data;
                                }else{
                                     $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                             "needsDays"=>2,
                                            "msg"=> "Today has sign And sign is continue  ",
                                             );
                                 return $data;
                                }
                        }
                }else{
                      if ($todayIsSign == 0) {
                            if ($continueSignNum%2 == 0 ) {
                                 $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                             "needsDays"=>1,
                                            "msg"=> "Today is  not sign But sign is not  continue  ",
                                             );
                                 return $data;
                            }else{
                                $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                             "needsDays"=>2,
                                            "msg"=> "Today is  not sign  But sign is not  continue   ",
                                             );
                                 return $data;
                            }
                      }else{
                         if ($continueSignNum%2 == 0 ) {
                                 $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                             "needsDays"=>2,
                                            "msg"=> "Today is  has  sign  But sign is not  continue   ",
                                             );
                                 return $data;
                            }else{
                                $data=array(
                                            "code"=>RedisManager::SIGNDAYSCANAWARD,
                                             "needsDays"=>1,
                                            "msg"=> "Today is  has  sign  But sign is not  continue   ",
                                             );
                                 return $data;
                            }
                      }
                }
            }
        }
    }

    static function decide_award($openid){ //Return an array 2004 no lottery 2002 lottery      
        $todayIsSign=RedisManager::getTodaySign($openid);
        $totalCountSign=RedisManager::countAllSignDay($openid);
        if ($todayIsSign == 0) {//I didn't sign in today.
             $data=array(
                     "code"=>RedisManager::NOTAWARD,
                     "msg"=>"I haven't checked in yet.",
                 );
            return $data;
        }
        if ($todayIsSign == 1 && $totalCountSign == 1) {//First Check-in Today + Total Check-in Number = 1
            $data=array(
                "code"=>RedisManager::CANAWARD,
                "msg"=>"First Sign-in",
            );
            return $data;
        }else{
            $YesterDay=date("Y-m-d",strtotime("-1 day"));
            $YesterDaySignData=RedisManager::getThisDaySign($openid,$YesterDay);
            if ($YesterDaySignData == 0) {  //Didn't sign in yesterday
                $data=array(
                     "code"=>RedisManager::NOTAWARD,
                     "msg"=>"Check in Successfully,But you didn't sign in yesterday.,Continue to sign in tomorrow for rewards",
                 );
                 return $data;
            }else{//Because today has been checked in, so the minimum number of consecutive checkins is 1 from today.
               $continueSignNum=RedisManager::countContinueSignDay($openid);
                if ($totalCountSign == 2 &&  $continueSignNum == 2 ) {//Total check-in and consecutive check-in are 2, indicating that yesterday was the first time to sign in.
                     $data=array(
                            "code"=>RedisManager::NOTAWARD,
                            "msg"=>"Check in Successfully,Continue to sign in tomorrow for rewards",
                        );
                         return $data;
                }else{//Yesterday's check-in wasn't the first time 
                    if ($totalCountSign == $continueSignNum && $totalCountSign > 0 ) {//The first check-in has been uninterrupted
                        if ($totalCountSign%2 == 0 ) {
                            //Even-numbered non-occurrence
                              $data=array(
                                    "code"=>RedisManager::NOTAWARD,
                                    "msg"=>"Check in Successfully,Continue to sign in tomorrow for rewards",
                                 );
                         return $data;
                        }else{
                             $data=array(
                                    "code"=>RedisManager::CANAWARD,
                                        "msg"=>"Check in Successfully,Draw today",
                               );
                              return $data;
                        }
                    }else{
                        if ($continueSignNum%2 == 0 ) {
                            //Even-numbered outgoing
                           $data=array(
                                    "code"=>RedisManager::CANAWARD,
                                        "msg"=>"Check in Successfully,Draw today",
                               );

                            return $data;
                        }else{
                             $data=array(
                                    "code"=>RedisManager::NOTAWARD,
                                    "msg"=>"Check in Successfully,Continue to sign in tomorrow for rewards",
                                 );
                              return $data;
                        }
                    }
                }        
            }
        }
    }

    private function __clone(){}

}

 

Posted by assessino on Wed, 31 Jul 2019 04:52:37 -0700