那个Timer::add里面的延迟时间能不能设置发货后7天自动收货的,会不会延时时间太长?而且要很多个用户很多个物流订单会不会堵塞?或者变成线程太多程序挂起不能运行?能不能做个demo给我?该怎么优化和使用???
这特么是延迟队列,跟Timer定时器有啥关系,最基础的延迟队列都不会吗?
这个方案是好一点,最好不要依赖redis的key过期事件
不用Redis吧,查询7天前的数据订单数据就可以了
Db::table('orders')->whereDate('CreateTime', date("Y-m-d",strtotime("-7 day")))->get();
这样就可以查询到7天前的数据列表了,然后再进行逻辑处理就行了
你这个是自然天
数据量和并发高起来 你的mysql怕是扛不住的哦
个人觉得这是很好的方案,数据生成速度快而多的 可以考虑多起几个进行分组
不过要limit 不能全部查出
如果是大数据的话,可以采用分块处理 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;
});
<?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); } }); } }
订单总会有标记收货状态的字段吧,做个聚合索引,where条件内加上状态,量就少了(理论值)和速度也快了
不用精确到刚好七天整(7 24 60 * 60秒) ,可以晚个几十秒,几分钟,甚至几十分钟的话,不需要借助什么redis,计划任务就行,简单方便依赖少
每几时统计一次,批量更新就可以,简单容易维护
用redis-queue插件 那个延迟投递不就行了,发货以后投递数据 Redis::send($queue, $data, 延迟秒数);
这特么是延迟队列,跟Timer定时器有啥关系,最基础的延迟队列都不会吗?
这个方案是好一点,最好不要依赖redis的key过期事件
不用Redis吧,查询7天前的数据订单数据就可以了
Db::table('orders')->whereDate('CreateTime', date("Y-m-d",strtotime("-7 day")))->get();
这样就可以查询到7天前的数据列表了,然后再进行逻辑处理就行了
你这个是自然天
数据量和并发高起来 你的mysql怕是扛不住的哦
个人觉得这是很好的方案,数据生成速度快而多的 可以考虑多起几个进行分组
不过要limit 不能全部查出
如果是大数据的话,可以采用分块处理
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...
});
<?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);
}
});
}
}
订单总会有标记收货状态的字段吧,做个聚合索引,where条件内加上状态,量就少了(理论值)和速度也快了
不用精确到刚好七天整(7 24 60 * 60秒) ,可以晚个几十秒,几分钟,甚至几十分钟的话,不需要借助什么redis,计划任务就行,简单方便依赖少
每几时统计一次,批量更新就可以,简单容易维护
用redis-queue插件 那个延迟投递不就行了,发货以后投递数据
Redis::send($queue, $data, 延迟秒数);