StackExchange.Redis的timeout问题

最近在使用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的timeout问题_第1张图片

StackExchange.Redis的timeout问题_第2张图片

StackExchange.Redis的timeout问题_第3张图片

总结:使用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

你可能感兴趣的:(Redis)