我正在.NET Core 2.2中开发一些Web api
这些要求使我们到了在多个Redis存储中存储/缓存/集中数据的地步(为了简便起见,假设有2个Redis服务器)。
那将是(例如)
到目前为止,数据保护似乎仍然有效,并且它已按照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"); //?
如何获取指向正确(第一或第二服务器)的正确数据库?
答案 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();
....