Laravel本地和生产的单一Redis配置?

时间:2019-07-05 11:59:28

标签: php laravel redis

我正在尝试在database.php中设置一个Redis配置,以覆盖Laravel(5.8)中的本地和生产(Redis Cluster)环境。

此配置适用于我的本地(APP_ENV=local)Redis实例:

'redis' => [

    'client' => 'predis',

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

],

这适用于我的产品(APP_ENV=production)Redis集群:

'redis' => [

    'client' => 'predis',

    'options' => [
        'cluster' => 'redis',
    ],

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', 'localhost'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => 0,
            ],
        ],
    ],

],

我想设置一个配置,以便如果设置了APP_ENV=local,则使用我的本地Redis实例,而设置APP_ENV=production使用我的Redis集群。

我在REDIS_CLUSTER环境中尝试了以下操作(将APP_ENV=production设置为true):

'redis' => [

    'client' => 'predis',

    'cluster' => env('REDIS_CLUSTER', false),

    'options' => [
        'cluster' => 'redis',
    ],

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', 'localhost'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => 0,
            ],
        ],
    ],

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

],

但这失败,并显示MOVED错误。

我在laracasts.com/discuss上发布了一个问题,但这使我更加困惑,因为这似乎表明我更新了我的应用程序代码(而不是database.php中的Redis配置)以适应这两种环境。我觉得我在这里缺少有关配置如何工作的明显提示。

2 个答案:

答案 0 :(得分:0)

不确定这是否是实现此目标的最佳(或正确)方法,但是我最终在database.php文件的顶部放置了以下逻辑:

<?php

if (env('APP_ENV') == 'production') {
    $redis =  [
        'client' => 'predis',
        'options' => [
            'cluster' => 'redis',
        ],
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ],
    ];
}
else {
    $redis = [
        'client' => 'predis',
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    ];
}

return [

....

然后使用下面的redis键:

    'redis' => $redis

所以我的生产环境使用Redis集群配置,而我的本地环境使用本地配置。

如果有人知道这样做的更好方法,那么为什么

答案 1 :(得分:0)

以下设置对我有用,我们只需要在生产中设置 REDIS_HOST =clusterdomain,在开发中不需要设置

 $redis = [
        'client' => 'predis',
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ],
        'options' => [
            'cluster' => 'redis',
            'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
        ],
    ];

我们在 Laravel 5.6 在源代码中调试非常有帮助。 供应商/laravel/framework/src/Illuminate/Redis/RedisManager.php 和 供应商/predis/predis/src/Client.php