如何用workerman的timer做电商网站的自动收货

twins3520

那个Timer::add里面的延迟时间能不能设置发货后7天自动收货的,会不会延时时间太长?而且要很多个用户很多个物流订单会不会堵塞?或者变成线程太多程序挂起不能运行?能不能做个demo给我?该怎么优化和使用???

1392 4 2
4个回答

luohonen

这特么是延迟队列,跟Timer定时器有啥关系,最基础的延迟队列都不会吗?

  • 小W 2023-02-21

    这个方案是好一点,最好不要依赖redis的key过期事件

darcy

不用Redis吧,查询7天前的数据订单数据就可以了

Db::table('orders')->whereDate('CreateTime', date("Y-m-d",strtotime("-7 day")))->get();

这样就可以查询到7天前的数据列表了,然后再进行逻辑处理就行了

  • 小W 2023-02-21

    你这个是自然天

  • FlyLow 2023-02-21

    数据量和并发高起来 你的mysql怕是扛不住的哦

  • aveadtyx 2023-02-21

    个人觉得这是很好的方案,数据生成速度快而多的 可以考虑多起几个进行分组

  • aveadtyx 2023-02-21

    不过要limit 不能全部查出

  • darcy 2023-02-21

    如果是大数据的话,可以采用分块处理
    https://www.workerman.net/doc/webman/db/queries.html#%E5%88%86%E5%9D%97%E7%BB%93%E6%9E%9C

    Db::table('orders')->whereDate('CreateTime', date("Y-m-d",strtotime("-7 day")))->chunkById(100, function ($orders) {
    // Process the records...

    return false;

    });

  • liangnian 2023-02-21

    <?php
    namespace process;
    use Workerman\Timer;
    use app\model\Billing;
    class AutoSign
    {
    public function onWorkerStart()
    {
    $timer = config('iot.time');
    $Billing = new Billing;
    Timer::add($timer, function() use ($Billing){
    $time = time() - 3600 24 7;
    $billingData = $Billing->where('createtime', '<', $time)->where('status', '未签收')->select();
    if(count($billingData) > 0) {
    $billingData = $Billing->changeStatus($billingData);
    }
    });
    }
    }

  • nitron 2023-02-21

    订单总会有标记收货状态的字段吧,做个聚合索引,where条件内加上状态,量就少了(理论值)和速度也快了

nitron

不用精确到刚好七天整(7 24 60 * 60秒) ,可以晚个几十秒,几分钟,甚至几十分钟的话,不需要借助什么redis,计划任务就行,简单方便依赖少

  • 小W 2023-02-22

    每几时统计一次,批量更新就可以,简单容易维护

安稳

用redis-queue插件 那个延迟投递不就行了,发货以后投递数据
Redis::send($queue, $data, 延迟秒数);

  • 暂无评论
年代过于久远,无法发表回答
×
🔝