You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动