“队列”第一回——管中窥豹
概述
Redis 是 web 系统的好朋友:超高性能的缓存服务器;而我也非常幸运,在 2014 年夏天第一次需要用到队列的时候,Laravel 4.2 刚刚实现了对 Redis 作为队列系统数据存储后端的支持。
Laravel 采用 Redis 的 list 类型进行队列数据的存储,list 有点像 PHP 中的 Array,拥有许许多多的 API,不再是简单的栈、链表等基础数据结构。Laravel 采用 PHP 命令行(cli)来执行队列中的任务,他们之间的关系如下图所示:
使用方法
以下是 Laravel 中采用 Redis 作为数据存储容器的队列使用方法介绍。
1. 使用 artisan 创建 job 类
php artisan make:job JustTasteQueue
得到 `app/Jobs/JustTasteQueue.php` 文件:
2. 编写业务逻辑
... ... class JustTasteQueue extends Job implements ShouldQueue { use InteractsWithQueue, SerializesModels; $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 中的数据如下:
Laravel 创建了一个 key 为 queues:default 的 list,并且向其中插入了一条数据,是一段 JSON 字符串,里面详细描述了这个任务,不再赘述。
4. 出队列
生产环境中建议采用 `php artisan queue:work --daemon` 命令进行队列监听:每隔一秒,这个进程会检索一次 Redis,看是否有新的任务,有的话,回取出信息并完成任务。
关于其他的出队列监听命令及 Supervisor 的故事,且听下回分解。
标签: 队列
评论:
2018-01-04 16:30