Laravel中使用Redis作为队列系统的工作流程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Laravel中使用Redis作为队列系统的工作流程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1652字,纯文字阅读大概需要3分钟。
内容图文
![Laravel中使用Redis作为队列系统的工作流程](/upload/InfoBanner/zyjiaocheng/557/4054e70ead694308ba8d4882c34ba2d6.jpg)
利用Redis可以很方便的实现一个任务队列,但是在Laravel中,Redis的队列总会出现一个任务多次执行的问题。究其原因是它写死了reserved的时长,也就是如果1分钟后任务没有执行完成,那么这个任务就会被重新放回队列。下面是队列的简单使用和执行原理。 设置
利用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作为队列系统的工作流程全部内容,希望文章能够帮你解决Laravel中使用Redis作为队列系统的工作流程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。