You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis连接超时问题排查与代码优化请求(支持2000+QPS)

Redis高并发请求超时问题修复方案

问题背景

以每秒5000次请求访问Redis服务器时出现连接超时错误,需优化代码以支持每秒2000次以上的高并发请求。

原代码

public static class RedisCache
{
    private static readonly Lazy<ConnectionMultiplexer> Connection = new Lazy<ConnectionMultiplexer>(() =>
    {
        var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
        var Configuration = builder.Build();
        return ConnectionMultiplexer.Connect($"{Configuration["RedisConfig:Redis"]}", (c) =>
        {
            c.ClientName = Configuration["RedisConfig:ApplicationName"].ToString();
            c.DefaultDatabase = int.Parse(Configuration["RedisConfig:DatabaseId"]);
            c.Ssl = bool.Parse(Configuration["RedisConfig:Ssl"]);
            c.ConnectTimeout = int.Parse(Configuration["RedisConfig:ConnectionTimeoutInMilliseconds"]);
            c.ConnectRetry = int.Parse(Configuration["RedisConfig:ConnectRetry"]);
            c.AsyncTimeout = int.Parse(Configuration["RedisConfig:AsyncTimeout"]);
            c.AbortOnConnectFail = false;
            c.SyncTimeout = 50000;
        });
    });

    public static IDatabase Database => Connection.Value.GetDatabase();
}

错误信息

Redis缓存:消息写入输出缓冲区前超时,未发送,command=GET,timeout:50000,inst:0,qu:0,qs:0,aw:False,bw:CheckingForTimeout,rs:NotStarted,ws:Idle,in:0,serverEndpoint:url:port,mc:1/1/0,mgr:10 of 10 available,clientName:prod,IOCP:(Busy=11,Free=989,Min=2,Max=1000),WORKER:(Busy=2,Free=32765,Min=2,Max=32767),POOL:(Threads=26,QueuedItems=0,CompletedItems=23572563),v:2.6.66.47313

优化后的代码及设计说明

修正后的代码

using Microsoft.Extensions.Configuration;
using StackExchange.Redis;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

public static class RedisCache
{
    // 静态构造函数预配置线程池,解决高并发下线程冷启动延迟
    static RedisCache()
    {
        // 根据服务器性能调整最小线程数,避免IO/Worker线程不足
        ThreadPool.SetMinThreads(100, 100);
    }

    private static readonly Lazy<ConnectionMultiplexer> _connection = new Lazy<ConnectionMultiplexer>(() =>
    {
        var configBuilder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        
        var config = configBuilder.Build();
        var redisConfig = config.GetSection("RedisConfig");
        
        // 使用ConfigurationOptions精细化配置高并发参数
        var options = new ConfigurationOptions
        {
            EndPoints = { redisConfig["Redis"] },
            ClientName = redisConfig["ApplicationName"],
            DefaultDatabase = int.Parse(redisConfig["DatabaseId"]),
            Ssl = bool.Parse(redisConfig["Ssl"]),
            ConnectTimeout = int.Parse(redisConfig["ConnectionTimeoutInMilliseconds"]),
            ConnectRetry = int.Parse(redisConfig["ConnectRetry"]),
            AsyncTimeout = 10000, // 缩短异步超时,避免请求堆积
            SyncTimeout = 10000,  // 同步超时调优,高并发下过长超时会加剧阻塞
            AbortOnConnectFail = false,
            MaxConnectRetry = 5,
            PooledSocketTimeout = 5000, // 池化Socket超时优化
            WriteBuffer = 1024 * 1024, // 增大写入缓冲区,解决输出缓冲区超时问题
            AllowAdmin = false
        };

        // 添加连接状态监控,便于排查线上问题
        options.ConnectionFailed += (sender, args) => 
        {
            // 此处可添加日志记录逻辑
        };

        options.ConnectionRestored += (sender, args) => 
        {
            // 此处可添加日志记录逻辑
        };

        return ConnectionMultiplexer.Connect(options);
    });

    public static IDatabase Database => _connection.Value.GetDatabase();

    // 封装异步操作方法,强制高并发场景下使用异步调用提升吞吐量
    public static async Task<string> GetStringAsync(string key)
    {
        return await Database.StringGetAsync(key);
    }

    public static async Task<bool> SetStringAsync(string key, string value, TimeSpan? expiry = null)
    {
        return await Database.StringSetAsync(key, value, expiry);
    }
}

核心优化点

  • 线程池预配置:静态构造函数中设置线程池最小线程数,避免高并发场景下线程池冷启动导致的请求阻塞。
  • 参数精细化调优:缩短同步/异步超时时间,增大写入缓冲区,解决原错误中的“消息写入输出缓冲区前超时”问题。
  • 连接复用强化:保持ConnectionMultiplexer单例特性,避免重复创建连接消耗Redis服务器资源。
  • 异步优先设计:封装常用异步方法,避免上层误用同步调用导致的线程阻塞。
  • 监控机制添加:连接失败/恢复事件便于快速定位生产环境中的连接异常。

内容的提问来源于stack exchange,提问作者user9673570

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:42:32