代码无法连接Redis服务器,Redis Desktop Manager却可正常连接,求排查
结合你的代码和报错场景(RDM可正常连接但代码报错),以下是几个核心排查点及修复方案:
1. Sentinel地址格式缺失端口
你的代码通过逗号拆分配置的Sentinel地址,但ServiceStack.Redis不会自动填充Sentinel默认端口(26379),如果配置中只写IP未带端口,会导致连接失败。而RDM通常会自动补全默认端口,这是关键差异点。
修复:检查Taurus_Redis_Sentinel_Connection配置,确保每个地址为ip:port格式,示例:
"Taurus_Redis_Sentinel_Connection": "192.168.1.100:26379,192.168.1.101:26379"
2. OnFailover回调的递归初始化问题
你在OnFailover中调用InitializeConnection()递归重建Sentinel实例,会导致客户端状态混乱、资源泄漏,进而触发连接异常。ServiceStack.Redis的RedisSentinel本身已内置自动重连机制,无需手动递归初始化。
修复:移除递归调用,简化回调逻辑:
_sentinel = new RedisSentinel(_sentinelHosts, masterName: masterName) { OnFailover = manager => { Log.Error("Failover detected, new master: " + _sentinel.GetMaster()); if (_reconnects < MaxReconnects) { Log.Error("Reconnection attempt: " + ++_reconnects); // 无需手动初始化,RedisSentinel会自动处理重连 } else { Log.Error("Reconnection exceeded max limit of: " + MaxReconnects); Environment.Exit(1); } }, };
3. 版本兼容性问题
若你的Redis集群版本较新(如6.x+),但使用的ServiceStack.Redis版本过旧,会存在协议兼容性问题,导致Sentinel握手失败。RDM会跟进Redis新版本,因此能正常连接。
修复:通过NuGet升级ServiceStack.Redis到最新稳定版:
Install-Package ServiceStack.Redis -Version latest
4. 密码认证遗漏
若Redis集群开启了密码认证,代码中未配置密码会导致连接失败,而RDM可能已保存密码所以能正常访问。
修复:在RedisSentinel中添加密码配置:
_sentinel = new RedisSentinel(_sentinelHosts, masterName: masterName) { Password = ConfigurationManager.AppSettings["Taurus_Redis_Password"], // 其他配置项 };
5. 主节点名称大小写敏感
Redis主节点名称是大小写敏感的,即使肉眼看一致,也需确认配置值与集群实际名称完全匹配(包括大小写)。
修复:核对Taurus_Redis_Master_Name配置与Redis集群主节点名称的大小写、拼写完全一致。
内容的提问来源于stack exchange,提问作者Hemant Singh Sisodia

