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
相关产品推荐
相关产品推荐

