Неизвестная ошибка команды при использовании многопоточности для установки redis - PullRequest
1 голос
/ 11 марта 2011

Я использую 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 Ответ

2 голосов
/ 07 апреля 2011

Возможно, вы используете одно и то же соединение Redis одновременно из нескольких потоков.Оба потока могут одновременно отправлять команды или ждать ответов.Когда это происходит, один поток получает данные, предназначенные для другого потока.Это приводит к вашей ошибке.

Если вы используете один клиент Redis на поток (вместо одного клиента на ImpresstionQueueService), каждый поток может отправлять команды одновременно, не мешая друг другу.

В качестве альтернативы, вы можете создать клиента только для одного запроса (который вы закомментировали чуть выше места ошибки).Недостатком этой альтернативы является то, что каждый раз накладываются издержки на новое соединение (которое может быть большим, маленьким или незаметным).

...