最近在使用StackExchange.Redis的时候,经常出现一个BUG
Timeout performing SET XXX, inst: 27, mgr: ProcessReadQueue, err: never, queue: 3, qu: 0, qs: 3, qc: 0, wr: 0, wq: 0, in: 15, ar: 1, clientName: XXX, serverEndpoint: 192.168.x.x:6379, keyHashSlot: 944, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=4,Free=4091,Min=4,Max=4095) (Please take a look at this article for some common client-side issues that can cause timeouts: http://stackexchange.github.io/StackExchange.Redis/Timeouts)
通过将近一天的查资料和测试,最终得到一个解决办法。
Redis数据库连接的时候把SyncTimeout同步过期时间从默认1秒改成5秒,
连接过期时间从默认5秒改成15秒,响应过期时间改成15秒。其中AbortOnConnectFail在测试时候设不设成false影响不大。
var config = new ConfigurationOptions
{
AbortOnConnectFail = false,
AllowAdmin = true,
ConnectTimeout = 15000,
SyncTimeout = 5000,
ResponseTimeout = 15000,
Password = "Pwd",//Redis数据库密码
EndPoints = { connectionString }// connectionString 为IP:Port 如”192.168.2.110:6379”
};
var connect = ConnectionMultiplexer.Connect(config);
使用LoadRunner在500用户负载测试下,同时进行db.StringSet(key, value)的操作,进行多次测试,共添加200万个Key,没有再报timeout的异常。
总结:使用StackExchange.Redis时候,建议写成单例创建Redis连接的模式,我测试过程中,没写成单例,在负载测试中报错了。由于目前还在使用.NET,所以.NET Core没有进行验证,有空再用笔记本测试下。
服务器配置:
处理器:Intel(R) Core(TM) i7-4790K CPU @ 4.00GHZ 4.00GHZ
内存:32G
系统类型:64位
Redis版本:Redis-x64-3.2.100
StackExchange.Redis版本:1.2.6.0
.NET版本:.NET Framework 4.6
转载请标明原文链接:https://mp.csdn.net/postedit/84069184