码迷,mamicode.com
首页 > Web开发 > 详细

.net core 下使用StackExchange的Redis库访问超时解决

时间:2019-01-18 10:51:51      阅读:494      评论:0      收藏:0      [点我收藏+]

标签:rmi   span   tac   markdown   common   false   线程   operator   ffffff   

原文:.net core 下使用StackExchange的Redis库访问超时解决

问题:并发稍微多的情况下Redis偶尔返回超时

StackExchange的Redis类库,用的较多,但偶尔报的问题非常让人迷惑,访问超时,队列XXX…
问题出在Redis服务器吗?可是其他应用访问都正常啊,难道要把这个类库替换掉?
问题描述如下:

Timeout performing GET keyName, inst: 1, mgr: ExecuteSelect, err: never, queue: 20, qu: 20, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, 
clientName: computerName, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=4,Free=32763,Min=4,Max=32767), 
Local-CPU: unavailable (Please take a look at this article for some common client-side issues that can cause timeouts: 
https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md)

给出了参考网址?

StackExchange给出了这个问题的解释和一般方案?那难道真的是我的工作线程比较多吗?我抱着试试看的态度,自己写了个测试用例:

code = StatusCode.OK;
// ThreadPool.SetMinThreads(200, 200);
 var ts = new List<Task>();
 for (int i = 0; i < 100; i++)
 {
     var a = i;
     var t = new Task(() =>
     {
         var l = this.Context.TryGetLock("123");
         Trace.WriteLine($"{a}:{l!= null}");
         int workerThreads, completionPortThreads;
         ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
         Trace.WriteLine($"Available: WorkerThreads: {workerThreads}, CompletionPortThreads: {completionPortThreads}");
     });
     t.Start();

     ts.Add(t);
 }

 Task.WaitAll(ts.ToArray());
 return null;

问题复现了,就是提示类似错误,把注释ThreadPool.SetMinThreads(200, 200);开启,问题消除。

结论

问题的解决在于启用task后,task入队后导致redis客户端超时,客户端。。。
因此解决的重点在于设置线程池的最小大小:
ThreadPool.SetMinThreads(200, 200);

小备注

之前改过连接超时,稍微改大点,也可以缓解该问题,但仅此而已。

StringBuilder sb = new StringBuilder();
 sb.AppendFormat("{0}:{1}", cfg.Server, cfg.Port);
   sb.AppendFormat(",allowAdmin={0}", cfg.AllowAdmin);
   sb.AppendFormat(",abortConnect=false,connectRetry=3,syncTimeout=2500");
   sb.AppendFormat(",connectTimeout={0}", cfg.ConnectTimeout>0?cfg.ConnectTimeout:5000);
   if (cfg.Ssl)
   {
       // sb.AppendFormat(",ssl={0},password={1}", cfg.Ssl,cfg.Pwd);
       sb.AppendFormat(",password={1}", cfg.Ssl, cfg.Pwd);
   }

syncTimeout :超时会影响redis取值的超时,但是开多个task时,超时设置非常大也解决不了。


在此我向大家推荐一个微服务架构学习交流群。交流学习群号:864759589 里面会分享一些资深架构师录制的视频录像:高并发、高性能、分布式、微服务架构的原理,分布式架构等这些成为架构师必备的知识体系。
技术分享图片


引用链接

  1. 口袋代码仓库
  2. 在线计算器
  3. 本节源码:github

.net core 下使用StackExchange的Redis库访问超时解决

标签:rmi   span   tac   markdown   common   false   线程   operator   ffffff   

原文地址:https://www.cnblogs.com/lonelyxmas/p/10286309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!