laravel5.1redis队列重复执行问题
2016-05-21 20:36
603 查看
按照官方邮件发送配置完后,将任务添加到队列中,
$job = (new SendReminder($withdrawal))->onQueue('emails')->delay(10);
$this->dispatch($job);
然后服务端启动队列监听,
php artisan queue:listen --queue=emails
却发现任务一直执行,也就是一直会收到邮件。
按理说,生产者将任务加入队列,消费者从队列中取任务消费,应该是先进先出,只执行一次才对呀,可是为什么会一直执行?
安装上redisadmin后查看,发现添加的任务一直保留在队列中,没有被取走(删除)。并且这条任务的状态变为了reserved(保留的)。
然后在网上发现了这篇文章(http://yansu.org/2014/04/11/redis-queue-in-laravel.html),它讲了laravel使用redis作为队列系统的执行流程。
其中讲了什么情况下任务的状态会变为reserved。
像我这种发送通知的任务,正好可以用到。只发送一次(有可能失败,准确性要求不是很高),在handle方法开始加上
$this->job->delete();后,任务就只会最多执行一次了。
最后总结一下怎样才能尽快的发现问题和解决问题:
第一,要从不同的角度(或者眼光)看待同一个问题,就像盲人摸象一样,你可能看到的只是一条腿,只有你接触了耳朵、鼻子...,才能认识真正的问题是什么;这里面是指不要在同一个方向上面纠结,有时候换个角度验证可以更早地发现真正的问题所在;
第二,工具的使用,专业的工具相比(蹩脚的工具),可能会使你发现问题和解决问题的能力提高10倍;在这个问题里面是指redisadmin和redis命令行;
$job = (new SendReminder($withdrawal))->onQueue('emails')->delay(10);
$this->dispatch($job);
然后服务端启动队列监听,
php artisan queue:listen --queue=emails
却发现任务一直执行,也就是一直会收到邮件。
按理说,生产者将任务加入队列,消费者从队列中取任务消费,应该是先进先出,只执行一次才对呀,可是为什么会一直执行?
安装上redisadmin后查看,发现添加的任务一直保留在队列中,没有被取走(删除)。并且这条任务的状态变为了reserved(保留的)。
然后在网上发现了这篇文章(http://yansu.org/2014/04/11/redis-queue-in-laravel.html),它讲了laravel使用redis作为队列系统的执行流程。
其中讲了什么情况下任务的状态会变为reserved。
像我这种发送通知的任务,正好可以用到。只发送一次(有可能失败,准确性要求不是很高),在handle方法开始加上
$this->job->delete();后,任务就只会最多执行一次了。
最后总结一下怎样才能尽快的发现问题和解决问题:
第一,要从不同的角度(或者眼光)看待同一个问题,就像盲人摸象一样,你可能看到的只是一条腿,只有你接触了耳朵、鼻子...,才能认识真正的问题是什么;这里面是指不要在同一个方向上面纠结,有时候换个角度验证可以更早地发现真正的问题所在;
第二,工具的使用,专业的工具相比(蹩脚的工具),可能会使你发现问题和解决问题的能力提高10倍;在这个问题里面是指redisadmin和redis命令行;
相关文章推荐
- Redis集群使用总结(二)
- redis缓存技术
- linux redis日志文件路径的设置
- redis ,hash
- Linux下redis安装
- Redis应用场景
- 【Linux】redis集群
- Redis简介,安装和配置,停止,卸载(图解方式)
- linux安装/卸载 redis
- redis之跳跃表
- Redis 数据持久化
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
- redis实战:使用redis实现自动补全
- redis实战之使用redis实现排行榜
- 教你如何使用Redis:[7]redis常用命令
- java对redis的基本操作
- 给大家推荐对Redis分析讲解比较详细的大牛
- Redis的基本操作二
- Redis应用案例 查找某个值的范围
- Redis 基本操作一