1. 程式人生 > >.net core 下使用StackExchange的Redis庫訪問超時解決

.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時,超時設定非常大也解決不了。

引用連結

  1. 口袋程式碼倉庫
  2. 線上計算器
  3. 本節原始碼:github