Laravel中用Redis来做任务队列---出现重载问题
2017-05-04 01:40
387 查看
原文地址:http://yansu.org/2014/04/11/redis-queue-in-laravel.html
利用Redis可以很方便的实现一个任务队列,但是在Laravel中,Redis的队列总会出现一个任务多次执行的问题。究其原因是它写死了reserved的时长,也就是如果1分钟后任务没有执行完成,那么这个任务就会被重新放回队列。下面是队列的简单使用和执行原理。
设置队列使用Redis非常容易,在
即可。
使用时不需要多配置,只要写好Queue类和其fire方法,在需要的位置出队即可。具体方法可以看这里。
Laravel利用artisan命令来执行出队操作,然后进行任务的执行。方法调用如下:
artisan queue:work
WorkerCommand:fire()
Worker:pop()
Worker:getNextJob()
RedisQueue:pop()
Worker:process()
我遇到的问题就在这里,在
这里将当前执行的任务放到另外一个reserved队列中,超时时间是60s。也就是说,如果60s后这个任务没有被删除掉,则任务会重新被放入队列中来。因此,在实际的使用过程中,任务很可能被多次执行。解决的办法是
即先删除这个任务,再开始执行任务。
利用Redis可以很方便的实现一个任务队列,但是在Laravel中,Redis的队列总会出现一个任务多次执行的问题。究其原因是它写死了reserved的时长,也就是如果1分钟后任务没有执行完成,那么这个任务就会被重新放回队列。下面是队列的简单使用和执行原理。
设置
设置队列使用Redis非常容易,在app/config/queue.php中配置
... 'default' => 'redis', ... 'connections' => array( ... 'redis' => array( 'driver' => 'redis', 'queue' => 'waa', ), ),
即可。
使用
使用时不需要多配置,只要写好Queue类和其fire方法,在需要的位置出队即可。具体方法可以看这里。class SendEmail { public function fire($job, $data) { // $job->delete(); } } Queue::push('SendEmail@send', array('message' => $message));
流程
Laravel利用artisan命令来执行出队操作,然后进行任务的执行。方法调用如下:artisan queue:work
WorkerCommand:fire()
Worker:pop()
Worker:getNextJob()
RedisQueue:pop()
Worker:process()
我遇到的问题就在这里,在
RedisQueue:pop()方法中,有这样一句:
$this->redis->zadd($queue.':reserved', $this->getTime() + 60, $job);
这里将当前执行的任务放到另外一个reserved队列中,超时时间是60s。也就是说,如果60s后这个任务没有被删除掉,则任务会重新被放入队列中来。因此,在实际的使用过程中,任务很可能被多次执行。解决的办法是
class SendEmail { public function fire($job, $data) { $job->delete(); // job 后续操作 } }
即先删除这个任务,再开始执行任务。
相关文章推荐
- 关于 Laravel Redis 多个进程同时取队列问题详解
- 关于 Laravel Redis 多个进程同时取队列问题详解
- 解决大量TCPIP连接后出现“因为系统缺乏足够缓冲区空间或者因为队列已满无法执行套接字上操作”的问题
- Webservice中如何实现方法重载--(方法名同名时出现的问题)
- Linux下Redis+crontab实现任务队列
- 创建redis集群时出现no such fileto load -- rubygems问题的解决
- 创建redis集群时出现no such fileto load -- rubygems问题的解决
- 求助:报告队列中的错误(昨天电脑突然出现问题)期待帮助>>
- Redis研究(十五)—任务队列
- Windows XP系统下添加任务计划常出现问题解决办法
- celery配合rabbitmq任务队列实现任务的异步调度执行[celery redis] 推荐
- 多次调用异步任务(AsyncTask)时出现的问题
- Project任务与 Outlook 同步时,出现登录失败的问题
- 定时任务执行git clone出现permission denied(publickey)问题的解决
- 解决大量TCPIP连接后出现“因为系统缺乏足够缓冲区空间或者因为队列已满无法执行套接字上操作”的问题
- 2013-12-20vs运行出现“此任务要求程序具有提升的权限”问题
- 进入'我的电脑'窗口后,左边显示的‘系统任务,其它位置,详细信息’菜单条到删除和出现的问题解决
- 今日任务-平台开发出现问题
- 【原创】 在django中使用celery 任务队列,redis做后端
- 放弃redis使用mongodb做任务队列支持增删改管理 推荐