Redis Sentinel C# Client

本文关键字:Client Sentinel Redis | 更新日期: 2023-09-27 17:57:10

我有3个redis服务器,1个主服务器和2个从服务器。目前只有 1 个哨兵在运行,它很好地监控了它们。它将在需要时提升任何实例,并且非常流畅。

我目前遇到的问题是从 C# 与它进行通信。从我的谷歌搜索来看,似乎只有 csredis 支持检索奴隶/主人的哨兵。所以使用这样的代码...

//Create a manager, which has all the sentinels in it (this would have 3 when we go live)
RedisSentinelManager sentman = new RedisSentinelManager("localhost:26379");
//Get a slave, as these are read-only
sentman.GetSlave("mymaster", 100, 100);
//Get a master, for storing an object
sentman.GetMaster("mymaster", 100, 100);

这有效,绝对没问题,当我杀死一个实例时,各种响应会发生变化。但是,它非常慢!

如果我创建管理器并尝试获取从站5次,那么每个从站请求大约需要1秒,这太慢了。我注意到的是,第一个请求非常非常快。请参阅下面的代码...

//Try and get 5 slaves
for ( int i = 0; i < 5; i ++ )
{
    Stopwatch a = Stopwatch.StartNew();
    var slave = sentman.GetSlave("mymaster", 50, 50);
    if (slave == null)
        Console.WriteLine("Failed to get slave");
    Console.WriteLine("Took " + a.ElapsedMilliseconds.ToString() + "ms to get " + slave.Host + ":" + slave.Port);
}

这是输出...

Took 4ms to get localhost:6400
Took 844ms to get localhost:6400
Took 1007ms to get localhost:6400
Took 999ms to get localhost:6400
Took 994ms to get localhost:6400

这很奇怪,第一个是 4ms!然后需要一个年龄才能获得任何后续客户。所以我尝试另一个测试,每个循环项目创建一个新的 SentinelManager,这样更快吗?不,完全一样。第一个非常快,然后非常非常慢。

我是否错误地使用此库,或者我发现了错误?尝试抓住源头并逐步完成它...

干杯伙计们...


Redis Sentinel C# Client

我在这里发现了问题,这是客户端的问题。在它的 dispose 方法中,大约需要 1 秒来处置一些异步对象。