laravel 6.x 不支持 redis 读写分离,其配置中的 read/write 键仅对 sql 驱动生效,redis 驱动忽略该结构;必须手动定义 redis_master 和 redis_slave 连接并显式调用。

Laravel 6.x 本身不支持 Redis 读写分离,phpredis 驱动也不提供原生的主从路由能力;你看到的“Redis 读写分离”配置,基本都是误用或强行模拟,实际生效的只有单点连接——要么全走主库,要么手动切库,不存在 Laravel 自动识别 read/write 的 Redis 连接结构。
为什么 config/database.php 里加 read/write 对 Redis 无效
Laravel 的读写分离逻辑(read 数组 + write 关联数组 + sticky)只对 mysql、pgsql、sqlsrv 等 SQL 类驱动生效。Redis 驱动(redis)压根不解析 read 或 write 键,它只认 host、port、database 等顶层字段。
- 你在
'redis' => [ 'read' => [...], 'write' => [...] ]里写的任何嵌套,Laravel 启动时会直接忽略,连 warning 都不抛 -
DB::connection('redis')永远只连第一个可用节点(按hosts数组顺序),不会轮询、不看权重、不区分读写 - 试图复用 MySQL 那套配置方式,结果就是:配置写了等于没写,
phpredis还是连host字段指定的地址
想让 Laravel 6.x 用多个 Redis 实例,只能手动管理连接
如果你有主从 Redis 架构(比如主库写、从库只读),必须靠代码显式控制流向,框架不帮你做决策:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 定义两个独立连接:在
config/database.php的'redis'下新增'redis_master'和'redis_slave',各自带完整参数(host、port、password、database) - 写操作强制走主:
Redis::connection('redis_master')->set('key', 'val') - 读操作尽量走从:
Redis::connection('redis_slave')->get('key') - 注意:
Redis::connection()返回的是Predis\Client或Redis(phpredis)实例,不是 Eloquent,没有自动路由 - 别指望
$redis->on('redis_slave')—— Redis facade 没这个方法,会报Call to undefined method
phpredis 扩展本身不处理主从切换,得自己兜底
phpredis 是个底层 C 扩展,它只提供连接和命令执行能力,不内置故障转移、读写分离、哨兵发现等逻辑。你要靠 PHP 层补足:
- 从库挂了?得捕获
RedisException,再 fallback 到主库读(但要注意主从延迟导致的脏读) - 想轮询多个从库?得自己写一个随机选节点的封装类,不能依赖 Laravel 配置
- 哨兵模式?
phpredis支持sentinel连接,但 Laravel 6.x 的 Redis 配置不暴露sentinel参数,必须手写new \Redis()实例并调用connectToSentinel() - 事务内混用主从?不行。
MULTI/EXEC必须在同一个连接上完成,跨连接直接报错
真正容易被忽略的点:Laravel 6.x 的缓存、Session、队列默认都走 redis 连接名,一旦你改了 config/database.php 里的 redis 结构(比如加了 read),这些组件会初始化失败——因为它们不认那套。所以别动默认 redis 连接,只新增 redis_master/redis_slave,并在业务代码里显式调用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










