我正在使用ServiceStack.Redis C#客户端与Redis交谈。
只需很少的请求一切正常,但当我 LoadRunner 请求它或使用多线程发出请求时,我会收到一些错误,说我正在使用错误的命令。
我检查错误,似乎它切断了命令,或者它搞乱了。
这是我的代码,非常简单。有人遇到过这个问题吗?当我使用多线程调用Push方法时会发生错误。
public class ImpresstionQueueService : IQueueService<InsertImpressionRequest>
{
private string _queueName;
private string _host;
private static IRedisClient redisClient = new RedisClient(ConfigHost);
private static string ConfigHost
{
get
{
return ConfigurationManager.AppSettings.Get("redis_host");
}
}
private string Host
{
get
{
if (!string.IsNullOrEmpty(_host))
return _host;
else
{
return ConfigurationManager.AppSettings.Get("redis_host");
}
}
}
public ImpresstionQueueService(string queue_name)
{
this._queueName = queue_name;
}
public ImpresstionQueueService(string host, string queu_name)
{
this._queueName = queu_name;
this._host = host;
}
#region IQueueService<InsertImpressionRequest> Members
class testData
{
}
public int Push(InsertImpressionRequest value)
{
try
{
//using (var redisClient = new RedisClient(this.Host))
{
//ser
string ser_value = TypeSerializer.SerializeToString<InsertImpressionRequest>(value);
//push
redisClient.AddItemToList(this._queueName, ser_value);//here will be error
}
}
catch (Exception ex)
{
HLogger.GetLogger("RedisLogger").Error(ex.Message + ex.StackTrace);
}
//throw new NotImplementedException();
return 1;
}
public InsertImpressionRequest Pop()
{
InsertImpressionRequest request = null;
//using (var redisClient = new RedisClient(this.Host))
{
string pop_string_value = redisClient.PopItemFromList(this._queueName);
//deseri
if (pop_string_value != null)
{
request = TypeSerializer.DeserializeFromString<InsertImpressionRequest>(pop_string_value);
}
}
return request;
}
#endregion
}
答案 0 :(得分:2)
您可能同时从多个线程使用相同的Redis连接。两个线程都可能发送命令或同时等待回复。发生这种情况时,一个线程接收用于另一个线程的数据。这会导致您的错误。
如果每个线程使用一个Redis客户端(而不是每个ImpresstionQueueService
一个客户端),则每个线程可以同时发送命令而不会相互干扰。
或者,您可以仅针对单个请求(您在错误位置上方注释掉)创建客户端。这种替代方案的缺点是每次都有新连接的开销(可能很大或很小或不明显)。