Ejemplo n.º 1
0
            static void EndPipe(IRedisSocket rds, IEnumerable <PipelineCommand> cmds)
            {
                var err = new List <PipelineCommand>();
                var ms  = new MemoryStream();

                try
                {
                    var respWriter = new RespHelper.Resp3Writer(ms, rds.Encoding, rds.Protocol);
                    foreach (var cmd in cmds)
                    {
                        respWriter.WriteCommand(cmd.Command);
                    }

                    if (rds.IsConnected == false)
                    {
                        rds.Connect();
                    }
                    ms.Position = 0;
                    ms.CopyTo(rds.Stream);

                    foreach (var pc in cmds)
                    {
                        pc.RedisResult = rds.Read(pc.IsBytes);
                        pc.Result      = pc.Parse(pc.RedisResult);
                        if (pc.RedisResult.IsError)
                        {
                            err.Add(pc);
                        }
#if net40
#else
                        pc.TrySetResult(pc.Result, pc.RedisResult.IsError ? new RedisServerException(pc.RedisResult.SimpleError) : null);
#endif
                    }
                }
                finally
                {
                    ms.Close();
                    ms.Dispose();
                }

                if (err.Any())
                {
                    var sb = new StringBuilder();
                    for (var a = 0; a < err.Count; a++)
                    {
                        var cmd = err[a].Command;
                        if (a > 0)
                        {
                            sb.Append("\r\n");
                        }
                        sb.Append(err[a].RedisResult.SimpleError).Append(" {").Append(cmd.ToString()).Append("}");
                    }
                    throw new RedisServerException(sb.ToString());
                }
            }
Ejemplo n.º 2
0
        public bool Connect()
        {
            _redisSocket.Connect(_endPoint);

            if (_redisSocket.Connected)
            {
                OnConnected();
            }

            return(_redisSocket.Connected);
        }
        public bool Connect(int timeout)
        {
            _redisSocket.Connect(_endPoint, timeout);

            if (_redisSocket.Connected)
            {
                OnConnected();
            }

            return(_redisSocket.Connected);
        }
Ejemplo n.º 4
0
 public AsyncRedisSocket(IRedisSocket rds)
 {
     _rds = rds;
     _oldReceiveTimeout  = _rds.ReceiveTimeout;
     _rds.ReceiveTimeout = TimeSpan.Zero;
     if (rds.IsConnected == false)
     {
         rds.Connect();
     }
     StartRead();
 }
Ejemplo n.º 5
0
            static void EndPipe(IRedisSocket rds, IEnumerable <PipelineCommand> cmds)
            {
                var err = new List <PipelineCommand>();
                var ms  = new MemoryStream();

                try
                {
                    foreach (var cmd in cmds)
                    {
                        RespHelper.Write(ms, rds.Encoding, cmd.Command, rds.Protocol);
                    }

                    if (rds.IsConnected == false)
                    {
                        rds.Connect();
                    }
                    ms.Position = 0;
                    ms.CopyTo(rds.Stream);

                    foreach (var pc in cmds)
                    {
                        pc.Command._redisSocket = rds;
                        pc.Result = pc.Parse(pc);
                        if (pc.Command.ReadResult.IsError)
                        {
                            err.Add(pc);
                        }
                    }
                }
                finally
                {
                    ms.Close();
                    ms.Dispose();
                    rds?.Dispose();
                }

                if (err.Any())
                {
                    var sb = new StringBuilder();
                    for (var a = 0; a < err.Count; a++)
                    {
                        var cmd = err[a].Command;
                        if (a > 0)
                        {
                            sb.Append("\r\n");
                        }
                        sb.Append(cmd.ReadResult.SimpleError).Append(" {").Append(cmd.ToString()).Append("}");
                    }
                    throw new RedisException(sb.ToString());
                }
            }
Ejemplo n.º 6
0
        WriteAsyncInfo WriteInQueue(CommandPacket cmd)
        {
            var ret = new WriteAsyncInfo {
                Command = cmd
            };

            if (_rds.ClientReply == ClientReplyType.on)
            {
                ret.TaskCompletionSource = new TaskCompletionSource <RedisResult>();
            }
            var isnew = false;

            lock (_writeAsyncLock)
            {
                _writeQueue.Enqueue(ret);
                if (_isfirst == false)
                {
                    isnew = _isfirst = true;
                }
                if (_bufferStream == null)
                {
                    _bufferStream = new MemoryStream();
                }
                new RespHelper.Resp3Writer(_bufferStream, _rds.Encoding, _rds.Protocol).WriteCommand(cmd);
            }
            if (isnew)
            {
                //Thread.CurrentThread.Join(TimeSpan.FromTicks(1000));
                try
                {
                    if (_rds.IsConnected == false)
                    {
                        _rds.Connect();
                    }
                }
                catch (Exception ioex)
                {
                    lock (_writeAsyncLock)
                    {
                        while (_writeQueue.TryDequeue(out var wq))
                        {
                            wq.TaskCompletionSource?.TrySetException(ioex);
                        }
                        _bufferStream.Close();
                        _bufferStream.Dispose();
                        _bufferStream = null;
                    }
                    _rds.ReleaseSocket();
                    _end(_rds, ioex);
                    throw ioex;
                }

                for (var a = 0; a < 100; a++)
                {
                    var cou = _writeQueue.Count;
                    if (cou > 100)
                    {
                        break;
                    }
                }
                var localQueue = new Queue <WriteAsyncInfo>();
                long localQueueThrowException(Exception exception)
                {
                    long counter = 0;

                    while (localQueue.Any())
                    {
                        var witem = localQueue.Dequeue();
                        if (exception != null)
                        {
                            witem.TaskCompletionSource?.TrySetException(exception);
                        }
                        else
                        {
                            witem.TaskCompletionSource?.TrySetCanceled();
                        }
                        counter = Interlocked.Decrement(ref _writeCounter);
                    }
                    return(counter);
                }

                var iswait = _writeCounter > 1;
                if (iswait)
                {
                    Thread.CurrentThread.Join(10);
                }
                _begin();
                while (true)
                {
                    if (_writeQueue.Any() == false)
                    {
                        Thread.CurrentThread.Join(10);
                        continue;
                    }
                    lock (_writeAsyncLock)
                    {
                        while (_writeQueue.TryDequeue(out var wq))
                        {
                            localQueue.Enqueue(wq);
                        }
                        _bufferStream.Position = 0;
                        try
                        {
                            _bufferStream.CopyTo(_rds.Stream);
                            _bufferStream.Close();
                            _bufferStream.Dispose();
                            _bufferStream = null;
                        }
                        catch (Exception ioex)
                        {
                            localQueueThrowException(ioex);
                            _bufferStream.Close();
                            _bufferStream.Dispose();
                            _bufferStream = null;
                            _rds.ReleaseSocket();
                            _end(_rds, ioex);
                            throw ioex;
                        }
                    }
                    long        counter = 0;
                    RedisResult rt      = null;
                    //sb.AppendLine($"{name} 线程{Thread.CurrentThread.ManagedThreadId}:合并读取 {localQueue.Count} 个命令 total:{sw.ElapsedMilliseconds} ms");
                    while (localQueue.Any())
                    {
                        var witem = localQueue.Dequeue();
                        try
                        {
                            rt = _rds.Read(false);
                        }
                        catch (Exception ioex)
                        {
                            localQueueThrowException(ioex);
                            _rds.ReleaseSocket();
                            _end(_rds, ioex);
                            throw ioex;
                        }
                        witem.TaskCompletionSource.TrySetResult(rt);
                        counter = Interlocked.Decrement(ref _writeCounter);
                    }
                    if (counter == 0 && _finish())
                    {
                        break;
                    }
                    Thread.CurrentThread.Join(1);
                    //sb.AppendLine($"{name} 线程{Thread.CurrentThread.ManagedThreadId}:等待 1ms + {_writeQueue.Count} total:{sw.ElapsedMilliseconds} ms");
                }
                //sb.AppendLine($"{name} 线程{Thread.CurrentThread.ManagedThreadId}:退出 total:{sw.ElapsedMilliseconds} ms");
                _end(_rds, null);
            }
            return(ret);
        }