.net core 下使用StackExchange的Redis库访问超时解决
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                .net core 下使用StackExchange的Redis库访问超时解决
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                問題:并發稍微多的情況下Redis偶爾返回超時
StackExchange的Redis類庫,用的較多,但偶爾報的問題非常讓人迷惑,訪問超時,隊列XXX…
問題出在Redis服務器嗎?可是其他應用訪問都正常啊,難道要把這個類庫替換掉?
問題描述如下:
給出了參考網址?
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時,超時設置非常大也解決不了。
總結
以上是生活随笔為你收集整理的.net core 下使用StackExchange的Redis库访问超时解决的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: WPF实现统计图(饼图仿LiveChar
- 下一篇: .NET Core授权失败如何自定义响应
