具有多个客户端名称的StackExchange.Redis

时间:2018-09-14 01:36:33

标签: c# stackexchange.redis

我们需要在StackExchange.Redis中使用多个客户端名称,据我所知,这意味着多个连接字符串和ConnectionMultiplexer的多个(静态)实例。

我目前的想法是创建一个静态包装器类,并使用一个以客户端名称(或整个连接字符串)为键的私有字典来存储多路复用器实例,并公开一个查询多路复用器的GetDatabase(name)方法(或锁定并创建它),然后将实例上的GetDatabase()调用的结果返回给调用者。

这是我首先想到的,但是如果有更好的方法来处理此要求,我不会感到惊讶。

1 个答案:

答案 0 :(得分:1)

过去,我面临着相同的情况,我需要根据配置动态更改连接。为了解决这个问题,我创建了静态Helper类,该类将端点IP地址作为输入并返回连接作为结果。

/// <summary>
/// Helper class for connection with Redis Server.
/// </summary>
public static class Helper
{
    /// <summary>
    /// Configuration option to connect with Redis.
    /// </summary>
    private static Lazy<ConfigurationOptions> configOptions(string ipAddress)
    {
        var configOptions = new ConfigurationOptions();
        configOptions.EndPoints.Add(ipAddress);
        /*
        ...Other Configurations...
        */
        return new Lazy<ConfigurationOptions>(() => configOptions);
    }

    private static Lazy<ConnectionMultiplexer> lazyConnection(string ipAddress)
    {
        return new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(configOptions(ipAddress).Value));
    }

    /// <summary>
    /// Connection property to connect Redis.
    /// </summary>
    public static ConnectionMultiplexer Connection(string ipAddress)
    {
        return lazyConnection(ipAddress).Value;
    }
}

如何使用它:

var database = Helper.Connection("Your IP address").GetDatabase(0);

这是简单的解决方法,当然,您可以根据需要对其进行修改并使其更具可配置性。这里的想法是使Redis连接动态化,以便我们可以基于此执行其他操作,例如设置和获取键和值。