Пример #1
0
        public ResponseData DoMutiCmd(RequestType type, params object[] @params)
        {
            lock (_syncLocker)
            {
                List <string> list = new List <string>();

                var arr = type.ToString().Split("_");

                list.AddRange(arr);

                if (@params != null)
                {
                    foreach (var item in @params)
                    {
                        list.Add(item.ToString());
                    }
                }
                RedisCoder.CoderByParams(type, list.ToArray());
                var result = RedisCoder.Decoder();
                if (result.Type == ResponseType.Redirect)
                {
                    return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoCluster, type, @params));
                }
                else if (result.Type == ResponseType.Error)
                {
                    throw new Exception(result.Data);
                }
                else
                {
                    return(result);
                }
            }
        }
Пример #2
0
        public ResponseData DoClusterSetSlot(RequestType type, string action, int slot, string nodeID)
        {
            lock (_syncLocker)
            {
                List <string> list = new List <string>();

                var arr = type.ToString().Split("_");

                list.AddRange(arr);

                list.Add(slot.ToString());

                list.Add(action);

                list.Add(nodeID);

                RedisCoder.CoderByParams(type, list.ToArray());

                var result = RedisCoder.Decoder();

                if (result.Type == ResponseType.Redirect)
                {
                    return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoClusterSetSlot, type, action, slot, nodeID));
                }
                else if (result.Type == ResponseType.Error)
                {
                    throw new Exception(result.Data);
                }
                else
                {
                    return(result);
                }
            }
        }
Пример #3
0
        public async Task <ResponseData> DoBatchWithIDKeysAsync(TimeSpan timeSpan, RequestType type, string id, params string[] keys)
        {
            return(await TaskHelper.Run(() =>
            {
                lock (_syncLocker)
                {
                    id.KeyCheck();
                    keys.KeyCheck();

                    List <string> list = new List <string>();
                    list.Add(type.ToString());
                    list.Add(id);
                    list.AddRange(keys);
                    RedisCoder.CoderByParams(type, list.ToArray());
                    var result = RedisCoder.Decoder();
                    if (result.Type == ResponseType.Redirect)
                    {
                        return (ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoBatchWithIDKeys, type, id, keys);
                    }
                    else
                    {
                        return result;
                    }
                }
            }).WithCancellationTimeout(timeSpan));
        }
Пример #4
0
 public void DoSub(string[] channels, Action <string, string> onMsg)
 {
     lock (_syncLocker)
     {
         List <string> list = new List <string>();
         list.Add(RequestType.SUBSCRIBE.ToString());
         list.AddRange(channels);
         var cmd = RedisCoder.CoderByParams(RequestType.SUBSCRIBE, list.ToArray());
         Request(cmd);
         RedisCoder.IsSubed = true;
         while (RedisCoder.IsSubed)
         {
             var result = RedisCoder.Decoder();
             if (result.Type == ResponseType.Sub)
             {
                 var arr = result.Data.ToArray(false, Environment.NewLine);
                 onMsg.Invoke(arr[0], arr[1]);
             }
             if (result.Type == ResponseType.UnSub)
             {
                 break;
             }
         }
     }
 }
Пример #5
0
        /// <summary>
        /// 发送,
        /// 命令行模式
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="timeSpan"></param>
        /// <returns></returns>
        internal async Task <ResponseData> RequestWithConsoleAsync(string cmd, TimeSpan timeSpan)
        {
            return(await TaskHelper.Run(() =>
            {
                lock (_syncLocker)
                {
                    ResponseData result = new ResponseData()
                    {
                        Type = ResponseType.Empty, Data = "未知的命令"
                    };
                    try
                    {
                        if (!string.IsNullOrWhiteSpace(cmd))
                        {
                            var @params = cmd.Split(" ", StringSplitOptions.RemoveEmptyEntries);

                            if (@params != null && @params.Length > 0)
                            {
                                var redisCmd = @params[0].ToUpper();

                                if (EnumHelper.GetEnum(redisCmd, out RequestType requestType1))
                                {
                                    RedisCoder.CoderByParams(requestType1, @params);
                                    result = RedisCoder.Decoder();
                                }
                                else
                                {
                                    redisCmd = $"{@params[0]}_{@params[1]}".ToUpper();

                                    if (EnumHelper.GetEnum(redisCmd, out RequestType requestType2))
                                    {
                                        RedisCoder.CoderByParams(requestType2, @params);
                                        result = RedisCoder.Decoder();
                                    }
                                    else
                                    {
                                        result.Type = ResponseType.Error;
                                        result.Data = "未知的命令 cmd:" + cmd;
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        result.Type = ResponseType.Error;
                        result.Data = ex.Message;
                    }
                    return result;
                }
            }).WithCancellationTimeout(timeSpan));
        }
Пример #6
0
 /// <summary>
 /// 发送命令
 /// </summary>
 /// <param name="cmd"></param>
 public ResponseData Do(RequestType type)
 {
     lock (_syncLocker)
     {
         RedisCoder.CoderByParams(type, type.ToString());
         var result = RedisCoder.Decoder();
         if (result.Type == ResponseType.Redirect)
         {
             return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.Do, null));
         }
         else
         {
             return(result);
         }
     }
 }
Пример #7
0
 /// <summary>
 /// 发送命令
 /// </summary>
 /// <param name="type"></param>
 /// <param name="timeSpan"></param>
 /// <returns></returns>
 public async Task <ResponseData> DoAsync(RequestType type, TimeSpan timeSpan)
 {
     return(await TaskHelper.Run(() =>
     {
         lock (_syncLocker)
         {
             RedisCoder.CoderByParams(type, type.ToString());
             var result = RedisCoder.Decoder();
             if (result.Type == ResponseType.Redirect)
             {
                 return (ResponseData)OnRedirect.Invoke(result.Data, OperationType.Do, null);
             }
             else
             {
                 return result;
             }
         }
     }).WithCancellationTimeout(timeSpan));
 }
Пример #8
0
        /// <summary>
        /// 发送,
        /// 命令行模式
        /// </summary>
        /// <param name="cmd"></param>
        /// <returns></returns>
        internal ResponseData RequestWithConsole(string cmd)
        {
            lock (_syncLocker)
            {
                ResponseData result = new ResponseData()
                {
                    Type = ResponseType.Empty, Data = "未知的命令"
                };
                try
                {
                    if (!string.IsNullOrWhiteSpace(cmd))
                    {
                        var @params = cmd.Split(" ", StringSplitOptions.RemoveEmptyEntries);

                        if (@params != null && @params.Length > 0)
                        {
                            var redisCmd = @params[0].ToUpper();

                            if (EnumHelper.GetEnum(redisCmd, out RequestType requestType))
                            {
                                RedisCoder.CoderByParams(requestType, @params);
                                result = RedisCoder.Decoder();
                            }
                            else
                            {
                                result.Type = ResponseType.Error;
                                result.Data = "未知的命令 cmd:" + cmd;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    result.Type = ResponseType.Error;
                    result.Data = ex.Message;
                }
                return(result);
            }
        }
Пример #9
0
        public ResponseData DoBatchWithIDKeys(RequestType type, string id, params string[] keys)
        {
            lock (_syncLocker)
            {
                id.KeyCheck();
                keys.KeyCheck();

                List <string> list = new List <string>();
                list.Add(type.ToString());
                list.Add(id);
                list.AddRange(keys);
                RedisCoder.CoderByParams(type, list.ToArray());
                var result = RedisCoder.Decoder();
                if (result.Type == ResponseType.Redirect)
                {
                    return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoBatchWithIDKeys, type, id, keys));
                }
                else
                {
                    return(result);
                }
            }
        }
Пример #10
0
        public async Task <ResponseData> DoClusterSetSlotAsync(RequestType type, string action, int slot, string nodeID, TimeSpan timeSpan)
        {
            return(await TaskHelper.Run(() =>
            {
                lock (_syncLocker)
                {
                    List <string> list = new List <string>();

                    var arr = type.ToString().Split("_");

                    list.AddRange(arr);

                    list.Add(slot.ToString());

                    list.Add(action);

                    list.Add(nodeID);

                    RedisCoder.CoderByParams(type, list.ToArray());

                    var result = RedisCoder.Decoder();

                    if (result.Type == ResponseType.Redirect)
                    {
                        return (ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoClusterSetSlot, type, action, slot, nodeID);
                    }
                    else if (result.Type == ResponseType.Error)
                    {
                        throw new Exception(result.Data);
                    }
                    else
                    {
                        return result;
                    }
                }
            }).WithCancellationTimeout(timeSpan));
        }
Пример #11
0
        public async Task <ResponseData> DoMutiCmdAsync(TimeSpan timeSpan, RequestType type, params object[] @params)
        {
            return(await TaskHelper.Run(() =>
            {
                lock (_syncLocker)
                {
                    List <string> list = new List <string>();

                    var arr = type.ToString().Split("_");

                    list.AddRange(arr);

                    if (@params != null)
                    {
                        foreach (var item in @params)
                        {
                            list.Add(item.ToString());
                        }
                    }
                    RedisCoder.CoderByParams(type, list.ToArray());
                    var result = RedisCoder.Decoder();
                    if (result.Type == ResponseType.Redirect)
                    {
                        return (ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoCluster, type, @params);
                    }
                    else if (result.Type == ResponseType.Error)
                    {
                        throw new Exception(result.Data);
                    }
                    else
                    {
                        return result;
                    }
                }
            }).WithCancellationTimeout(timeSpan));
        }