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

Posted

技术标签:

【中文标题】Predis 与 laravel 5.5 “Aggregate/RedisCluster.php:337 中的池中没有可用连接”【英文标题】:Predis with laravel 5.5 "No connections available in the pool in Aggregate/RedisCluster.php:337 " 【发布时间】:2019-05-09 11:27:01 【问题描述】:

我在 Amazon ElastiCache 上设置了 redis-cluster 用于缓存,使用 Laravel 5.5 和 Predis 包,我收到以下错误。

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 供应商/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 供应商/predis/predis/src/Connection/Aggregate/RedisCluster.php(550): Predis\Connection\Aggregate\RedisCluster->getConnection(Object(Predis\Command\StringSetExpire))

3 供应商/predis/predis/src/Connection/Aggregate/RedisCluster.php(593): Predis\Connection\Aggregate\RedisCluster->retryCommandOnFailure(Object(Predis\Command\StringSetExpire), '执行命令')

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): Illuminate\Session\Store->save()

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

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

15 public/index.php(58): Illuminate\Foundation\Http\Kernel->terminate(Object(Illuminate\Http\Request), 对象(照亮\Http\响应))

16 主要

我使用的技术栈:

PHP7.0 Laravel5.5 操作系统(Debian GNU/Linux 9.6 (stretch)),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,但每次都遇到同样的错误。

任何帮助将不胜感激!

【问题讨论】:

【参考方案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 集群中的配置端点。

【讨论】:

在我自己的情况下,添加方案工作 'scheme' => env('REDIS_SCHEME', 'tcp'),【参考方案2】:

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

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

【讨论】:

你的帖子中有什么可以回答这个问题的吗?你讨论你的问题。相反,您应该尝试解决本页顶部描述的问题。

以上是关于Predis 与 laravel 5.5 “Aggregate/RedisCluster.php:337 中的池中没有可用连接”的主要内容,如果未能解决你的问题,请参考以下文章

我在 Laravel 5.2 中收到错误“找不到类 'Predis\Client'”

laravel5.4安装predis

Laravel 安装predis 扩展

使用 Predis 使用 Laravel-5.4.32 配置 AWS Elasticache redis Cluster-3.2.4

Predis \ Connection \ ConnectionException

lumen 下安装predis及使用