Nab*_*bhi 5 c# performance redis
我在 Centos 服务器上有一个 Redis 数据库,并连接了 3 个 Windows 服务器,每秒大约 1000 次读/写,所有这些服务器都在同一个本地 LAN 上,因此 ping 时间不到 1 毫秒。问题是至少 5% 的读取操作会超时,而我在“syncTimeout=15”的读取操作中读取最多 3KB 数据,这远远超过了网络延迟。
我在Windows 10上的bash上安装了Redis,并模拟了该问题。我也不再写操作了。然而,0.5% 的超时问题仍然存在,但没有网络延迟。我还在 LAN 中使用 Centos 服务器来模拟该问题,在本例中,我需要 100 毫秒的“syncTimeout”来确保超时量小于 1%。我考虑使用一些字典来缓存来自 Redis 的数据,因此不需要逐项请求,并且我可以利用管道。但我遇到了StackRedis.L1,它是作为Redis的L1缓存开发的,并且它对更新L1缓存没有信心。
这是我模拟问题的代码:
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);
});
}
Run Code Online (Sandbox Code Playgroud)
性能测试方法是:
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})");
});
}
Run Code Online (Sandbox Code Playgroud)
我预计所有读取操作都会在 15 毫秒内成功完成。实现这一目标,考虑将 L1 缓存用于 Redis 缓存是一个好的解决方案吗?(它非常快,在纳秒的范围内,但我该如何做同步)或者Redis可以通过集群或其他方式增强?(虽然我在我的PC上的bash上进行了测试,但没有收到预期的结果)
或者Redis可以通过集群或者其他方式来增强?
Redis可以通过不同的方式进行集群:
这是否合适或有用取决于具体情况,需要当地的知识和测试。
实现这一目标,考虑将 L1 缓存用于 Redis 缓存是一个好的解决方案吗?
是的,这是一个很好的解决方案。您不发出的请求比您发出的请求要快得多(并且对影响的影响要小得多)。有一些工具可以帮助缓存失效,包括使用 pub/sub API 进行失效。Redis vNext 还在研究专门针对此类 L1 场景的其他知识 API。
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |