使用流水线的高频 Redis SET 导致看似非随机间隔的超时和延迟

问题描述 投票:0回答:0

我正在尝试使用 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);
        }
    }
}

redis stackexchange.redis amazon-elasticache
© www.soinside.com 2019 - 2024. All rights reserved.