多个Redis服务器的.NET Core StackExchange.Redis ConnectionMultiplexer设置

时间:2019-02-19 13:46:20

标签: c# redis .net-core stackexchange.redis

我正在.NET Core 2.2中开发一些Web api

这些要求使我们到了在多个Redis存储中存储/缓存/集中数据的地步(为了简便起见,假设有2个Redis服务器)。

那将是(例如)

  1. 用于数据保护的服务器1
  2. 服务器2中的其他数据

到目前为止,数据保护似乎仍然有效,并且它已按照basic usage guide中的建议使用连接多路复用器(已作为单例添加,以供事前重用)进行配置。

StartUp.ConfigureServices的相关部分

  ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729");
  services.AddSingleton<IConnectionMultiplexer>(cm);

  services.AddDataProtection()
    .SetApplicationName("myapp")
    .PersitKeysToStackExchangeRedis(cm, "DataProtection-Keys");

密钥已按预期存储在服务器1的Redis存储中。


现在我需要集成第二个存储。

ConnectionMultiplexer可以用于连接到两个服务器吗?

ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729;server2:6729"); //?

如何获取指向正确(第一或第二服务器)的正确数据库?

2 个答案:

答案 0 :(得分:0)

ConnectionMultiplexer可以连接到服务器群集,但这仅用于故障转移/负载平衡/同一数据集的复制。

如果您只想逻辑上地分离键,则Redis内部有8个数据库。例如,您拥有其他存储代码只能调用_muxer.GetDatabase(3),并且可以使用同一服务器。

如果还有其他原因需要单独的服务器,则可以创建一个不同的包装器类/接口。包装器类可以重新创建ConnectionMultiplexer并将其注入Singleton范围。您最终拥有2个多路复用器实例,但这不是一个大问题,要避免的主要事情是更新许多实例,例如每次调用。

public Interface IOtherStorage
{
    void StoreItem(string key, string value);
}

public class OtherStorage : IOtherStorage
{
    private IConnectionMultiplexer _muxer;

    public OtherStorage(string connection)
    {
        _muxer = ConnectionMultiplexer.Connection(connection)
    }

    public void StoreItem(string key, string value)
    {
        _muxer.GetDatabase().StringSet(key, value);
    }
}

在启动阶段

services.AddSingleton<IOtherStorage>(c => new OtherStorage("server2:6279");

答案 1 :(得分:0)

或者只拥有ConnectionMultiplexer工厂的单身人士:

public class ConnectionFactory
{
    private Lazy<ConnectionMultiplexer> _cnn1 { get; set; }
    private Lazy<ConnectionMultiplexer> _cnn2 { get; set;}
    public ConnectionFactory(string cnn1, string cnn2)
    {
        _cnn1 = new Lazy<UserQuery.ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(cnn1));
        _cnn2 = new Lazy<UserQuery.ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(cnn2));
    }
    public ConnectionMultiplexer GetConnection1()
    {
        return _cnn1.Value;
    }
    public ConnectionMultiplexer GetConnection2()
    {
        return _cnn2.Value;
    }
}

并注册为:

var factory = new ConnectionFactory("server1:6379", "server2:6379");
services.AddSingleton(factory);

var cm1 = factory.GetConnection1();
var cm2 = factory.GetConnection2();

....