“队列”第一回——管中窥豹

2017-4-22   /   阅读数:1398   /   分类: Laravel 进阶

概述

Redis 是 web 系统的好朋友:超高性能的缓存服务器;而我也非常幸运,在 2014 年夏天第一次需要用到队列的时候,Laravel 4.2 刚刚实现了对 Redis 作为队列系统数据存储后端的支持。

Laravel 采用 Redis 的 list 类型进行队列数据的存储,list 有点像 PHP 中的 Array,拥有许许多多的 API,不再是简单的栈、链表等基础数据结构。Laravel 采用 PHP 命令行(cli)来执行队列中的任务,他们之间的关系如下图所示:

Image


使用方法

以下是 Laravel 中采用 Redis 作为数据存储容器的队列使用方法介绍。

1. 使用 artisan 创建 job 类

php artisan make:job JustTasteQueue

得到 `app/Jobs/JustTasteQueue.php` 文件:

Image


2. 编写业务逻辑

... ...
class JustTasteQueue extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    var $sleepTime;
    public function __construct($sleepTime)
    {
        $this->sleepTime = $sleepTime;
    }

    public function handle()
    {
        sleep($this->sleepTime);
    }
}

上面的代码中,我们定义了一个类成员变量 `$sleepTime`,然后在构造函数里面对其进行了赋值,之后在 `handle()` 函数里调用了这个值,完成了业务处理。

3. 入队列

在每个 Laravel 请求的任意生命周期时刻,调用如下代码即会立刻向 Redis 中写入一条任务数据:

dispatch(new \App\Jobs\JustTasteQueue(5));

Redis 中的数据如下:

Image

Laravel 创建了一个 key 为 queues:default 的 list,并且向其中插入了一条数据,是一段 JSON 字符串,里面详细描述了这个任务,不再赘述。

4. 出队列

生产环境中建议采用 `php artisan queue:work --daemon` 命令进行队列监听:每隔一秒,这个进程会检索一次 Redis,看是否有新的任务,有的话,回取出信息并完成任务。


关于其他的出队列监听命令及 Supervisor 的故事,且听下回分解。

WRITTEN BY

avatar
标签: 队列

评论:

闲云栖松
2017-11-06 23:26

老师你好,最近在做商城,订单过期自动取消也是要用到这一块吗?感觉毫无头绪,laravel菜鸟,诚心请教~!
库鲁其哇
2017-09-11 11:43
查看队列内容的那个图形工具是什么,求
JohnLui
2017-09-11 11:47
@库鲁其哇:redis MAC 客户端 rdm
库鲁其哇
2017-09-11 11:48
@JohnLui:感谢,呼呼
haha
2017-08-28 15:31
哈哈

发表评论:

© 2011-2017 岁寒  |  Powered by Emlog