簡體   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