一、概述
在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件、秒杀资格获取等,我们将这些耗时或者高并发的操作放到队列中异步执行可以有效缓解系统压力、提高系统响应速度和负载能力。
二、配置文件
我们仍然从配置文件开始,首先我们需要在配置文件中配置默认队列驱动为Redis。lumen没有配置文件,可以从laravel项目中拷贝一份config目录过来。
队列配置文件是config/queue.php:
return [ 'default' => env('QUEUE_DRIVER', 'sync'), 'connections' => [ 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'expire' => 60, ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ], ], 'failed' => [ 'database' => 'mysql', 'table' => 'failed_jobs', ], ];
配置文件第一个配置项default用于指定默认的队列驱动,修改.env中的QUEUE_DRIVER即可。
connections配置项包含了Laravel支持的所有队列驱动,我们使用Redis驱动,所以需要配置redis项:connection对应config/database.php中redis的default配置;queue为默认队列名称;expire为队列任务过期时间(秒)。这里我们可以保持其默认配置不变。
failed配置项用于配置失败队列任务存放的数据库及数据表。这里我们需要按照自己的数据库配置对其做相应修改。
要使用 redis 队列驱动,需要在配置文件 config/database.php 中配置 Redis 数据库连接。
如果 Redis 队列连接使用 Redis Cluster(集群),队列名称必须包含 key hash tag,以确保给定队列对应的所有 Redis keys 都存放到同一个 hash slot:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => '{default}', 'retry_after' => 90, ],
注:对一般中小型应用推荐使用 Redis 作为队列驱动。
三、驱动预备知识
数据库
要使用 database 队列驱动,你需要数据表保存任务信息(比如失败任务)。要生成创建这些表的迁移,可以在项目目录下运行 Artisan 命令 queue:table,迁移被创建之后,可以使用 migrate 命令生成这些表:
php artisan queue:table php artisan queue:failed_jobs php artisan migrate
运行后生成failed_jobs、jobs、migrations三张表。