找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 245|回复: 2

[基础] 分享一下自已PHP操作redis当计划任务空跑的坑

  [复制链接]
发表于 2023-2-23 09:48 | 显示全部楼层 |阅读模式

唉,自个挖的坑,自个填。

 

先看程序1:

$redis_key_bid      = 'com.mkt.adexchange.bid';
$redis_key_list      = 'com.mkt.adexchange.listid';

$redis          = $this->redis();
$arr_list         = $redis->lRange($redis_key_list, 0, 99);//一次取100个
foreach($arr_list as $v){
    $a    = $redis->hGet($redis_key_bid, $v);
    if(empty($a)) continue;
    $data = json_decode($a, true);
    if(empty($data)) continue;

    $b    = json_encode($data['imp_content']);
    $data['imp_content'] = $b;

    $b    = json_encode($data['user_segment_content']);
    $data['user_segment_content'] = $b;

    if(empty($data['app_paid'])) $data['app_paid'] = -1;
    if(empty($data['device_connecttype'])) $data['device_connecttype'] = '';
    MMulti('ad_log', 'js_', 'DB_LOG')->add($data);

    $redis->hDel($redis_key_bid, $v);

    $redis->lPop($redis_key_list);
}

聪明的你有看到上面可能导致的问题吗?

 

要是还没有看出来,就继续看!!!!!!

要是还没有看出来,就继续看!!!!!!

要是还没有看出来,就继续看!!!!!!

要是还没有看出来,就继续看!!!!!!

 


程序2:

 

$curpage            = $_redis->get($this->repair_repair_page);//获取分页值正常
$pagesize            = 50;//每次捞50个订单数据
$curpage            = empty($curpage) ? 1 : $curpage;
$offset             = ($curpage - 1) * $pagesize;

$time_begin          = strtotime(date('2016-07-23'));
$time_end           = strtotime(date('2016-12-30'));
$where['po_add_time'] = array(array( 'ELT' , $time_end),array( 'EGT' , $time_begin));

if(!empty($order_no)){
   unset($where['po_add_time']);
   $where['po_order_no'] = $order_no;
}
$m_order            = M('order','','');
$joinAdd            = '字段,这里没有问题 ';
$fields             = '字段,这里没有问题';
if(empty($order_no)){
   $ret_order        = $m_order->field($fields)->alias('a')->join($joinAdd)->where($where)->limit("{$offset},{$pagesize}")->select();
}else{
   $ret_order        = $m_order->field($fields)->alias('a')->join($joinAdd)->where($where)->select();
}

if(empty($ret_order)){
   $this->Json('ok', 200, 'pintuan_error:没有订单信息,退出!' . json_encode($ret_order));
}
$num = 0;

foreach($ret_order as $k => $v){
   //这里是业务逻辑,没有问题
   $num += 1;
}
$curpage++;

$_redis->set($this->repair_repair_page, $curpage, $this->expire30);

$this->viaJson('ok', 200, '修复异常订单已操作退款的 '.$num.' 个。');

 

你要是还没有看出来,就到群里问问群主吧。

 楼主| 发表于 2023-2-23 09:55 | 显示全部楼层
程序2提示:
当没有数据退出时,需要将$curpage重置为0或者1,然后写入redis,以供下次使用。否则,假如已经是最后一页,已经没有数据了。处理完了。不重置,下一个七天的数据就会从$curpage开始取数据,导致下一个七天无法从1开始取数据。
 楼主| 发表于 2023-2-23 10:09 | 显示全部楼层
程序1 bug提示:

从list中取出一个id值,然后到hash中取出id值对应的json数据,如果对应的数据为空,则继续循环,如果对应的数据不为空,则进入数据库,然后删除此id对应的hash值list对应的pop。

于是就出现了,如果id对应的值为空的数据超过100个,那这个程序就一直空循环。

修正:
从hash中取出的数据如果为空,就应该rpush此id,然后lpop此id值。说白了,重新到队尾排队去。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-5-18 15:41 , Processed in 0.026320 second(s), 14 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表