15

StackExchange.Redis用来与 3 个不同的 Redis 实例通信:1 个在同一子网上,2 个远程。这是我的配置代码:

var configurationOptions = new ConfigurationOptions
{
    EndPoints =
    {
        { host, port }
    },
    KeepAlive = 180,
    Password = password,
    DefaultVersion = new Version("2.8.5"),
    // Needed for cache clear
    AllowAdmin = true
};

var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions );

最后一行大约 70% 的时间会引发连接异常:

无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail

为什么这是间歇性的和/或我做错了什么?当我在命令提示符下 ping Redis 服务器时,丢包率为 0%,响应时间小于 1 毫秒。网络很稳定。

谢谢!

编辑

以下是失败时的日志输出:

10.48.68.28:6379,keepAlive=180,version=2.8.5

1 unique nodes specified
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:01 to respond...
10.48.68.28:6379 did not respond
10.48.68.28:6379 failed to nominate (WaitingForActivation)
No masters detected
10.48.68.28:6379: Standalone v2.8.5, master; keep-alive: 00:03:00; int: Connecting; sub: ConnectedEstablished, 1 active; not in use: DidNotRespond
10.48.68.28:6379: int ops=0, qu=4, qs=0, qc=0, wr=0, socks=1; sub ops=2, qu=0, qs=0, qc=0, wr=0, subs=1, sync=2, socks=1
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0+2=2 (0.20 ops/s; spans 10s)
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
Starting heartbeat...
4

4 回答 4

8

在连接到 Redis 时,我可以通过在客户端上设置 ConnectTimeout 来解决它。这是我的代码

 ConnectionMultiplexer connection = 
        ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000");
于 2014-11-25T23:27:25.663 回答
5

这似乎是一个常见的问题:https ://github.com/StackExchange/StackExchange.Redis/issues/42

我刚刚下载了新版本,并没有再次看到问题。然而。

于 2014-05-29T22:07:47.077 回答
4

我可以通过这样做来解决上述问题:

您收到的错误通常表明您没有在连接字符串中设置 abortConnect=false。abortConnect 的默认值为 true,这使得 StackExchange.Redis 在某些情况下不会自动重新连接到服务器。我们强烈建议您在连接字符串中设置 abortConnect=false,以便 SE.Redis 在发生网络故障时在后台自动重新连接。

来源:https ://stackoverflow.com/a/30918632/2236811

所以我的 init() 看起来像这样

 ConfigurationOptions co = new ConfigurationOptions()
        {
            SyncTimeout = 500000,
            EndPoints =
            {
                {url,portNumber }
            },
            AbortOnConnectFail = false // this prevents that error
        };

        seClient = ConnectionMultiplexer.Connect(co);

谢谢

于 2016-10-25T12:41:28.337 回答
3

对我来说,这个错误是因为连接总数达到了最大限制,即 10K。重新启动客户端并杀死其中一些解决了问题。您可以检查 Azure 门户并确定您是否已达到任何资源的最大限制。

于 2014-12-12T19:27:50.443 回答