使用AWS redis cluster 集群配置

最近公司需要将redis更换为aws的,但是只有集群,记录一下遇到的问题。
按照官方文档,在config/database.php添加了如下配置:

 'clusters' => [
        'default' => [
                [
                    'scheme'   => env('REDIS_SCHEME', 'tcp'),
                    'url'      => env('REDIS_URL'),
                    'host'     => env('REDIS_HOST', '127.0.0.1'),
                    'username' => env('REDIS_USERNAME'),
                    'password' => env('REDIS_PASSWORD'),
                    'port'     => env('REDIS_PORT', '6379'),
                    'database' => env('REDIS_DB', '0'),
                ]
            ],
]

会出现如下异常:

RedisClusterException

Couldn't map cluster keyspace using any provided seed

原因是权限配置不对,但是已经在default中添加了用户名与密码信息。
查看源码发现laravel在实例化redis cluster时需要的参数取值options中,这里面缺失了用户名与密码。

[null,["tls://you host:port"],0, 0,false,null] // vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:187

下面是完整配置

'redis' => [
        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options'  => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix'  => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
            // 登录信息
            'password' => [env('REDIS_USERNAME'), env('REDIS_PASSWORD')],
            'timeout' => 5,
            'context' => [
            // 使用tls或者tcp连接
                'scheme' => env('REDIS_SCHEME', 'tcp'), 
            ]
        ],
        //如果确认是集群,这边需要时null,否者不会实例化为集群。
        'default' => env('REDIS_IS_CLUSTER', false) ? null :
                    [
                        'scheme'   => env('REDIS_SCHEME', 'tcp'),
                        'url'      => env('REDIS_URL'),
                        'host'     => env('REDIS_HOST', '127.0.0.1'),
                        'username' => env('REDIS_USERNAME'),
                        'password' => env('REDIS_PASSWORD'),
                        'port'     => env('REDIS_PORT', '6379'),
                        'database' => env('REDIS_DB', '0'),
                    ],
        //如果确认是集群,这边需要时null,否者不会实例化为集群。
        'cache' => env('REDIS_IS_CLUSTER', false) ? null :[
            'scheme'   => env('REDIS_SCHEME', 'tcp'),
            'url'      => env('REDIS_URL'),
            'host'     => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port'     => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],
        'clusters' => [
            'default' => [
                [
                    'url'      => env('REDIS_URL'),
                    'host'     => env('REDIS_HOST', '127.0.0.1'),
                    'port'     => env('REDIS_PORT', '6379'),
                    'database' => env('REDIS_DB', '0'),
                ]
            ],

            'cache' => [
                [
                    'url'      => env('REDIS_URL'),
                    'host'     => env('REDIS_HOST', '127.0.0.1'),
                    'port'     => env('REDIS_PORT', '6379'),
                    'database' => env('REDIS_CACHE_DB', '1'),
                ]
            ],
        ],
    ],
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!