StackExchange.Redis ConnectionMultiplexer - 处理断开连接

时间:2015-03-29 15:35:17

标签: c# redis stackexchange.redis

在ConnectionMultiplexer中处理套接字故障的正确方法是什么?我知道它会在后台默默地再次尝试,但有没有任何可接受的规范方法来处理这种断开连接之间的时间?因为无论如何我把它包装在我们自己的客户端中,我想的是以下内容:

  private async Task<IDatabase> GetDb(int dbToGet)
    { 
        int numberOfRetries = 0;
        while (!multiplexer.IsConnected && numberOfRetries < MAX_RETRIES)
        {
                await Task.Delay(20);
                numberOfRetries++;
        }
        if (!multiplexer.IsConnected)
        {
                 // Panic, die, etc.
        }

       // Continue as though connected here
    }
但是,这似乎有点笨拙,所以我想知道是否有更好的方法来解决这个问题。

(这是StackExchange.Redis的1.0.414版本,NuGet的最新版本)

1 个答案:

答案 0 :(得分:0)

我刚刚包装了多路复用器, 默认情况下它具有自动重新连接定义, 真正的问题是你有订阅/ Psubscribe Redis与当前套接字连接, 因此,我使用ConnectionRestored事件将订阅模式重新注册到相关的通道/操作。

类示例:

public class RedisInstanceManager
{
    public RedisInstanceCredentials m_redisInstanceCredentials { get; set; }
    public DateTime? m_lastUpdatedDate { get; set; }
    public ConnectionMultiplexer redisClientsFactory { get; set; }
    public Timer _ConnectedTimer;
    public Action _reconnectAction; 
    public RedisInstanceManager(ConnectionMultiplexer redisClients, Action _reconnectActionIncoming)
    {
        string host,port;
        string[] splitArray  = redisClients.Configuration.Split(':');
        host =  splitArray[0];
        port = splitArray[1];

        this.redisClientsFactory = redisClients;
        this.m_redisInstanceCredentials = new RedisInstanceCredentials(host, port);
        this.m_lastUpdatedDate = null;
        _ConnectedTimer = new Timer(connectedTimer, null, 1500, 1500);
        _reconnectAction = _reconnectActionIncoming;
        this.redisClientsFactory.ConnectionRestored += redisClientsFactory_ConnectionRestored;
    }

    private void connectedTimer(object o)
    {
        _ConnectedTimer.Change(Timeout.Infinite, Timeout.Infinite);
        if (!this.redisClientsFactory.IsConnected)
        {
            Console.WriteLine("redis dissconnected");
        }
        _ConnectedTimer.Change(1500,1500);
    }

    void redisClientsFactory_ConnectionRestored(object sender, ConnectionFailedEventArgs e)
    {
        Console.WriteLine("Redis Connected again");
        if (_reconnectAction != null)
            _reconnectAction();
    }

    public ConnectionMultiplexer GetClient()
    {
        return this.redisClientsFactory;
    }
}
相关问题