带有laravel 5.5的Predis,“ Aggregate / RedisCluster.php:337中的池中没有可用的连接”

时间:2018-12-07 16:59:16

标签: php laravel laravel-5 redis elastic-cache

我使用Laravel 5.5和Predis软件包在aws弹性缓存上设置了redis-cluster进行缓存,得到以下错误。

Predis\ClientException: No connections available in the pool in vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php:337 
  

追踪:   Predis \ ClientException:vendor / predis / predis / src / Connection / Aggregate / RedisCluster.php:337

中的池中没有可用的连接      

堆栈跟踪:

     

0 vendor / predis / predis / src / Connection / Aggregate / RedisCluster.php(411):   Predis \ Connection \ Aggregate \ RedisCluster-> guessNode(153)

     

1供应商/predis/predis/src/Connection/Aggregate/RedisCluster.php(388):   Predis \ Connection \ Aggregate \ RedisCluster-> getConnectionBySlot(153​​)

     

2 vendor / predis / predis / src / Connection / Aggregate / RedisCluster.php(550):   Predis \ Connection \ Aggregate \ RedisCluster-> getConnection(Object(Predis \ Command \ StringSetExpire))

     

3 vendor / predis / predis / src / Connection / Aggregate / RedisCluster.php(593):   Predis \ Connection \ Aggregate \ RedisCluster-> retryCommandOnFailure(Object(Predis \ Command \ StringSetExpire),   'executeCommand')

     

4 vendor / predis / predis / src / Client.php(331):Predis \ Connection \ Aggregate \ RedisCluster-> executeCommand(Object(Predis \ Command \ StringSetExpire))

     

5 vendor / predis / predis / src / Client.php(314):Predis \ Client-> executeCommand(Object(Predis \ Command \ StringSetExpire))

     

6供应商/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(96):   Predis \ Client-> __ call('setex',Array)

     

7供应商/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(108):   Illuminate \ Redis \ Connections \ Connection-> command('setex',Array)

     

8 vendor / laravel / framework / src / Illuminate / Cache / RedisStore.php(93):Illuminate \ Redis \ Connections \ Connection-> __ call('setex',Array)

     

9 vendor / laravel / framework / src / Illuminate / Cache / Repository.php(195):Illuminate \ Cache \ RedisStore-> put('5rr44TBjIPEgJSx ...',   'a:1:{s:6:“ _ flas ...',480)

     

10供应商/laravel/framework/src/Illuminate/Session/CacheBasedSessionHandler.php(66):   Illuminate \ Cache \ Repository-> put('5rr44TBjIPEgJSx ...',   'a:1:{s:6:“ _ flas ...',480)

     

11 vendor / laravel / framework / src / Illuminate / Session / Store.php(128):Illuminate \ Session \ CacheBasedSessionHandler-> write('5rr44TBjIPEgJSx ... ,,   'a:1:{s:6:“ _ flas ...')

     

12供应商/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(87):   照亮\ Session \ Store-> save()

     

13供应商/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(218):   Illuminate \ Session \ Middleware \ StartSession->终止(Object(Illuminate \ Http \ Request),   对象(Illuminate \ Http \ Response))

     

14供应商/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(189):   Illuminate \ Foundation \ Http \ Kernel-> terminateMiddleware(Object(Illuminate \ Http \ Request),   对象(Illuminate \ Http \ Response))

     

15 public / index.php(58):照亮\ Foundation \ Http \内核->终止(Object(Illuminate \ Http \ Request),   对象(Illuminate \ Http \ Response))

     

16 {main}

我使用的技术堆栈:

  • PHP7.0
  • Laravel5.5
  • OS(Debian GNU / Linux 9.6(拉伸)),版本9.6

我在config / database.php中尝试了以下配置:

redis=> [
'client'  => 'predis',
        'options' => [
            'cluster' => 'redis',
        ],
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_CLUSTER_HOST', 'localhost'),
                    'password' => env('REDIS_CLUSTER_PASSWORD', null),
                    'port' => env('REDIS_CLUSTER_PORT', 6379),
                    'database' => 0,
                ],
            ],
            'cache' => [
                [
                    'host' => env('REDIS_CLUSTER_HOST', 'localhost'),
                    'password' => env('REDIS_CLUSTER_PASSWORD', null),
                    'port' => env('REDIS_CLUSTER_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ]
]

我也尝试了timeout => 0 | 5 | 60,但是每次遇到相同的错误。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

这在我们的环境中起作用:

    'redis' => [
         'cluster' => true,

         'client' => 'predis',

         'options' => [
             'cluster' => 'redis',
             'parameters' => [
                 'scheme'   => env('REDIS_SCHEME', 'tcp'),
                 'host'     => env('REDIS_HOST', 'localhost'),
                 'password' => env('REDIS_PASSWORD', null),
                 'port'     => env('REDIS_PORT', 6379),
                 'database' => 0,
                 'timeout' => 15,
              ],
         ],

         'clusters' => [

             'default' => [
                 'scheme'   => env('REDIS_SCHEME', 'tcp'),
                 'host'     => env('REDIS_HOST', 'localhost'),
                 'password' => env('REDIS_PASSWORD', null),
                 'port'     => env('REDIS_PORT', 6379),
                 'database' => 0,
                 'timeout' => 15,
             ],
         ],
     ],

基于此处的信息:https://github.com/nrk/predis/issues/480-但还需要复制选项->参数组中的所有“默认”配置值

REDIS_HOST指向AWS Elasticache的Redis集群中的配置端点。

答案 1 :(得分:0)

我认为问题在于我正在尝试按服务切换amz云服务...只能通过vpc访问and和redis,在这种情况下不是这样。

我需要测试的是来自vpc内的ec2进行测试。