csrediscore连接哨兵模式必须用csredisclient,其构造函数需传入master名称和哨兵地址数组,格式为"{mastername},password={pwd}";cluster模式则必须用stackexchange.redis的connectionmultiplexer。

CSRedisCore 连接哨兵模式必须用 CSRedisClient,不能用 ConnectionMultiplexer
CSRedisCore 和 StackExchange.Redis 是两套完全独立的客户端,混用会导致连接失败或行为异常。哨兵模式下,CSRedisCore 通过 CSRedisClient 构造器直接解析哨兵地址和主名称,内部自动完成 SentinelGetMasterAddressByName 查询与重试;而 ConnectionMultiplexer(StackExchange.Redis)需要手动配置 CommandMap.Sentinel、TieBreaker 等细节,稍有遗漏就会卡在“无法获取 master 地址”。
常见错误现象:CSRedisClient 初始化后调用 Set 报错 ObjectDisposedException 或连接超时,大概率是传入了非哨兵地址(比如误把 master IP 当作哨兵地址传进构造函数)。
- 哨兵连接字符串格式固定为:
"{masterName},password={pwd}",不包含任何 IP 或端口 - 哨兵节点列表必须单独作为第二个参数传入数组:
new[] { "192.168.1.10:26379", "192.168.1.11:26379" } -
masterName必须和哨兵配置中sentinel monitor指令定义的名称严格一致(区分大小写) - 密码仅用于访问 master/slave,哨兵本身不认证,所以密码不填在哨兵地址里
Cluster 模式必须用 ConnectionMultiplexer,CSRedisCore 不支持 Redis Cluster
CSRedisCore 从 3.x 到最新版(2026 年)均未实现对 Redis Cluster 的 slot 路由、MOVED/ASK 重定向、集群拓扑自动发现等能力。强行用它连 cluster 地址会报 ERR This instance has cluster support disabled 或直接拒绝认证。
正确做法是切换到 StackExchange.Redis,并使用 ConfigurationOptions 显式启用集群模式:
- 必须设置
AbortOnConnectFail = false,否则任意一个节点不可达就初始化失败 - 推荐只填一个 cluster 节点地址(如
"192.168.1.10:7000"),客户端会自动获取整个拓扑 - 若启用了密码,格式为
"192.168.1.10:7000,password=abc,allowAdmin=true",allowAdmin=true是必需的 - 不要手动添加多个节点到
EndPoints—— Cluster 拓扑应由服务端返回,硬编码反而导致路由错误
哨兵模式下出现“两个 master”不是 bug,是哨兵脑裂或配置延迟的信号
生产环境偶尔看到两次 SentinelGetMasterAddressByName 返回不同 IP,说明哨兵集群尚未达成共识:可能某台哨兵网络分区、主从复制延迟过大、或 quorum 值设得太低(比如 2/3 哨兵同意就切换)。这时如果代码不做去重聚合,直接取第一个结果,就会连错节点。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
CSRedisCore 内部已处理该逻辑:它会并发查询所有哨兵节点,统计各 master 地址出现次数,取最高频次的作为最终 master。但前提是你的哨兵列表完整且可达 —— 少传一个哨兵地址,就可能漏掉关键投票。
- 务必传入全部哨兵节点(至少 3 个),不能只传一个“代表”
- 检查各哨兵日志是否都有
+sdown/+odown记录,确认故障检测同步 - 若频繁出现双 master,优先检查
sentinel down-after-milliseconds和sentinel failover-timeout是否过短
连接字符串里写错端口是最隐蔽的失败原因
哨兵默认端口是 26379,Redis 实例默认是 6379。但很多团队为了统一管理,把哨兵也部署在 6379,或把 Redis 实例改到 26379。一旦连接字符串里的端口号和实际监听端口不一致,CSRedisClient 会静默失败(不抛异常),只在首次操作时才报超时。
验证方法很简单:用 telnet 或 nc -zv 手动连一下哨兵地址,看是否能建立 TCP 连接。连不通就别往下查代码逻辑了。
- 哨兵节点必须监听
bind配置中的 IP,不能只绑127.0.0.1 - 防火墙要放行哨兵端口(非 Redis 端口),这点常被忽略
- Docker 部署时注意
host.docker.internal在 Linux 上不可用,得用宿主机真实 IP
哨兵和 Cluster 的底层通信机制完全不同,连错客户端或端口不会报明确错误,而是表现为随机超时、写入丢失或读到旧数据 —— 这类问题必须从网络连通性开始逐层验证,不能只盯着 C# 代码。










