加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – StackExchange.Redis – 是否可以确定端点的优先级?

发布时间:2020-12-15 22:44:54 所属栏目:百科 来源:网络整理
导读:我的设置: 4台Windows服务器 每台服务器上的Redis节点和Sentinel进程 在每个服务器上部署相同的Web应用程序 Web应用程序通过StackExchange.Redis驱动程序连接到redis服务器 一切都很好,但我想知道读操作是否有可能总是尝试使用本地可用的redis节点.这将大大
我的设置:

> 4台Windows服务器
>每台服务器上的Redis节点和Sentinel进程
>在每个服务器上部署相同的Web应用程序
> Web应用程序通过StackExchange.Redis驱动程序连接到redis服务器

一切都很好,但我想知道读操作是否有可能总是尝试使用本地可用的redis节点.这将大大提高性能,因为所有读取操作的跳数都会减少.

据我所知,通过Command Flags属性,可以优先考虑奴隶而不是特定命令.但有没有办法确定具体终端的优先顺序?

PS:

使用的DLL:StackExchange.Redis.StrongName@1.2.0.0

Redis服务器版本:3.2.100

编辑:

这是我的连接代码.我没有使用推荐的Lazy getter的原因是因为我想在其中一个节点失败时连接/重新连接,这对我的解决方案很有效.

internal class RedisConnector
{
    private readonly ConfigurationOptions _currentConfiguration;
    internal ConnectionMultiplexer Connection;

    internal RedisCacheStore Store;

    internal RedisConnector(ConfigurationOptions configuration)
    {
        _currentConfiguration = configuration;
        Connect();
    }

    internal IDatabase Database
        => Connection.GetDatabase(RedisCacheConfiguration.Instance.Connection.DatabaseId);

    internal IServer Server => Connection.GetServer(Database.IdentifyEndpoint());

    private void Connect()
    {
        Connection = ConnectionMultiplexer.Connect(_currentConfiguration);
        if (Connection == null || !Connection.IsConnected)
            throw new CacheNotAvailableException();
        Connection.ConnectionFailed += OnConnectionFailed;
        Connection.ConnectionRestored += OnConnectionRestored;
        Store = new RedisCacheStore(Database);
    }

    private void Reconnect()
    {
        if (Connection != null && !Connection.IsConnected)
            Connection.Dispose();
        Connect();
    }

    private void OnConnectionFailed(object sender,ConnectionFailedEventArgs args)
    {
        lock (_currentConfiguration)
        {
            if (_currentConfiguration.EndPoints.Contains(args.EndPoint))
            {
                _currentConfiguration.EndPoints.Remove(args.EndPoint);
                Reconnect();
            }
        }
    }

    private void OnConnectionRestored(object sender,ConnectionFailedEventArgs args)
    {
        lock (_currentConfiguration)
        {
            if (!_currentConfiguration.EndPoints.Contains(args.EndPoint))
            {
                _currentConfiguration.EndPoints.Add(args.EndPoint);
                Reconnect();
            }
        }
    }
}

解决方法

在这种情况下.

假设你有这个案例,3VM有3个应用程序& 3个redis实例.

enter image description here


APP在VM1中运行的最佳选择是在VM1中使用Redis.
APP在VM2中运行的最佳选择是在VM2中使用Redis.
APP在VM3中运行的最佳选择是在VM3中使用Redis.

您可以实现一些规则,如下所示:

private static Lazy<ConfigurationOptions> configOptions
    = new Lazy<ConfigurationOptions>(() => 
    {
        var configOptions = new ConfigurationOptions();
        configOptions.EndPoints.Add("x.x.x.1:6379");          
        configOptions.EndPoints.Add("x.x.x.2:6379");
        configOptions.EndPoints.Add("x.x.x.3:6379");

        configOptions.ClientName = "LeakyRedisConnection";
        configOptions.ConnectTimeout = 100000;
        configOptions.SyncTimeout = 100000;
        return configOptions;
    });



private static string getIP()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("ip not found!");
}


private static Lazy<ConfigurationOptions> getOptionsForIp(string myip)
        {
            var configOptions = new ConfigurationOptions();
            configOptions.EndPoints.Add(myip);
            configOptions.ClientName = "LeakyRedisConnectionDirectVM";
            configOptions.ConnectTimeout = 100000;
            configOptions.SyncTimeout = 100000;
            return configOptions;
        });


private static ConnectionMultiplexer conn;

private static ConnectionMultiplexer LeakyConn
{
    get
    {
        if (conn == null || !conn.IsConnected){               
            string myIP = getIP();

            conn = ConnectionMultiplexer.Connect(getOptionsForIp(myIP).Value);
            if(conn == null || !conn.IsConnected){
                conn = ConnectionMultiplexer.Connect(configOptions.Value);
            }

        }
        return conn;
    }
}

如何使用此代码:

var db = LeakyConn.GetDatabase();
 db.StringSet(key,i);
 db.StringGet(key);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读