Laravel中用Redis来做任务队列---出现重载问题
来源:互联网 发布:手机流量开关软件 编辑:程序博客网 时间:2024/05/29 02:29
原文地址:http://yansu.org/2014/04/11/redis-queue-in-laravel.html
利用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 后续操作 }}
即先删除这个任务,再开始执行任务。
0 0
- Laravel中用Redis来做任务队列---出现重载问题
- 使用Redis做任务队列(Golang)
- Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
- 【redis】任务队列
- 深入浅出Redis任务队列
- redis做消息队列
- laravel通过supervisor管理beanstalkd任务队列
- 使用Redis实现任务队列
- redis(五)redis任务队列
- netty中用到redis做消息中间件
- 使用Redis 做队列服务器
- 用redis做消息队列
- Php +Redis 做消息队列
- Php +Redis 做消息队列
- Php +Redis 做消息队列
- 在数据库中用 UUID 来做ID
- java 中用来做拓扑图
- Cygwin中用NDK来编译程序出现"No such file or directory"问题
- 类与对象
- 【问题解决】MYSQL 服务无法启动,错误日志:InnoDB: .\ibdata1 must be writable
- 169. Majority Element
- Mac OS X 安装 Nginx
- jsp连接mysql数据库,实现含验证码的用户登录
- Laravel中用Redis来做任务队列---出现重载问题
- C++无法被继承的类实现以及单例模式的类的实现
- Python练习1-文档格式化成html
- yii1.1model属性动态添加
- 归并排序(Merge sort)
- Java 重载、重写、构造函数详解
- windows下用 caffe 训练MNIST数据
- mysql二进制日志
- jQuery