我正在尝试使用 Redis (Elasticache) 来存储高频信息。我注意到,无论写入的数据大小如何,Redis 似乎每通过流水线写入 1-2m 条记录就会产生超时和高提交时间。这似乎只与我写入数据的速度有关。超时持续大约 5 - 10 秒,然后一切都回到 < 2s. I have also been able to reproduce this with a self managed Redis instance.
中提交我试过查看服务器上的日志,看起来没有任何异常。 CPU 使用率最低,内存正常,IO 正常,网络流量看起来符合预期,甚至平均事务时间也没有显示超时峰值。几乎没有任何迹象表明发生了什么。
怎么回事???
我已经能够使用测试应用重现此内容:
using StackExchange.Redis;
using System.Diagnostics;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHostedService<Worker>();
builder.Build().Run();
}
}
public class Worker : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var c_config = new ConfigurationOptions
{
AbortOnConnectFail = false,
Password = "PW",
Ssl = true,
SyncTimeout = 10000,
};
c_config.EndPoints.Add("<SERVER>.cache.amazonaws.com", 6379);
using var connection = await ConnectionMultiplexer.ConnectAsync(c_config);
var db = connection.GetDatabase();
ulong i = 0;
while (!stoppingToken.IsCancellationRequested)
{
var itteration = i++;
var stopwatch = new Stopwatch();
Console.WriteLine($"Writing {itteration}.");
stopwatch.Start();
var _ = db.SetAddAsync("TEST_KEY", Guid.NewGuid().ToString())
.ContinueWith(t =>
{
stopwatch.Stop();
Console.WriteLine($"Completed {itteration}, Elapsed Time: {stopwatch.ElapsedMilliseconds / 1000}");
if (t.IsFaulted)
{
Console.WriteLine(t.Exception);
}
}, CancellationToken.None);
}
}
}