我们正在使用StackExchange.Redis客户端。我们还使用Sentinel,它会告诉我们Redis主服务器何时更改。由于我们已经创建了连接(推荐使用Lazy<IConnectionMultiplexer>
),我们想知道什么是最好的方法来更改连接信息,使其指向新的Redis主服务器?
我们看到几个选项:
1.当通知来自Sentinel时,创建一个新的Lazy<IConnectionMultiplexer>
1.更改现有连接复用器上的连接信息
2有可能吗?
我们目前的方式:
private Lazy<IConnectionMultiplexer> CreateRedisConnection()
{
return new Lazy<IConnectionMultiplexer>(
() =>
{
ConnectionMultiplexer multiplexer = null;
//Connect to Sentinel so we can find the redis master
ConnectionMultiplexer sentinelMultiplexer = ConnectionMultiplexer.Connect(SentinelOptions);
string masterNodeAddress = GetMasterNodeAddress(sentinelMultiplexer);
return ConnectionMultiplexer.Connect(masterNode);
}
);
}
字符串
然后在收到通知后,我们简单地重新调用CreateRedisConnection()
。
但这完全重新创建了连接多路复用器,而不是更轻量级的方法(这可能是不可能的)。
1条答案
按热度按时间myss37ts1#
在StackExchange.Redis中使用Sentinel处理master更改的推荐方法是在检测到更改时创建一个新的ConnectionMultiplexer。与尝试修改现有的ConnectionMultiplexer相比,重新创建ConnectionMultiplexer是一种更安全,更直接的方法。
如果主服务器发生更改,则创建新的ConnectionMultiplexer允许库建立到新主服务器的连接,并透明地处理更改。
下面是对代码的一个简单修改,以说明这种方法:
字符串
在这个例子中,我添加了一个HandleMasterChange方法,如果已经创建了现有的连接,它会处理现有的连接,然后通过调用InitializeRedisConnection重新创建它。这样,您的应用程序可以通过在需要时重新创建ConnectionMultiplexer来适应Sentinel中的主更改。
重新创建ConnectionMultiplexer通常被认为是比尝试修改现有的方法更干净、更可靠的方法。