gpt4 book ai didi

c# - 提升Redis性能减少超时异常

转载 作者:行者123 更新时间:2023-11-30 12:19:25 29 4
gpt4 key购买 nike

我在 Centos 服务器上有一个 Redis 数据库,3 个 Windows 服务器连接到它,每秒大约 1,000 次读取/写入,所有这些都在同一个本地 LAN 上,所以 ping 时间不到一毫秒。问题是至少 5% 的读取操作会超时,而我在使用“syncTimeout=15”的读取操作中最多读取 3KB 数据,这比网络延迟要长得多。

我在 Windows 10 上的 bash 上安装了 Redis,并模拟了这个问题。我也停止了写操作。但是,问题仍然存在,超时率为 0.5%,但没有网络延迟。我还在我的 LAN 中使用 Centos 服务器来模拟该问题,在这种情况下,我需要 100 毫秒的“syncTimeout”以确保超时量小于 1%。我考虑过使用一些字典来缓存来自 Redis 的数据,这样就不需要逐项请求,而且我可以利用管道。但是我遇到了StackRedis.L1,它是作为Redis的一级缓存开发的,它对更新一级缓存没有信心。

这是我模拟问题的代码:

    var connectionMulti = ConnectionMultiplexer.Connect(
"127.0.0.1:6379,127.0.0.1:6380,allowAdmin=true,syncTimeout=15");

// 100,000 keys
var testKeys = File.ReadAllLines("D:\\RedisTestKeys.txt");

for (var i = 0; i < 3; i++)
{
var safeI = i;
Task.Factory.StartNew(() =>
{
var serverName = $"server {safeI + 1}";
var stringDatabase = connectionMulti.GetDatabase(12);
PerformanceTest($"{serverName} -> String: ",
key => stringDatabase.StringGet(key), testKeys);
});
}

PerformanceTest 方法是:

private static void PerformanceTest(string testName, Func<string, RedisValue> valueExtractor,
IList<string> keys)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine($"Starting {testName} ...");
var timeouts = 0;
var errors = 0;
long totalElapsedMilliseconds = 0;

var stopwatch = new Stopwatch();
foreach (var key in keys)
{
var redisValue = new RedisValue();
stopwatch.Restart();
try
{
redisValue = valueExtractor(key);

}
catch (Exception e)
{
if (e is TimeoutException)
timeouts++;
else
errors++;
}
finally
{
stopwatch.Stop();
totalElapsedMilliseconds += stopwatch.ElapsedMilliseconds;
lock (FileLocker)
{
File.AppendAllLines("D:\\TestResult.csv",
new[]
{
$"{stopwatch.ElapsedMilliseconds.ToString()},{redisValue.Length()},{key}"
});
}
}
}

Console.WriteLine(
$"{testName} {totalElapsedMilliseconds * 1.0 / keys.Count} (errors: {errors}), (timeouts: {timeouts})");
});
}

我希望所有读取操作都能在 15 毫秒内成功完成。实现这一点,考虑将 L1 缓存用于 Redis 缓存是一个好的解决方案吗? (它非常快,以纳秒为单位,但我该怎么做才能同步)或者 Redis 可以通过集群或其他方式增强? (虽然我在我的 PC 上的 bash 上测试了它,但我没有收到预期的结果)

最佳答案

Or Redis can be enhanced by clustering or something else?

Redis 可以以不同的方式集群:

  • “常规”redis 可以复制到辅助只读节点,在同一台机器或不同机器上;然后,您可以将“读取”流量发送到某些副本
  • 存在 redis“集群”,它允许您将键空间拆分(分片)到多个主节点上,向每个节点发送适当的请求
  • redis“集群”也可以利用分片节点的只读副本

这是否合适或有用取决于上下文,需要本地知识和测试。

Achieving this, is Considering L1 cache for a Redis cache a good solution?

是的,这是一个很好的解决方案。与您确实提出的请求相比,您不提出的请求要快得多(并且对影响的影响要小得多)。有一些工具可以帮助缓存失效,包括使用 pub/sub API 进行失效。 Redis vNext 也在研究针对这种 L1 场景的额外知识 API。专门

关于c# - 提升Redis性能减少超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58361583/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com