2016-09-16 24 views
-1

我在多線程環境下批量創建Redis dB中的密鑰,出於某種原因在我的ASP .NET MVC Web應用程序。
而我爲redis客戶端使用ServiceStack.Redis批量在Redis C#中創建密鑰 - SocketException:通常只允許使用每個套接字地址(協議/網絡地址/端口)

我創建了所有必需的Redis的操作,即把一個靜態類,得到..
在靜態類,我創建的Redis正在爲其配置一旦通話結束每次調用一個新的實例(使用使用
代碼是這樣:

for (int i = 0; i < 100000; i++) 
       { 
        using (RedisClient Client = new RedisClient(_ReplicaHost)) 
        { 
         Client.AddItemToSet(key, value); 
        } 
       } 

然而,一段時間後,我獲得以下錯誤:

ServiceStack.Redis.RedisException: could not connect to redis Instance at xxx-xxx.xxxx.0001.use1.cache.amazonaws.com:6379 ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted xxx.xx.x.xxx:6379 
    at System.Net.Sockets.Socket.Connect(IPAddress[] addresses, Int32 port) 
    at System.Net.Sockets.Socket.Connect(String host, Int32 port) 
    at ServiceStack.Redis.RedisNativeClient.Connect() 

我看了看網,發現有可能的原因是插座用盡(reference

由於應用程序的多線程環境下運行我不得不請使用PooledRedisClientManagerBasicRedisClientManager的,但我不是確定在我的案例中選擇哪一個,以及如何實現,不管多個操作如何,都不應該有套接字用盡的問題。

什麼應該是正確的方法/解決方案?

+0

我可以知道downvote的原因嗎? – JerryGoyal

回答

-1

您的計算機上只有有限數量的端口可供所有必須發送和接收網絡數據的進程共享(準確地說是65535) - 當您將出站連接綁定到本地時端口(即使你只指定一個遠程端口,你仍然在使用本地端口) - 假設你只有65535,並且你迭代了10萬次,我建議你捱餓套接字資源的機器,而不是隨時給它收回這些港口。

也許你應該只有一個Redis的客戶端和內環路它:

using (RedisClient Client = new RedisClient(_ReplicaHost)) 
{ 
    for (int i = 0; i < 100000; i++) 
    { 
     Client.AddItemToSet(key, value); 
    } 
} 
+0

我沒有提到它嗎?我在詢問使用單個obect對數百萬個請求的影響。 – JerryGoyal

+0

在這種情況下,您需要給運行時/操作系統時間來回收資源...但是我仍然會建議重新使用客戶端或少數客戶端(通過連接池)是最好的(也是最常見)方法 –

+0

我明白了,但我將在我的web應用程序中使用該對象。所以我很擔心對象可以做多少次調用?並不會有任何超時套接字,如果我不使用對象一段時間? – JerryGoyal

2

不要爲Redis的客戶端在循環每次迭代中創建一個新的實例。使用Redis Manager解決的Redis客戶端的情況下,e.g:

var redisManager = new RedisManagerPool(); 

for (int i = 0; i < 100000; i++) 
{ 
    using (RedisClient Client = redisManager.GetClient()) 
    { 
     Client.AddItemToSet(key, value); 
    } 
} 

但沒有理由爲什麼你需要一個新的客戶端每次迭代和應該只使用相同RedisClient例如,如果這是真正的代碼。

+0

我嘗試在多線程環境下使用單個RedisClient。但是,這並沒有奏效。我得到了「空引用」,「找不到套接字」,「無法連接」等不同的錯誤。 – JerryGoyal

+0

我查看了類似問題http:// stackoverflow上的答案。com/questions/29400937/servicestack-redis-multi-threading-collision並想出我必須使用管理程序池併爲每個請求從該管理程序池創建新客戶機。但是,幾分鐘後每個客戶端都使用一個新的套接字,套接字仍然不會耗盡? – JerryGoyal

+1

@JerryGoyal他們不會因爲連接被釋放回池中而被重複使用而精疲力竭 – mythz

相關問題