Неизвестная ошибка команды при использовании многопоточности для установки redis
Я использую клиент 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
}
1 ответ
Возможно, вы используете одно и то же соединение Redis одновременно из нескольких потоков. Оба потока могут отправлять команды или ожидать ответов одновременно. Когда это происходит, один поток получает данные, предназначенные для другого потока. Это вызывает вашу ошибку.
Если вы используете один клиент Redis на поток (вместо одного клиента на ImpresstionQueueService
), каждый поток может отправлять команды одновременно, не мешая друг другу.
Кроме того, вы можете создать клиент только для одного запроса (который вы закомментировали чуть выше места ошибки). Недостатком этой альтернативы является то, что каждый раз накладываются издержки на новое соединение (которое может быть большим, маленьким или незаметным).