2016-09-16 22 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

相关问题