You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中Redis读写分离实现:多连接主从读写是否可行?

Laravel中Redis集群读写分离的实现方案

当然可以实现!Laravel原生就支持Redis的读写分离配置,逻辑和你熟悉的MySQL读写分离配置非常相似,下面我一步步给你说明具体操作:

1. 修改Redis配置文件

打开项目根目录下的config/database.php,找到redis配置段,按照以下结构修改:

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

    // 主节点:负责所有写入操作
    'default' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '192.168.1.2'), // 替换为你的Redis主节点IP
        'username' => env('REDIS_USERNAME'),
        'password' => env('REDIS_PASSWORD'),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_DB', '0'),
    ],

    // 从节点:负责所有读取操作
    'read' => [
        'url' => env('REDIS_READ_URL'),
        'host' => env('REDIS_READ_HOST', '192.168.1.1'), // 替换为你的Redis从节点IP
        'username' => env('REDIS_READ_USERNAME'),
        'password' => env('REDIS_READ_PASSWORD'),
        'port' => env('REDIS_READ_PORT', '6379'),
        'database' => env('REDIS_READ_DB', '0'),
    ],
],

我把从节点的连接名改成了read,这样更直观,你可以根据自己的集群情况调整IP、密码这些参数。

2. 实现自动读写分离(推荐)

如果你想让Laravel自动帮你区分读写操作对应的节点,可以在配置里添加集群策略,修改后的redis配置如下:

'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),
    'options' => [
        'cluster' => 'redis',
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
    ],

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', '192.168.1.2'),
                'password' => env('REDIS_PASSWORD'),
                'port' => env('REDIS_PORT', '6379'),
                'database' => env('REDIS_DB', '0'),
                'read_write' => 'write', // 标记为写入节点
            ],
        ],
        'read' => [
            [
                'host' => env('REDIS_READ_HOST', '192.168.1.1'),
                'password' => env('REDIS_READ_PASSWORD'),
                'port' => env('REDIS_READ_PORT', '6379'),
                'database' => env('REDIS_READ_DB', '0'),
                'read_write' => 'read', // 标记为读取节点
            ],
        ],
    ],
],

配置完成后,Laravel会自动将set、hset这类写入操作路由到主节点,get、hget这类读取操作路由到从节点。

3. 手动指定连接(灵活控制)

如果某些场景下你需要更精准的控制,也可以在代码里显式指定使用哪个连接:

// 写入操作:用主节点
Redis::connection('default')->set('user:1:name', 'John Doe');

// 读取操作:用从节点
$userName = Redis::connection('read')->get('user:1:name');

4. 配置环境变量

最后别忘在.env文件里填上实际的节点信息:

REDIS_CLIENT=phpredis
REDIS_HOST=192.168.1.2
REDIS_PASSWORD=your-master-password
REDIS_PORT=6379
REDIS_DB=0

REDIS_READ_HOST=192.168.1.1
REDIS_READ_PASSWORD=your-slave-password
REDIS_READ_PORT=6379
REDIS_READ_DB=0

注意事项

  • 确保你的Redis从节点已经配置为只读模式(旧版本设置slave-read-only yes,新版本设置replica-read-only yes),避免误写入从节点导致数据不一致。
  • 如果有多个从节点,你可以在read集群里添加多个节点配置,Laravel会自动做负载均衡。

内容的提问来源于stack exchange,提问作者MevlütÖzdemir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:53:41