使用StackExchange.Redis和ElastiCache

nir*_*irw 8 redis amazon-elasticache stackexchange.redis

我打算用 ConnectionMultiplexer.Connect("server1:6379,server2:6379") 语法,使用地址:ElastiCache复制组中每个节点的端口号组合(以AWS术语表示).

库是否会处理死/无响应的节点,自动将命令传递给活动节点?
库是否会自动发现失败的节点现在再次可用/添加到复制组的新节点?

the*_*000 5

ConnectionMultiplexer我对 Elasticache 不熟悉,但是如果连接断开,StackExchange.Redis会在后台自动重试,并且会发现恢复的节点。

当然,在失败时,您在访问数据库时会遇到异常,但如果正确处理错误,则不需要重新创建ConnectionMultiplexer.

我使用以下代码在集群模式和独立模式下对此进行测试:

var mul = ConnectionMultiplexer.Connect("192.168.15.15:7000,192.168.15.15:7001,...,connectRetry=10,syncTimeout=5000,abortConnect=false,keepAlive=10,allowAdmin=true");
RETRY:
    Thread.Sleep(1000);
    var k = Guid.NewGuid().ToString();
    var v = Guid.NewGuid().ToString();
    try
    {
        var db = mul.GetDatabase();
        db.StringSet(k, v);
        if (db.StringGet(k).ToString() != v)
        {
            throw new OperationCanceledException("ABORT");
        }
    }
    catch(RedisServerException ex)
    {
        Console.WriteLine("Redis Server Exception {0}", ex.Message);
        goto RETRY;
    }
    catch(RedisConnectionException ex)
    {
        Console.WriteLine("Redis Connection Exception {0}", ex.Message);
        goto RETRY;
    }
    catch(TimeoutException ex)
    {
        Console.WriteLine("Timeout Exception {0}", ex.Message);
        goto RETRY;
    }
    Console.WriteLine("OK");
    goto RETRY;
Run Code Online (Sandbox Code Playgroud)

当关闭/崩溃不同的服务器时,我收到了三种类型的异常:RedisServerExceptionRedisConnectionExceptionTimeoutException。一旦服务器/集群重新启动并运行,就停止接收异常。