.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时,超时设置非常大也解决不了。
在此我向大家推荐一个微服务架构学习交流群。交流学习群号:864759589 里面会分享一些资深架构师录制的视频录像:高并发、高性能、分布式、微服务架构的原理,分布式架构等这些成为架构师必备的知识体系。

引用链接
.net core 下使用StackExchange的Redis库访问超时解决的更多相关文章
- ubuntu下使用python3的有些库时,解决"raise ImportError(str(msg) + ', please install the python3-tk package') ImportError: No module named '_tkinter', please install the python3-tk package"的错误
问题: 在Ubuntu下使用matplotlib这个库时,运行时出现如下错误: raise ImportError(str(msg) + ', please install the python3-t ...
- win10 下oracle tns通过IP无法访问的解决办法
在Oracle安装目录下\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN下找到listener.ora文件,编辑对应项为: LISTE ...
- .net core Redis库 CSRedis
由于servicestack.redis收费,基于有人说StackExchange.Redis 使用会出现一些问题比如会超时, 找到了CSRedis这个库,很强大很实用.另外有兴趣的朋友还可以试试另一 ...
- .net core 下的分布式事务锁
原文:.net core 下的分布式事务锁 目录 系统分布式锁的用法 锁的实现 锁的使用 API内的范例: 引用链接 系统分布式锁的用法 公司框架新增功能分布式锁: 锁的性能之王: 缓存 > Z ...
- .net core 下监控Sql的执行语句
原文:.net core 下监控Sql的执行语句 最近在编写.net core程序,因为数据库从Sql Server 切换到 MySql的原因,无法直接查看sql的具体语句,随着业务量的剧增,痛苦也与 ...
- .Net Core下如何管理配置文件
一.前言 根据该issues来看,System.Configuration在.net core中已经不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XX ...
- [redis] windwos下安装和使用redis
一篇很好的入门学习文章:Redis学习 Redis是一种nosql数据库,在开发中常用做缓存. 1.下载地址: 低版本下载地址:https://github.com/dmajkic/redis/dow ...
- .Net Core下如何管理配置文件(转载)
原文地址:http://www.cnblogs.com/yaozhenfa/p/5408009.html 一.前言 根据该issues来看,System.Configuration在.net core ...
- Net Core下多种ORM框架特性及性能对比
在.NET Framework下有许多ORM框架,最著名的无外乎是Entity Framework,它拥有悠久的历史以及便捷的语法,在占有率上一路领先.但随着Dapper的出现,它的地位受到了威胁,本 ...
随机推荐
- [React] Render Text Only Components in React 16
In this session we create a comment component to explore how to create components that only render t ...
- 有关Canvas的一点小事—canvas数据和像素点
1. canvas生成base64数据 canvas.toDataURL()生成的数据可以直接给image对象使用作为<img>显示在前端,也可以传给后台生成图片保存.前端生成保存图片的 ...
- loadrunner--设置代理录制
为了解决loadrunner录制不到脚本或录制经常无响应等情况,可以选用代理录制方式,步骤如下. 打开配置好代理的浏览器,输入要录制的服务器ip,开始操作,录制完成后点击Shutdown
- 2017.1-TOP5 Android开源库
Colorful (Github) Colorful简单实用,通过这个开源库可以通过编码的方式来改变应用的主题,不再需要定义不同的style dependencies { compile 'com.g ...
- WCF学习笔记——对象序列化
当试图通过Web服务.WCF这样的远程处理技术将一个对象复制到远端时,具有对类型序列化的能力很关键. 一 序列化基础 序列化描述了持久化或传输一个对象的状态到流的过程(.NET将对象序列化到流,流是字 ...
- apache与IIS共用80端口冲突解决方法
如果同一台电脑安装了apache和iis,会提示80端口冲突,如何解决apache与iis 80端口冲突的问题呢,并且同时使用apache和iis 将apache设为使用80端口,IIS使用其它端口, ...
- RTC时钟和BKP的配置stm32
摘自:https://blog.csdn.net/gtkknd/article/details/52233605 RTC和后备寄存器通过一个开关供电,在VDD有效的时候选择VDD供电,否则选择VBAT ...
- php 获取数组第一个key 第一个键值对 等等
PHP 获取数组中的第一个元素或最后一个元素的值或者键值可以使用 PHP 自带的数组函数. PHP 获取数组中的第一个元素的值或者键值所使用的函数: current() - 返回数组中当前元素值(即: ...
- 【习题 5-7 UVA - 12100】Printer Queue
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用队列和multiset就能完成模拟 [代码] #include <bits/stdc++.h> using names ...
- iTestin云测工具
软件概述 iTestin是免费服务移动App开发者的真机自动化云测试客户端工具.基于真实的智能终端设备录制一个测试脚本然后运行,并输出运行结果.覆盖Android和iOS两大设备平台,支持Pad/Ph ...