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(){} }