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
相关产品推荐
相关产品推荐

