在拉拉维尔进行本地和生产的单一 Redis 配置?



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

此配置适用于我的本地(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 集群。

我在APP_ENV=production环境中尝试了以下操作(REDIS_CLUSTER设置为 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,
],
],

但这失败并显示 MOVING 错误。

我在 laracasts.com/discuss 上发布了一个问题,但这让我更加困惑,因为它似乎建议我更新我的应用程序代码(而不是我在database.php中的 Redis 配置)以适应这两种环境。 我觉得我在配置应该如何工作方面错过了一些明显的东西。

不确定这是实现这一目标的最佳(或正确)方法,但我最终将以下逻辑放在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 集群配置,我的本地环境使用本地配置。

如果有人知道更好的方法来做到这一点,为什么上述

下面的设置对我有用,我们只需要在生产中设置 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_',
],
];

我们在拉拉维尔 5.6 在源代码中进行调试非常有帮助。 vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php 和 vendor/predis/predis/src/Client.php

最新更新