Redis客户端4.6.5版本读写分离配置及多端点读写操作处理方案咨询
Redis客户端4.6.5版本读写分离配置及多端点读写操作处理方案咨询
嘿,针对你在Redis客户端4.6.5版本里配置读写分离的问题,我给你两种实用的解决方案~
Redis官方客户端v4.6.5本身并没有内置的“单客户端区分读写主机”的配置项,所以直接在redis.createClient()里同时指定读写主机是行不通的,但我们可以通过以下两种方式实现需求:
方案一:创建独立的读、写客户端实例
这是最直观且易维护的方式,分别初始化连接到写主节点和读从节点的客户端,在业务代码里针对性调用即可。
示例代码:
const redis = require('redis'); // 初始化写客户端(连接主节点,负责所有写操作) const writeClient = redis.createClient({ url: 'redis://your-write-host:6379' }); // 初始化读客户端(连接从节点,负责所有读操作) const readClient = redis.createClient({ url: 'redis://your-read-host:6379' }); // 异步连接两个客户端 (async () => { await writeClient.connect(); await readClient.connect(); })(); // 封装写操作 async function writeData(key, value) { await writeClient.set(key, value); console.log('数据写入完成'); } // 封装读操作 async function readData(key) { const result = await readClient.get(key); console.log('读取到数据:', result); return result; }
这种方式的优势是逻辑清晰,排查问题时也更容易定位到具体的客户端实例,适合大多数中小型项目。
方案二:封装统一的读写路由工具类
如果不想在业务代码里频繁区分两个客户端,可以封装一个工具类,内部自动将读、写请求路由到对应的客户端,对外暴露统一的调用接口。
示例代码:
const redis = require('redis'); class RedisRWHandler { constructor(writeHostUrl, readHostUrl) { this.writeClient = redis.createClient({ url: writeHostUrl }); this.readClient = redis.createClient({ url: readHostUrl }); // 初始化连接 this.#initConnections(); } async #initConnections() { try { await this.writeClient.connect(); await this.readClient.connect(); console.log('读写客户端连接成功'); } catch (err) { console.error('客户端连接失败:', err); } } // 封装写命令(比如set、hset等) async set(key, value, options) { return this.writeClient.set(key, value, options); } async hset(key, field, value) { return this.writeClient.hset(key, field, value); } // 封装读命令(比如get、hget等) async get(key) { return this.readClient.get(key); } async hget(key, field) { return this.readClient.hget(key, field); } // 如需支持更多Redis命令,按照上述格式继续封装即可 } // 使用示例 const redisHandler = new RedisRWHandler( 'redis://your-write-host:6379', 'redis://your-read-host:6379' ); // 写操作调用 await redisHandler.set('user:1:name', 'Prem'); // 读操作调用 const userName = await redisHandler.get('user:1:name');
这种方式对业务代码更友好,调用方不需要关心底层的读写分离逻辑,适合大型项目或需要统一Redis操作规范的场景。
额外提示(集群/哨兵场景)
如果你的Redis是集群或哨兵模式,v4.6.5版本的客户端已经支持自动节点发现,但默认会把所有请求发送到主节点。此时你可以给读客户端加上readOnly: true参数,让它自动连接到从节点:
const readClient = redis.createClient({ url: 'redis://your-cluster-host:6379', readOnly: true });
备注:内容来源于stack exchange,提问作者Prem




