繁体   English   中英

如何使用StackExchange.Redis解决客户端的Redis超时问题?

[英]How to solve a Redis timeout on client side with StackExchange.Redis?

我在ac#wcf应用程序中使用StackExchange.Redis客户端:我仅使用sync命令来获取和设置值。 问题是我有一个好奇的日志超时:

Timeout performing EXISTS DataKey:50, 
inst: 1, queue: 1, qu: 0, qs: 1, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: Machine1, 
serverEndpoint: redis-server:6381, keyHashSlot: 7984, 
IOCP: (Busy=1,Free=799,Min=8,Max=800), 
WORKER: (Busy=5,Free=795,Min=8,Max=800) 
(Please take a look at this article for some common client-side issues that can 
cause timeouts: http://stackexchange.github.io/StackExchange.Redis/Timeouts) 

如果我正确理解,那意味着我的get值已排队,因为有五个工作线程? 使用netstat,我看到我的应用程序正在打开到服务器的两个物理连接。 我确保线程池中有足够的可用线程。 在我的连接设置中,我有一个syncTimeout = 3000 ...如果使用redis-cli,则可以在0.64秒内获得密钥的值。

有人可以帮忙吗? 我能做什么? 我是否必须一直在代码中使用async或找到另一个redis客户端库?

有一些解决方案。 首先,他们在github仓库上有关于他们提出的解决方案的文章,可在此处找到。

我发现,尽管您会尽可能多地使用异步功能,但只有同步功能会超时。 在我看来,超时是他们自己的设计决策,是基于这样的想法:如果出现问题,他们不想阻塞您的代码。 我不购买,所以我使用的解决方法是使用异步功能,然后等待任务。 因此,我只是执行db.StringGetAsync("thestring").Result而不是db.StringGet("thestring") db.StringGetAsync("thestring").Result 也就是说,无论出于何种原因我都无法使用await。

无论如何,您可能想尽可能多地使用异步/等待。 如果合适的话,您可能还想使用FireAndForget。 您也可以使用ContinueWith。 他们在这里谈论这些解决方案。

从“工作人员:(忙碌= 5,免费= 795,最小= 8,最大= 800)”中,我看到有5个忙碌工作线程,最少只有8个工作线程。 我怀疑如果查看收到的全部错误,在某些情况下可能会发现“忙”大于“最小”计数。 这将表明线程池正在节流 该链接还提供了一些有关增加Worker和IOCP线程的最小线程数的解决方案。

修复RedisTimeout异常总是一个挑战,有许多因素导致超时异常,

在您的日志中,您可以看到IOCP线程有1繁忙线程,并且您的系统配置为允许8最小线程。 所以不是这样,因为1不是> 8

一旦遇到相同的情况,并通过增加连接字符串中的syncTimeout来修复超时异常,则可以尝试增加它

我还意识到打开的连接数会影响Redis的性能,您可以通过运行以下命令查看打开的连接

info clients

抛出超时异常时,我大约有90个打开的连接,我重新启动服务器以重置打开的连接,并且超时异常消失了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM