Redis Node.js客户端集群连接与配置指南
集群连接基础
Redis集群模式与单机模式在连接方式上有显著区别。使用node-redis库连接Redis集群时,需要指定集群中的部分或全部节点作为入口点。以下是一个基础示例:
import { createCluster } from 'redis';
// 创建集群客户端实例
const cluster = await createCluster({
rootNodes: [{
url: 'redis://10.0.0.1:30001'
}, {
url: 'redis://10.0.0.2:30002'
}]
})
.on('error', err => console.log('Redis集群错误', err))
.connect();
// 使用集群客户端进行操作
await cluster.set('key', 'value');
const value = await cluster.get('key');
await cluster.close();
集群配置详解
核心配置参数
| 配置项 | 默认值 | 说明 | |--------|--------|------| | rootNodes | 必填 | 集群入口节点数组,用于获取集群拓扑。每个元素是客户端配置对象,不需要指定所有节点,通常3个足够可靠 | | defaults | - | 集群中所有客户端的默认配置值,例如用于指定ACL用户 | | useReplicas | false | 设为true时,只读命令(如GET)会分发到所有节点;false则仅使用主节点 | | minimizeConnections | false | true时.connect()仅发现拓扑而不连接所有节点,适用于短连接或Pub/Sub场景 | | maxCommandRedirections | 16 | 命令因MOVED/ASK错误被重定向的最大次数 | | nodeAddressMap | - | 定义节点地址映射(详见下文) | | modules | - | 包含的Redis模块 | | scripts | - | Lua脚本定义 | | functions | - | 函数定义 |
认证配置
在集群环境中,如果需要在所有连接上使用相同的认证信息,应使用defaults配置:
createCluster({
rootNodes: [{
url: 'redis://10.0.0.1:30001'
}],
defaults: {
username: 'myuser',
password: 'mypassword'
}
});
节点地址映射
当客户端与集群处于不同网络环境时(如云服务场景),需要建立内部地址与外部地址的映射关系:
// 静态映射方式
createCluster({
nodeAddressMap: {
'10.0.0.1:30001': {
host: 'external-host.io',
port: 30001
}
}
});
// 动态映射函数方式
createCluster({
nodeAddressMap(address) {
// 解析地址并返回映射后的host和port
return {
host: `external-host.io`,
port: Number(address.split(':')[1])
};
}
});
这种映射在AWS ElastiCache等云服务场景中尤为常见,当从外部网络访问集群时需要特别注意。
命令路由机制
键操作命令
对于操作Redis键的命令(如GET/SET等),路由基于第一个指定的键。例如MGET key1 key2 key3
会根据key1确定目标节点。
服务器管理命令
MEMORY STATS、FLUSHALL等服务器管理命令不与特定集群节点绑定,需要通过.getSlotMaster()
指定目标节点执行。
转发命令
某些命令(如PUBLISH)会被Redis服务器自动转发到其他节点。客户端会将这些命令随机发送到集群节点以实现负载均衡。
最佳实践建议
- 连接管理:对于长期运行的应用程序,建议保持集群连接而不是频繁创建/关闭
- 错误处理:务必监听error事件以处理集群拓扑变更等异常情况
- 节点选择:rootNodes应选择不同物理机上的节点以提高容错能力
- 性能调优:根据场景合理设置useReplicas和minimizeConnections参数
通过合理配置,node-redis客户端可以高效稳定地与Redis集群协同工作,满足各种生产环境需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考