Пример #1
0
        protected TValue Call <TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
        {
            _redisSocket.Write(cmd);
            var rt = _redisSocket.Read(false);

            return(parse(rt));
        }
        protected T2 Call <T1, T2>(CommandPacket cmd, Func <RedisResult <T1>, T2> parse)
        {
            _redisSocket.Write(cmd);
            var result = cmd.Read <T1>();

            return(parse(result));
        }
Пример #3
0
        protected TValue Call <TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
        {
            _redisSocket.Write(cmd);
            var result = cmd.Read <string>();

            return(parse(result));
        }
Пример #4
0
            public override TValue AdapaterCall <TReadTextOrStream, TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
            {
                _redisSocket.Write(cmd);
                var rt = cmd.Read <TReadTextOrStream>();

                rt.IsErrorThrow = TopOwner._isThrowRedisSimpleError;
                return(parse(rt));
            }
Пример #5
0
 public override TValue AdapterCall <TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
 {
     TryMulti();
     return(TopOwner.LogCall(cmd, () =>
     {
         _redisSocket.Write(cmd);
         _redisSocket.Read(cmd._flagReadbytes).ThrowOrValue <TValue>(useDefaultValue: true);
         _commands.Add(new TransactionCommand
         {
             Command = cmd,
             Parse = obj => parse(new RedisResult(obj, true, RedisMessageType.SimpleString)
             {
                 Encoding = _redisSocket.Encoding
             })
         });
         return default(TValue);
     }));
 }
Пример #6
0
 public override TValue AdapaterCall <TReadTextOrStream, TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
 {
     TryMulti();
     return(TopOwner.LogCall(cmd, () =>
     {
         _redisSocket.Write(cmd);
         cmd.Read <TReadTextOrStream>().ThrowOrValue <TValue>();
         cmd._readed = false; //exec 还需要再读一次
         _commands.Add(new TransactionCommand
         {
             Command = cmd,
             Parse = obj => parse(new RedisResult(obj, true, RedisMessageType.SimpleString)
             {
                 Encoding = _redisSocket.Encoding
             })
         });
         return default(TValue);
     }));
 }
 public override T2 AdapaterCall <T1, T2>(CommandPacket cmd, Func <RedisResult <T1>, T2> parse)
 {
     return(_cli.LogCall(cmd, () =>
     {
         _redisSocket.Write(cmd);
         var rt = cmd.Read <T1>();
         rt.IsErrorThrow = _cli._isThrowRedisSimpleError;
         return parse(rt);
     }));
 }
 public override T2 AdapaterCall <T1, T2>(CommandPacket cmd, Func <RedisResult <T1>, T2> parse)
 {
     TryMulti();
     return(_cli.LogCall(cmd, () =>
     {
         _redisSocket.Write(cmd);
         cmd.Read <T1>().ThrowOrValue();
         cmd._readed = false; //exec 还需要再读一次
         _commands.Add(new TransactionCommand
         {
             Command = cmd,
             Parse = obj => parse(new RedisResult <T1>(obj.ConvertTo <T1>(), null, true, RedisMessageType.SimpleString)
             {
                 Encoding = _redisSocket.Encoding
             })
         });
         return default(T2);
     }));
 }
Пример #9
0
 public override TValue AdapterCall <TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
 {
     return(TopOwner.LogCall(cmd, () =>
     {
         _redisSocket.Write(cmd);
         var rt = _redisSocket.Read(cmd);
         if (cmd._command == "QUIT")
         {
             _redisSocket.ReleaseSocket();
         }
         return parse(rt);
     }));
 }
Пример #10
0
 public override TValue AdapterCall <TValue>(CommandPacket cmd, Func <RedisResult, TValue> parse)
 {
     return(TopOwner.LogCall(cmd, () =>
     {
         _redisSocket.Write(cmd);
         var rt = _redisSocket.Read(cmd._flagReadbytes);
         if (cmd._command == "QUIT")
         {
             _redisSocket.ReleaseSocket();
         }
         rt.IsErrorThrow = TopOwner._isThrowRedisSimpleError;
         return parse(rt);
     }));
 }
Пример #11
0
 internal void Call(CommandPacket cmd)
 {
     _topOwner.LogCall <object>(cmd, () =>
     {
         if (IsSubscribed == false)
         {
             throw new RedisClientException($"Subscription not opened, unable to execute");
         }
         if (_stoped == false && _redisSocket?.IsConnected == true)
         {
             lock (_lock)
                 _redisSocket?.Write(cmd);
         }
         return(null);
     });
 }
Пример #12
0
 internal void Call(CommandPacket cmd)
 {
     _topOwner.LogCall <object>(cmd, () =>
     {
         if (_redisSocket != null)
         {
             lock (_lock)
                 if (_redisSocket != null)
                 {
                     _redisSocket.Write(cmd);
                 }
         }
         if (_redisSocket == null)
         {
             throw new Exception($"Subscription not opened, unable to execute");
         }
         return(null);
     });
 }
Пример #13
0
            internal IDisposable Subscribe(bool psub, string[] channels, Action <string, string, object> handler)
            {
                if (_stoped)
                {
                    return(new PubSubSubscribeDisposable(this, null));
                }
                channels = channels?.Distinct().Where(a => !string.IsNullOrEmpty(a)).ToArray(); //In case of external modification
                if (channels?.Any() != true)
                {
                    return(new PubSubSubscribeDisposable(this, null));
                }

                var id      = Guid.NewGuid();
                var time    = DateTime.Now;
                var regkeys = channels.Select(a => psub ? $"{_psub_regkey_prefix}{a}" : a).ToArray();

                for (var a = 0; a < regkeys.Length; a++)
                {
                    ConcurrentDictionary <Guid, RegisterInfo> dict = null;
                    lock (_lock) dict = _registers.GetOrAdd(regkeys[a], k1 => new ConcurrentDictionary <Guid, RegisterInfo>());
                    dict.TryAdd(id, new RegisterInfo(id, handler, time));
                }
                lock (_lock)
                    _cancels.TryAdd(id, regkeys);
                var isnew = false;

                if (IsSubscribed == false)
                {
                    lock (_lock)
                    {
                        if (IsSubscribed == false)
                        {
                            _redisSocket = _topOwner.Adapter.GetRedisSocket(null);
                            IsSubscribed = isnew = true;
                        }
                    }
                }
                if (isnew)
                {
                    new Thread(() =>
                    {
                        _redisSocketReceiveTimeoutOld = _redisSocket.ReceiveTimeout;
                        _redisSocket.ReceiveTimeout   = TimeSpan.Zero;
                        var timer = new Timer(state =>
                        {
                            _topOwner.Adapter.Refersh(_redisSocket); //防止 IdleBus 超时回收
                            try { _redisSocket.Write("PING"); } catch { }
                        }, null, 10000, 10000);
                        var readCmd = "PubSubRead".SubCommand(null).FlagReadbytes(false);
                        while (_stoped == false)
                        {
                            RedisResult rt = null;
                            try
                            {
                                rt = _redisSocket.Read(readCmd);
                            }
                            catch
                            {
                                Thread.CurrentThread.Join(100);
                                if (_cancels.Any())
                                {
                                    continue;
                                }
                                break;
                            }
                            var val = rt.Value as object[];
                            if (val == null)
                            {
                                continue;              //special case
                            }
                            var val1 = val[0].ConvertTo <string>();
                            switch (val1)
                            {
                            case "pong":
                            case "punsubscribe":
                            case "unsubscribe":
                                continue;

                            case "pmessage":
                                OnData(val[1].ConvertTo <string>(), val[2].ConvertTo <string>(), val[3]);
                                continue;

                            case "message":
                                OnData(null, val[1].ConvertTo <string>(), val[2]);
                                continue;
                            }
                        }
                        timer.Dispose();
                        lock (_lock)
                        {
                            IsSubscribed = false;
                            _redisSocket.ReceiveTimeout = _redisSocketReceiveTimeoutOld;
                            _redisSocket.ReleaseSocket();
                            _redisSocket.Dispose();
                            _redisSocket = null;
                        }
                    }).Start();
                }
                Call((psub ? "PSUBSCRIBE" : "SUBSCRIBE").Input(channels));
                return(new PubSubSubscribeDisposable(this, () => Cancel(id)));
            }