在单个服务器上为多个 Laravel 应用程序使用 Redis 队列

Posted

技术标签:

【中文标题】在单个服务器上为多个 Laravel 应用程序使用 Redis 队列【英文标题】:Using Redis for Queues for Multiple Laravel Applications on a Single Server 【发布时间】:2015-09-25 04:21:58 【问题描述】:

我有一个生产 laravel 应用程序和在同一台服务器上运行的暂存应用程序。我正在运行 redis,我将其用作队列驱动程序。它们显然连接到不同的数据库。问题是从暂存应用程序推送到红色队列的作业是否会干扰生产数据库,反之亦然。

【问题讨论】:

如果您觉得下面我的回答最有帮助,您会考虑接受吗? 【参考方案1】:

我遇到了同样的问题,我花了几个小时才找到解决方案。

https://laravel.com/docs/5.6/queues#driver-prerequisites 说:

为了使用redis队列驱动,你应该配置一个Redis config/database.php 配置文件中的数据库连接。

然后https://laravel.com/docs/5.6/redis#predis 说:

除了默认的hostportdatabasepassword服务器 配置选项,Predis 支持额外的connection parameters,可以为每个 Redis 服务器定义。到 利用这些额外的配置选项,将它们添加到您的 Redis 服务器配置在config/database.php配置文件中。

阅读“连接参数”页面,我最终找到了https://github.com/nrk/predis/wiki/Client-Options,上面写着“前缀”是一个受支持的选项。

因此,您可以编辑您的 config/database.php 配置文件以具有:

'redis' => [
        'client' => 'predis',
        'cluster' => false,
        'options'=>[
            'prefix' => env('REDIS_PREFIX', 'YOUR_PREFIX_HERE')
        ],
        'default' => [
            'host'     => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port'     => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    ],

我不确定你是否需要重新启动 Redis 或 Supervisord。

【讨论】:

从 Laravel 5.8 开始(可能至少到 6.4),这是正确的答案。如果您遇到此问题,我会更进一步,将config/cache.php 中的前缀留空,并将database.redis.options.prefix 设为前缀字符串的唯一入口点。通过这样做,您确实失去了: 的精确性,但您可以自己添加: ('prefix' => 'PREFIX:')。如果你同时定义了cache.prefix 和数据库的options.prefix,你的key 会加倍,看起来像PREFIXPREFIX:【参考方案2】:

你可以设置 Laravel 用于 Redis 缓存的前缀。默认情况下这是laravel,所以所有的键都存储为laravel:keyname,Laravel 负责在保存/获取时添加/删除此前缀的逻辑。

您可以在config/cache.php 中设置前缀。您可以将主要的保留为laravel,并将暂存应用程序前缀设置为stage 或其他内容。这意味着多个 Laravel 应用可以使用同一个 Redis 实例。

【讨论】:

我知道你在 6 个多月前问过这个问题,但人们可能会在这里或其他地方用 Google 搜索自己。 是的,这就是我所做的。 这对于 Redis 作为缓存是可以的,但是 Redis 作为队列驱动呢? @AndrewMcLagan 是对的。更改 CACHE_PREFIX env 值(在此处使用:github.com/laravel/laravel/commit/…)无助于解决 2 个 Laravel 应用程序的冲突,这两个应用程序都设置为使用 Redis 作为队列驱动程序并指向同一服务器上的相同 Redis 安装。我自己还在寻找解决方案。 如果有人还在寻找解决方案,请查看@Ryan 的回答。它适用于我 - 使用 php artisan queue:listenphp artisan tinker 进行测试以调度测试作业。【参考方案3】:

截至Laravel 5.5.22,缓存前缀使用APP_NAME 环境变量。如果这足够了,您可以依赖它,或者您可以使用默认未设置的 CACHE_PREFIX 环境变量来配置前缀。

如果您使用 Laravel Horizo​​n 来管理队列,您可以简单地覆盖 HORIZON_PREFIX 环境变量,让 Horizo​​n 区分并排运行的应用程序。

【讨论】:

以上是关于在单个服务器上为多个 Laravel 应用程序使用 Redis 队列的主要内容,如果未能解决你的问题,请参考以下文章

在同一台服务器上为多个 repos 设置 git

使用单个laravel实例的多个项目

使用 apache 在单个 VPS 上托管多个 laravel 5.5 项目?

使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询

如何使用plotly js在y轴上为单个x轴值(可能是日期)绘制两个点

如何使用单个工匠命令在 Laravel 8 中创建多个模型?