【发布时间】:2015-09-25 04:21:58
【问题描述】:
我有一个生产 laravel 应用程序和在同一台服务器上运行的暂存应用程序。我正在运行 redis,我将其用作队列驱动程序。它们显然连接到不同的数据库。问题是从暂存应用程序推送到红色队列的作业是否会干扰生产数据库,反之亦然。
【问题讨论】:
-
如果您觉得下面我的回答最有帮助,您会考虑接受吗?
我有一个生产 laravel 应用程序和在同一台服务器上运行的暂存应用程序。我正在运行 redis,我将其用作队列驱动程序。它们显然连接到不同的数据库。问题是从暂存应用程序推送到红色队列的作业是否会干扰生产数据库,反之亦然。
【问题讨论】:
我遇到了同样的问题,我花了几个小时才找到解决方案。
https://laravel.com/docs/5.6/queues#driver-prerequisites 说:
为了使用
redis队列驱动,你应该配置一个Redisconfig/database.php配置文件中的数据库连接。
然后https://laravel.com/docs/5.6/redis#predis 说:
除了默认的
host、port、database和password服务器 配置选项,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。
【讨论】:
config/cache.php 中的前缀留空,并将database.redis.options.prefix 设为前缀字符串的唯一入口点。通过这样做,您确实失去了: 的精确性,但您可以自己添加: ('prefix' => 'PREFIX:')。如果你同时定义了cache.prefix 和数据库的options.prefix,你的key 会加倍,看起来像PREFIXPREFIX:。
你可以设置 Laravel 用于 Redis 缓存的前缀。默认情况下这是laravel,所以所有的键都存储为laravel:keyname,Laravel 负责在保存/获取时添加/删除此前缀的逻辑。
您可以在config/cache.php 中设置前缀。您可以将主要的保留为laravel,并将暂存应用程序前缀设置为stage 或其他内容。这意味着多个 Laravel 应用可以使用同一个 Redis 实例。
【讨论】:
CACHE_PREFIX env 值(在此处使用:github.com/laravel/laravel/commit/…)无助于解决 2 个 Laravel 应用程序的冲突,这两个应用程序都设置为使用 Redis 作为队列驱动程序并指向同一服务器上的相同 Redis 安装。我自己还在寻找解决方案。
php artisan queue:listen 和 php artisan tinker 进行测试以调度测试作业。
截至Laravel 5.5.22,缓存前缀使用APP_NAME 环境变量。如果这足够了,您可以依赖它,或者您可以使用默认未设置的 CACHE_PREFIX 环境变量来配置前缀。
如果您使用 Laravel Horizon 来管理队列,您可以简单地覆盖 HORIZON_PREFIX 环境变量,让 Horizon 区分并排运行的应用程序。
【讨论】: