我正在尝试将Laravel(5.4)与Redis的群集版本一起使用。我按照this post的说明进行操作,如下所示:
/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer set of commands than a typical key-value systems
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/
'redis' => [
'client' => 'predis',
'cluster' => 'true',
'default' => [
'host' => env('REDIS_HOST_1', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
],
'clusters' => [
'default' => [
'host' => env('REDIS_HOST_1', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
],
'jobs' => [
'host' => env('REDIS_HOST_2', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
],
'content' => [
'host' => env('REDIS_HOST_3', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
]
],
'options' => [
'cluster' => 'redis'
],
]
但我仍然会收到此错误
[2019-06-07 15:53:37] local.ERROR: Predis\Response\ServerException: MOVED 5873 127.0.0.1:7001 in /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:370 Stack trace:
0 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(335): Predis\Client->onErrorResponse(Object(Predis\Command\StringGet), Object(Predis\Response\Error))
1 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(314): Predis\Client->executeCommand(Object(Predis\Command\StringGet))
2 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(72): Predis\Client->__call('get', Array)
3 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(84): Illuminate\Redis\Connections\Connection->command('get', Array)
4 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php(54): Illuminate\Redis\Connections\Connection->__call('get', Array)
5 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(84): Illuminate\Cache\RedisStore->get('cbwvtr3cxYIFP4H...')
6 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(68): Illuminate\Cache\Repository->get('cbwvtr3cxYIFP4H...')
7 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php(305): Illuminate\Cache\Repository->has('cbwvtr3cxYIFP4H...')
8 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php(57): Illuminate\Cache\CacheManager->__call('has', Array)
9 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Blacklist.php(74): Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter->has('cbwvtr3cxYIFP4H...')
10 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTManager.php(83): Tymon\JWTAuth\Blacklist->has(Object(Tymon\JWTAuth\Payload))
11 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTAuth.php(190): Tymon\JWTAuth\JWTManager->decode(Object(Tymon\JWTAuth\Token))
12 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTAuth.php(124): Tymon\JWTAuth\JWTAuth->getPayload('eyJ0eXAiOiJKV1Q...')
13 /Users/Shared/dev/php/toters-api/app/Http/Middleware/TokenAuthentication.php(25): Tymon\JWTAuth\JWTAuth->authenticate('eyJ0eXAiOiJKV1Q...')
14 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): App\Http\Middleware\TokenAuthentication->handle(Object(Illuminate\Http\Request), Object(Closure))
15 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
16 /Users/Shared/dev/php/toters-api/app/Http/Middleware/WeakEtagMiddleware.php(22): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
17 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): App\Http\Middleware\WeakEtagMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure))
请注意,我没有对应用程序数据进行任何更改,因此我的Redis代码仍然如下所示:
use Illuminate\Support\Facades\Redis;
..
Redis::set('key', 'val');
此外,如果我从上述配置中删除了默认设置,则它看起来像这样:
'redis' => [
'client' => 'predis',
'cluster' => 'true',
'clusters' => [
'default' => [
'host' => env('REDIS_HOST_1', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
],
'jobs' => [
'host' => env('REDIS_HOST_2', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
],
'content' => [
'host' => env('REDIS_HOST_3', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => 6379,
'database' => 0,
]
],
'options' => [
'cluster' => 'redis'
],
]
我收到此错误
[2019-06-07 16:00:02] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Predis\Connection\Parameters::__construct() must be of the type array, integer given, called in /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php on line 164 in /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34 Stack trace:
0 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php(164): Predis\Connection\Parameters->__construct(6379)
1 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php(84): Predis\Connection\Factory->createParameters(6379)
2 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php(118): Predis\Connection\Factory->create(6379)
3 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(135): Predis\Connection\Factory->aggregate(Object(Predis\Connection\Aggregate\RedisCluster), Array)
4 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(56): Predis\Client->createConnection(Array)
5 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PredisConnector.php(41): Predis\Client->__construct(Array, Array)
6 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(102): Illuminate\Redis\Connectors\PredisConnector->connectToCluster(Array, Array, Array)
7 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(83): Illuminate\Redis\RedisManager->resolveCluster('default')
8 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(61): Illuminate\Redis\RedisManager->resolve('default')
9 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php(211): Illuminate\Redis\RedisManager->connection('default')
10 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php(54): Illuminate\Cache\RedisStore->connection()
11 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(84): Illuminate\Cache\RedisStore->get('cbwvtr3cxYIFP4H...')
12 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(68): Illuminate\Cache\Repository->get('cbwvtr3cxYIFP4H...')
13 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php(305): Illuminate\Cache\Repository->has('cbwvtr3cxYIFP4H...')
14 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php(57): Illuminate\Cache\CacheManager->__call('has', Array)
15 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Blacklist.php(74): Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter->has('cbwvtr3cxYIFP4H...')
16 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTManager.php(83): Tymon\JWTAuth\Blacklist->has(Object(Tymon\JWTAuth\Payload))
17 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTAuth.php(190): Tymon\JWTAuth\JWTManager->decode(Object(Tymon\JWTAuth\Token))
因此,从错误消息看来,Predis只是简单地忽略了我的集群配置并直接从默认读取,而default不知道如何处理我的集群Redis数据存储。想法?
答案 0 :(得分:3)
在搜索和调试后,这是使其起作用的原因:
'redis' => [
'client' => 'predis',
'cluster' => true,
'options' => [
'cluster' => 'redis',
'parameters' => [
'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_DEFAULT_PORT', 6379),
'database' => 0,
],
],
'clusters' => [
'default' => [
'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_DEFAULT_PORT', 6379),
'database' => 0,
],
'jobs' => [
'host' => env('REDIS_JOBS_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_JOBS_PORT', 6379),
'database' => 0,
],
'content' => [
'host' => env('REDIS_CONTENT_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_CONTENT_PORT', 6379),
'database' => 0,
],
'options' => [
'cluster' => 'redis'
],
]
]
注意:在上述问题中,我的配置中一个明显的错误是我将主机和端口组合在一起,并在此处进行了修复。这是我的.env文件的样子:
REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1
REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002
注意:我按照以下说明创建了集群:https://redis.io/topics/cluster-tutorial#creating-the-cluster
由于以下事实: 1.缺少有关laravel / predis的文档 2.关于堆栈溢出的大多数答案都是这样的:在谷歌搜索和搜索之后。这对我来说是有效的而对发生的事情没有太多解释
我认为我可以通过显示如何找到上述答案的方法来帮上忙。
要解决此错误
local.ERROR:Symfony \ Component \ Debug \ Exception \ FatalThrowableError: 类型错误:参数1传递给 Predis \ Connection \ Parameters :: __ construct()必须为数组类型, 给定的整数,称为 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php 在第164行 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34 堆栈跟踪:
我意识到config / database.php格式完全错误。整个谷歌搜索都没有给我任何清晰的画面,因此我决定在代码中使用xdebug和dive。注意:我在一个文档中打印了错误堆栈跟踪信息(如上问题所示),我用它作为鸟瞰图来指导我完成调试步骤(例如,在每次打印输出时都跳入/移入/移出等)在单独的文档中进行比较,并将其与我的config / database.php进行比较(作为健全性检查/调试指南针)。
在挖掘并打印后,我发现了这一点:
[ *Locals ] [ Superglobals ] [ User defined constants ]
- Locals at /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:55
▾ $options = (array [1])
\
⬦ $options["cluster"] = (string [5]) `redis`
/
▾ $parameters = (array [4])
\
⬦ $parameters[0] = (string [14]) `127.0.0.1:7000`
|
⬦ $parameters[1] = (null)
|
⬦ $parameters[2] = (int) 6379
|
⬦ $parameters[3] = (int) 0
/
▾ $this = (Predis\Client [3])
\
⬦ $this->connection = (null)
|
⬦ $this->options = (null)
|
⬦ $this->profile = (null)
/
我将此与.env文件的内容进行了比较:
REDIS_DEFAULT_HOST=127.0.0.1:7000
REDIS_JOBS_HOST=127.0.0.1:7001
REDIS_CONTENT_HOST=127.0.0.1:7002
我意识到格式是错误的,我不应该将主机AND端口放在相同的env变量中。所以我改成这样:
REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1
REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002
这解决了我的第一个问题。
解决上述问题后,我明白了
CLUSTERDOWN哈希槽未提供
这很简单,只需搜索错误消息即可(因为错误消息显然是本机redis错误消息,而不是像predis错误消息那样的一些隐秘的库包装器)..我发现{{ 3}}。
其余的很容易。