ServiceStack.Redis v5.14是否支持多分片Azure Redis部署?
问题解答
ServiceStack.Redis v5.14支持Azure Redis的多分片(Redis Cluster)实现,你遇到的MOVED错误是因为使用了不支持Cluster重定向的普通客户端导致的,下面是具体的解决方案和注意事项:
错误原因
MOVED是Redis Cluster的标准重定向响应,当你请求的Key不在当前连接的节点上时,Redis会返回该响应告知客户端需要连接到正确的分片节点。普通的RedisClient或PooledRedisClientManager不具备自动处理Cluster节点发现和重定向的能力,因此会抛出RedisResponseException。
正确的客户端使用方式
必须使用ServiceStack.Redis专门为Cluster设计的客户端类:
RedisClusterClient:单个Cluster客户端实例RedisClusterManager:Cluster连接池管理器(适合高并发场景)
这些类会自动处理Cluster的节点发现、MOVED重定向以及节点故障转移,无需手动处理内部节点的IP和端口。
连接配置示例
你的连接字符串格式是正确的(指向Azure Redis实例DNS + 6380端口),只需替换客户端初始化逻辑即可:
单个客户端示例
var redisClusterConnStr = "your-azure-redis-name.redis.cache.windows.net:6380,password=your-access-key,ssl=true"; using var clusterClient = new RedisClusterClient(redisClusterConnStr); // 执行Redis操作 clusterClient.Set("test-key", "test-value"); var value = clusterClient.Get<string>("test-key");
连接池管理器示例
var redisClusterConnStr = "your-azure-redis-name.redis.cache.windows.net:6380,password=your-access-key,ssl=true"; var clusterManager = new RedisClusterManager(redisClusterConnStr); // 从连接池获取客户端 using var client = clusterManager.GetClient(); client.Set("pooled-test-key", "pooled-value");
关键注意事项
- 无需指定Azure Redis内部分片的端口(如错误信息中的1500),Azure Redis Cluster对外仅暴露6380(SSL)端口,内部节点通信由Azure管理
- 确保连接字符串包含
ssl=true,Azure Redis强制要求SSL连接 - 如果你之前使用的是非Cluster客户端(如
PooledRedisClientManager),需要完全替换为Cluster专用的客户端/管理器,不能混用
内容的提问来源于stack exchange,提问作者Howard Hoffman
相关产品推荐
相关产品推荐

