1

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
    }
4

1 に答える 1

2

複数のスレッドから同じ Redis 接続を同時に使用している可能性があります。両方のスレッドが同時にコマンドを送信したり、応答を待機したりする可能性があります。これが発生すると、一方のスレッドが他方のスレッド宛てのデータを受け取ります。これにより、エラーが発生します。

( ごとに 1 つのクライアントではなく) スレッドごとに 1 つの Redis クライアントを使用する場合ImpresstionQueueService、各スレッドは互いに干渉することなく同時にコマンドを送信できます。

または、単一のリクエスト (エラーの場所のすぐ上でコメントアウトしたもの) のためだけにクライアントを作成することもできます。この代替方法の欠点は、毎回新しい接続のオーバーヘッドが発生することです (これは、大きいか小さいか、または目立たない可能性があります)。

于 2011-04-06T23:04:04.557 に答える