123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Bear
- * Date: 2019/1/7
- * Time: 下午3:49
- */
- namespace app\admin\command;
- use app\common\library\Redis;
- use app\common\library\Ssdb;
- use think\console\Command;
- use think\console\Input;
- use think\console\input\Option;
- use think\console\Output;
- use think\Db;
- use think\Log;
- use think\Request;
- class RefreshSsdb extends Command
- {
- public function Configure()
- {
- $this
- ->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);
- }
- }
|