Laravel原生不支持缓存读写分离,需通过三种方式实现:一、自定义RedisStore驱动分发读写;二、配置多个命名缓存store手动调用;三、借助Twemproxy等外部代理透明路由。

如果您在 Laravel 应用中使用缓存系统,但希望将缓存的写入与读取操作分发到不同后端(例如主 Redis 实例用于写、多个从 Redis 实例用于读),则需注意:Laravel 原生不支持缓存层的读写分离。其缓存驱动(如 redis、memcached)均为单连接模型,无内置 read/write 路由逻辑。以下提供三种可行的替代实现路径:
一、通过自定义缓存驱动注入读写路由逻辑
该方法通过继承 Illuminate\Cache\RedisStore 并重写 get() 与 put() 等核心方法,使读操作随机选择从节点、写操作固定指向主节点。需手动管理连接池及故障转移。
1、创建自定义缓存驱动类 App\Cache\ReadWriteRedisStore,继承 Illuminate\Cache\RedisStore。
2、在 __construct 方法中初始化两个独立 Redis 连接:$this->writeConnection 和 $this->readConnections(数组)。
3、重写 get() 方法,从 $this->readConnections 中随机选取一个连接执行 GET 操作。
4、重写 put()、forever()、pull() 等方法,全部委托给 $this->writeConnection 执行。
5、在 config/cache.php 的 stores.redis.driver 中替换为 'read-write-redis',并在 providers 数组中注册该驱动。
二、利用 Laravel Cache Repository 分层封装
该方法不修改底层驱动,而是在应用逻辑层通过 Cache::store() 显式调用不同命名缓存实例,配合 Env 配置区分主从连接。适用于读写语义明确、可人工控制的业务场景。
1、在 config/database.php 的 redis 配置块中定义两个独立连接:'redis_master' 和 'redis_slave',分别指向主库地址与从库地址列表。
2、在 config/cache.php 的 stores 下新增 'cache_master' 和 'cache_slave' 两个 store,driver 均设为 'redis',connection 分别指定为 'redis_master' 和 'redis_slave'。
3、在业务代码中,对写操作使用 Cache::store('cache_master')->put(...),对读操作使用 Cache::store('cache_slave')->get(...)。
4、关键提示:此方式完全绕过 Laravel 缓存自动路由机制,需开发者严格约束调用习惯。
三、借助外部代理中间件实现透明分离
该方法在 Laravel 外部部署支持读写分离的缓存代理(如 Twemproxy、Redis Cluster with read-only replicas 或自研 Proxy),使 Laravel 仍使用单一 Redis 驱动,所有路由逻辑由代理层完成。
1、部署 Twemproxy 并配置 nutcracker.yml:将 write 操作哈希至 master_group,read 操作轮询至 slave_group。
2、在 .env 中设置 CACHE_HOST=127.0.0.1,CACHE_PORT=22122(Twemproxy 监听端口)。
3、保持 config/cache.php 中 redis 配置为默认单连接形式,无需修改任何 PHP 代码。
4、验证代理行为:向 Twemproxy 发送 SET key val 后立即 GET key,确认返回结果来自 master_group;并发多 GET 请求应观察到负载分散至各 slave 节点。











