setName('RefreshSsdb') ->addOption('type','t',Option::VALUE_OPTIONAL,'刷新Ssdb数据到Redis,a:自定义二维码UV,渠道新增付费用户,KL计数器,b:ID白名单,IP白名单,CR计数器,M-T统计金额') ->setDescription('转移SSDB数据到Redis'); } /** * @param Input $input * @param Output $output * @return int|null|void * @throws \Exception */ public function execute(Input $input, Output $output) { Request::instance()->module('admin'); $type = $input->getOption('type'); $limit = 10; switch ($type){ case 'a': $this->refresh_quv($input,$output); $this->refresh_kl($input,$output); $this->refresh_pay($input,$output); break; case 'b': $this->refresh_user($input,$output); $this->refresh_ip($input,$output); $this->refresh_cr($input,$output); $this->refresh_mt($input,$output,$limit); case 'quv': $this->refresh_quv($input,$output); break; case 'kl': $this->refresh_kl($input,$output); break; case 'pay': $this->refresh_pay($input,$output); break; case 'user': $this->refresh_user($input,$output); break; case 'ip': $this->refresh_ip($input,$output); break; case 'cr': $this->refresh_cr($input,$output); break; case 'mt': $this->refresh_mt($input,$output); break; default: $output->writeln("Type: {$type} 无法识别的类型"); break; } } private function refresh_mt(Input $input,Output $output){ $ssdb = Ssdb::instance(); $redis = Redis::instance(); $this->success($output,"刷新推广链接M-T信息---开始"); while($source = $ssdb->keys('M-T:','',5000)){ $list = array_filter($source,function($k_name) use($output,$ssdb,$redis) { if(strpos($k_name,'M-T:') === 0){ //刷新当天推广链接充值 if($current_ref_money = $ssdb->get($k_name)){ if(!$redis->exists($k_name)){ $redis->set($k_name,$current_ref_money); }else{ $redis->incrBy($k_name,$current_ref_money); } $redis->expire($k_name,86400); $this->success($output,"刷新推广链接M-T信息: {$k_name} Val:{$current_ref_money} success"); $ssdb->del($k_name); }else{ $this->success($output,"刷新推广链接M-T信息: {$k_name} Val:{$current_ref_money} skip"); } return true; } }); if(empty($list)){ $this->success($output,"刷新推广链接M-T信息---结束"); break; } unset($source); } } private function refresh_cr(Input $input,Output $output){ $ssdb = Ssdb::instance(); $redis = Redis::instance(); $this->success($output,"刷新推广链接CR信息---开始"); while($source = $ssdb->keys('CR:','',5000)){ $list = array_filter($source,function($k_name) use($output,$ssdb,$redis) { if(strpos($k_name,'CR:') === 0){ //刷新CR数据 if($cr = intval($ssdb->get($k_name))){ if(!$redis->exists("K{$k_name}")){ $redis->set("K{$k_name}",$cr); }else{ $redis->incrBy("K{$k_name}",$cr); } $ssdb->del($k_name); $this->success($output,"刷新推广链接CR信息: {$k_name} Val:{$cr} success"); }else{ $this->success($output,"刷新推广链接CR信息: {$k_name} Val:{$cr} skip"); } return true; } }); if(empty($list)){ break; } unset($source); } $this->success($output,"刷新推广链接CR信息---结束"); } private function refresh_ip(Input $input,Output $output){ $ssdb = Ssdb::instance(); $redis = Redis::instance(); $this->success($output,"刷新用户IP白名单---开始"); while($source = $ssdb->hlist('IG:','',5000)){ $list = array_filter($source,function($hash_name) use($output,$ssdb,$redis) { if(strpos($hash_name,'IG:') === 0){ $size = $ssdb->hsize($hash_name); $this->success($output,"刷新用户IP白名单: {$hash_name} Size:{$size}"); while($ip_list = $ssdb->hkeys($hash_name, '', '', 5000)){ array_walk($ip_list,function($ip) use($hash_name,$redis,$ssdb,$output){ $ssdb->hdel($hash_name,$ip); list($key_name,$key_ip) = explode(':',$hash_name); $redis->sadd("KIP:{$key_ip}",$ip); $this->success($output,"刷新用户IP白名单: {$hash_name} IP:{$ip} update success"); }); } $this->success($output,"刷新用户IP白名单: {$hash_name} Size:{$size} End"); return true; } }); if(empty($list)){ break; } unset($source); } $this->success($output,"刷新用户IP白名单---结束"); } private function refresh_user(Input $input,Output $output){ $ssdb = Ssdb::instance(); $redis = Redis::instance(); $this->success($output,"刷新用户ID白名单---开始"); while($source = $ssdb->hlist('IU:','',5000)){ $list = array_filter($source,function($hash_name) use($output,$ssdb,$redis) { if(strpos($hash_name,'IU:') === 0){ $size = $ssdb->hsize($hash_name); $this->success($output,"刷新用户ID白名单: {$hash_name} Size:{$size}"); while($user_id_list = $ssdb->hkeys($hash_name, '', '', 5000)){ array_walk($user_id_list,function($user_id) use($hash_name,$redis,$ssdb,$output){ model('User') ->setConnect($user_id) ->where('id',$user_id) ->update(['is_white'=>1]); $ssdb->hdel($hash_name,$user_id); $redis->del("UN:{$user_id}"); $this->success($output,"刷新用户ID白名单: {$hash_name} UserId:{$user_id} update success"); }); } $this->success($output,"刷新用户ID白名单: {$hash_name} Size:{$size} End"); return true; } }); if(empty($list)){ break; } unset($source); } $this->success($output,"刷新用户ID白名单---结束"); } private function refresh_quv(Input $input,Output $output){ try { $this->success($output,"刷新自定义二维码UV统计---开始"); $ssdb = Ssdb::instance(); $redis = Redis::instance(); Db::table('custom_qrcode')->chunk(1000, function ($result) use ($redis,$ssdb,$output) { foreach ($result as $val) { $hash_key = "quv:{$val['admin_id']}:{$val['index']}"; $redis_key = "QR_UV:{$val['admin_id']}:{$val['index']}"; while($list = $ssdb->hkeys($hash_key,'','',2000)){ foreach($list as $open_id){ $redis->pfAdd($redis_key,$open_id); $ssdb->hdel($hash_key,$open_id); $this->success($output,"刷新自定义二维码UV统计: id:{$val['id']} admin_id:{$val['admin_id']} index:{$val['index']} open_id:{$open_id}"); } } $this->success($output,"刷新自定义二维码UV统计: id:{$val['id']} admin_id:{$val['admin_id']} index:{$val['index']} refresh success"); } }); $this->success($output,"刷新自定义二维码UV统计---完成"); }catch (\Exception $e){ $this->error($output,'刷新自定义二维码UV统计---失败' . $e->getMessage()); } } private function refresh_kl(Input $input,Output $output){ try { $this->success($output,"刷新KL信息到Redis---开始"); $ssdb = Ssdb::instance(); $redis = Redis::instance(); Db::table('admin')->chunk(1000,function($result) use($redis,$ssdb,$output){ foreach($result as $channel){ //转移AV if($av = $ssdb->get("AV:{$channel['id']}")){ if(!$redis->exists("KAV:{$channel['id']}")){ $redis->set("KAV:{$channel['id']}",intval($av)); }else{ $redis->incrBy("KAV:{$channel['id']}",intval($av)); } } $ssdb->del("AV:{$channel['id']}"); //转移AN if($an = $ssdb->get("AN:{$channel['id']}")){ if(!$redis->exists("KAN:{$channel['id']}")){ $redis->set("KAN:{$channel['id']}",intval($an)); }else{ $redis->incrBy("KAN:{$channel['id']}",intval($an)); } } $ssdb->del("AN:{$channel['id']}"); //转移CV if($cv = $ssdb->get("CV:{$channel['id']}")){ if(!$redis->exists("KCV:{$channel['id']}")){ $redis->set("KCV:{$channel['id']}",intval($cv)); }else{ $redis->incrBy("KCV:{$channel['id']}",intval($cv)); } } $ssdb->del("CV:{$channel['id']}"); //转移CN if($cn = $ssdb->get("CN:{$channel['id']}")){ if(!$redis->exists("KCN:{$channel['id']}")){ $redis->set("KCN:{$channel['id']}",intval($cn)); }else{ $redis->incrBy("KCN:{$channel['id']}",intval($cn)); } } $ssdb->del("CN:{$channel['id']}"); //获取当前时间的前24小时 $before_time = $this->getBeforeTwentyFourTime(); foreach($before_time as $val){ $time = date('dH',$val); //转移DM $dm = $ssdb->get("DM:{$channel['id']}:{$time}"); if(!$redis->exists("KDM:{$channel['id']}:{$time}")){ $redis->set("KDM:{$channel['id']}:{$time}",intval($dm)); }else{ $redis->incrBy("KDM:{$channel['id']}:{$time}",intval($dm)); } $redis->expire("KDM:{$channel['id']}:{$time}",86400); $ssdb->del("DM:{$channel['id']}:{$time}"); //转移AM $am = $ssdb->get("AM:{$channel['id']}:{$time}"); if(!$redis->exists("KAM:{$channel['id']}:{$time}")){ $redis->set("KAM:{$channel['id']}:{$time}",intval($am)); }else{ $redis->incrBy("KAM:{$channel['id']}:{$time}",intval($am)); } $redis->expire("KAM:{$channel['id']}:{$time}",86400); $ssdb->del("AM:{$channel['id']}:{$time}"); $this->success($output,"刷新KL信息到Redis: admin_id:{$channel['id']} DM:{$channel['id']}:{$time} Val:{$dm} AM:{$channel['id']}:{$time} Val:{$am} success"); } $this->success($output,"刷新KL信息到Redis: admin_id:{$channel['id']} AV:{$av} AN:{$an} CV:{$cv} CN:{$cn} success"); } }); $this->success($output,"刷新KL信息到Redis---完成"); }catch (\Exception $e){ $this->error($output,'刷新KL信息到Redis---失败' . $e->getMessage()); } } private function refresh_pay(Input $input,Output $output){ $this->success($output,"刷新渠道付费用户到mysql---开始"); $ssdb = Ssdb::instance(); Db::table('admin')->chunk(1000,function($result) use($ssdb,$output){ foreach($result as $channel){ $hash_key = "U-C:".date("d").":".$channel['id']; $pay = $ssdb->hget($hash_key,'P'); if($pay){ $user_collect = model('UserCollect') ->where('admin_id',$channel['id']) ->where('createdate',date('Ymd')) ->where('type',1)->find(); if($user_collect){ model('UserCollect') ->where('admin_id',$channel['id']) ->where('createdate',date('Ymd')) ->where('type',1) ->update(['increase_recharge'=>intval($pay)]); $this->success($output,"刷新KL信息到Redis: update admin_id:{$channel['id']} Pay:{$pay} success"); }else{ $data = [ 'createdate' => date('Ymd'), 'type' => 1, 'admin_id' => $channel['id'], 'increase_recharge' => intval($pay) ]; model('UserCollect')->insert($data); $this->success($output,"刷新KL信息到Redis: insert admin_id:{$channel['id']} Pay:{$pay} success"); } } $ssdb->hdel($hash_key,'P'); } }); //统计管理员的 $admin_hash_key = "U-C:".date("d").":0"; $admin_pay = $ssdb->hget($admin_hash_key,'P'); if($admin_pay){ $admin_user_collect = model('UserCollect') ->where('admin_id',0) ->where('createdate',date('Ymd')) ->where('type',1)->find(); if($admin_user_collect){ model('UserCollect') ->where('admin_id',0) ->where('createdate',date('Ymd')) ->where('type',1) ->update(['increase_recharge'=>intval($admin_pay)]); $this->success($output,"刷新KL信息到Redis: update admin_id:0 Pay:{$admin_pay} success"); }else{ $data = [ 'createdate' => date('Ymd'), 'type' => 1, 'admin_id' => 0, 'increase_recharge' => intval($admin_pay) ]; model('UserCollect')->insert($data); $this->success($output,"刷新KL信息到Redis: insert admin_id:0 Pay:{$admin_pay} success"); } } $ssdb->hdel($admin_hash_key,'P'); } /** * 获取当前时间的前24小时,包含当前小时 * @return array */ public function getBeforeTwentyFourTime(){ $before_array = []; $current_time = time(); $first_time = strtotime('-1 day'); for ($time=$first_time; $time<=$current_time; $time+=3600){ array_push($before_array,$time); } return $before_array; } private function success(Output $output,$message){ $output->info($message); Log::info($message); } private function error(Output $output,$message){ $output->error($message); Log::error($message); } }