.NET Core StackExchange.Redis Connection多个 Redis 服务器的多路复用器设置



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

这些要求将我们带到了将数据存储/缓存/集中到多个 redis 存储中的地步(为了方便起见,让我们假设 2 个 redis 服务器)。

那将是(例如)

  1. 服务器 1 用于数据保护
  2. 服务器 2 用于其他一些数据

到目前为止,数据保护似乎有效,并且按照基本使用指南中的建议,使用连接多路复用器(已添加为单例以供事先重用)进行配置。

StartUp.ConfigureServices 的相关部分

ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("server1:6729");
services.AddSingleton<IConnectionMultiplexer>(cm);
services.AddDataProtection()
.SetApplicationName("myapp")
.PersitKeysToStackExchangeRedis(cm, "DataProtection-Keys");

密钥按预期存储在服务器 1 上的 redis 存储中。


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

连接多路复用器可以连接到两个服务器吗?

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

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

或者只是一个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();
....

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

如果您只想对密钥进行逻辑分离,Redis 内部有 8 个数据库。例如,您拥有的其他存储代码可以只调用_muxer.GetDatabase(3),并且您可以使用同一台服务器。

如果您有其他原因需要单独的服务器,我会创建一个不同的包装类/接口。包装类可以更新ConnectionMultiplexer并在单例作用域中注入。您最终拥有 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");

最新更新