1

我在两台机器上成功安装了 Redis,然后作为主从工作。我测试了一些代码来检查复制是否有效并且一切正常。

我的客户经理看起来像

var manager = new PooledRedisClientManager(new[] { "MasterIP:6379" }, new[] { "MasterIP:6379", "SlaveIP:6379" });

但是现在我关闭了我的主实例,当我再次测试我的代码时,我得到了一个错误,比如客户端无法连接到主服务器。

ps 对于阅读,我使用 GetReadOnlyCacheClient();

我重复了我的代码,我注意到客户端首先获取主控(错误无法连接),然后当我再次运行我的代码时客户端获取从属,然后当我再次运行我的代码时客户端获取主控等等。

我在 ServiceStack.Redis 客户端下载了源代码。我只是想检查该错误何时发生,这是代码。

private void Connect()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        {
            SendTimeout = SendTimeout,
            ReceiveTimeout = ReceiveTimeout
        };
        try
        {
            if (ConnectTimeout == 0)
            {
                socket.Connect(Host, Port);
            }
            else
            {
                var connectResult = socket.BeginConnect(Host, Port, null, null);
                connectResult.AsyncWaitHandle.WaitOne(ConnectTimeout, true);
            }

            if (!socket.Connected)
            {
                socket.Close();
                socket = null;
                return;
            }
            Bstream = new BufferedStream(new NetworkStream(socket), 16 * 1024);

            if (Password != null)
                SendExpectSuccess(Commands.Auth, Password.ToUtf8Bytes());

            db = 0;
            var ipEndpoint = socket.LocalEndPoint as IPEndPoint;
            clientPort = ipEndpoint != null ? ipEndpoint.Port : -1;
            lastCommand = null;
            lastSocketException = null;
            LastConnectedAtTimestamp = Stopwatch.GetTimestamp();

            if (ConnectionFilter != null)
            {
                ConnectionFilter(this);
            }
        }
        catch (SocketException ex)
        {
            if (socket != null)
                socket.Close();
            socket = null;

            HadExceptions = true;
            var throwEx = new RedisException("could not connect to redis Instance at " + Host + ":" + Port, ex);
            log.Error(throwEx.Message, ex);
            throw throwEx;
        }
    }

我真的不明白这段代码,couze项目真的很大,但我认为没有如果这个服务器出现故障,那么尝试从只读服务器列表中的另一台主机获取(如果存在)

我可以制作某种我的自定义逻辑来检查是否无法尝试获取另一个只读实例..但是不支持这个客户端准备好解决这个问题吗?

4

0 回答 0