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.Coder(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; } } } }
public ResponseData DoInOne(RequestType type, string content) { var cmd = RedisCoder.Coder(type, type.ToString(), content); Request(cmd); return(RedisCoder.Decoder()); }
/// <summary> /// 用于不会迁移的命令 /// </summary> /// <param name="type"></param> /// <param name="content"></param> /// <returns></returns> public ResponseData <string> DoWithOne(RequestType type, string content) { content.KeyCheck(); ResponseData <string> result = new ResponseData <string>() { Type = ResponseType.Empty, Data = "未知的命令" }; try { lock (SyncRoot) { using (var cts = new CancellationTokenSource(_actionTimeout)) { RedisCoder.Request(type, content); return(RedisCoder.Decoder <string>(type, cts.Token)); } } } catch (TaskCanceledException tex) { result.Type = ResponseType.Error; result.Data = "Action Timeout"; } catch (Exception ex) { result.Type = ResponseType.Error; result.Data = ex.Message; } return(result); }
public void DoSub(string[] channels, Action <string, string> onMsg) { lock (_syncLocker) { RedisCoder.Request(RequestType.SUBSCRIBE, channels); RedisCoder.IsSubed = true; TaskHelper.Run(() => { while (RedisCoder.IsSubed) { var result = RedisCoder.Decoder(RequestType.SUBSCRIBE); 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; } } }); } }
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); } } }
/// <summary> /// 用于不会迁移的命令 /// </summary> /// <param name="type"></param> /// <param name="content"></param> /// <returns></returns> public ResponseData DoWithOne(RequestType type, string content) { ResponseData result = new ResponseData() { Type = ResponseType.Empty, Data = "未知的命令" }; try { result = TaskHelper.Run((token) => { lock (SyncRoot) { content.KeyCheck(); RedisCoder.Request(type, content); return(RedisCoder.Decoder(type, token)); } }, _actionTimeout).Result; } catch (TaskCanceledException tex) { result.Type = ResponseType.Error; result.Data = "Action Timeout"; } catch (Exception ex) { result.Type = ResponseType.Error; result.Data = ex.Message; } return(result); }
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); } } }
public void DoSub(string[] channels, Action <string, string> onMsg) { RedisCoder.Request(RequestType.SUBSCRIBE, channels); RedisCoder.IsSubed = true; TaskHelper.Run(() => { lock (SyncRoot) { while (RedisCoder.IsSubed) { var result = RedisCoder.Decoder(RequestType.SUBSCRIBE, System.Threading.CancellationToken.None); if (result != null && result.Type == ResponseType.Sub) { var arr = result.Data.ToArray(false, Environment.NewLine); onMsg.Invoke(arr[0], arr[1]); } else if (result != null && result.Type == ResponseType.UnSub) { break; } } } }); }
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)); }
public ResponseData DoInOne(RequestType type, string content) { lock (_syncLocker) { RedisCoder.Coder(type, type.ToString(), content); return(RedisCoder.Decoder()); } }
public ResponseData <string> DoMutiCmd(RequestType type, params object[] @params) { ResponseData <string> result = new ResponseData <string>() { Type = ResponseType.Empty, Data = "未知的命令" }; try { lock (SyncRoot) { using (var cts = new CancellationTokenSource(_actionTimeout)) { 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.RequestOnlyParams(list.ToArray()); var sresult = RedisCoder.Decoder <string>(type, cts.Token); if (sresult != null && sresult.Type == ResponseType.Redirect) { return((ResponseData <string>)OnRedirect.Invoke(sresult.Data, OperationType.DoCluster, type, @params)); } else if (sresult.Type == ResponseType.Error) { throw new Exception(sresult.Data); } else { return(sresult); } } } } catch (TaskCanceledException tex) { result.Type = ResponseType.Error; result.Data = "Action Timeout"; } catch (Exception ex) { result.Type = ResponseType.Error; result.Data = ex.Message; } return(result); }
/// <summary> /// Others Scan /// </summary> /// <param name="type"></param> /// <param name="key"></param> /// <param name="offset"></param> /// <param name="pattern"></param> /// <param name="count"></param> /// <returns></returns> public ScanResponse DoScanKey(RequestType type, string key, int offset = 0, string pattern = "*", int count = -1) { key.KeyCheck(); return(TaskHelper.Run((token) => { lock (SyncRoot) { if (offset < 0) { offset = 0; } if (!string.IsNullOrEmpty(pattern)) { if (count > -1) { RedisCoder.Request(type, key, offset.ToString(), RedisConst.MATCH, pattern, RedisConst.COUNT, count.ToString()); } else { RedisCoder.Request(type, key, offset.ToString(), RedisConst.MATCH, pattern); } } else { if (count > -1) { RedisCoder.Request(type, key, offset.ToString(), RedisConst.COUNT, count.ToString()); } else { RedisCoder.Request(type, key, offset.ToString()); } } var result = RedisCoder.Decoder(type, token); if (result == null) { return null; } if (result.Type == ResponseType.Redirect) { return (ScanResponse)OnRedirect.Invoke(result.Data, OperationType.DoScanKey, type, key, offset, pattern, count); } else { if (result.Type == ResponseType.Lines) { return result.ToScanResponse(); } return null; } } }, _actionTimeout).Result); }
/// <summary> /// Others Scan /// </summary> /// <param name="type"></param> /// <param name="key"></param> /// <param name="offset"></param> /// <param name="pattern"></param> /// <param name="count"></param> /// <returns></returns> public ScanResponse DoScanKey(RequestType type, string key, int offset = 0, string pattern = "*", int count = -1) { key.KeyCheck(); lock (SyncRoot) { using (var cts = new CancellationTokenSource(_actionTimeout)) { if (offset < 0) { offset = 0; } if (!string.IsNullOrEmpty(pattern)) { if (count > -1) { RedisCoder.Request(type, key, offset.ToString(), RedisConst.MATCH, pattern, RedisConst.COUNT, count.ToString()); } else { RedisCoder.Request(type, key, offset.ToString(), RedisConst.MATCH, pattern); } } else { if (count > -1) { RedisCoder.Request(type, key, offset.ToString(), RedisConst.COUNT, count.ToString()); } else { RedisCoder.Request(type, key, offset.ToString()); } } var result = RedisCoder.Decoder <string>(type, cts.Token); if (result == null) { return(null); } if (result.Type == ResponseType.Redirect) { return((ScanResponse)OnRedirect.Invoke(result.Data, OperationType.DoScanKey, type, key, offset, pattern, count)); } else { if (result.Type == ResponseType.Lines) { return(result.ToScanResponse()); } return(null); } } } }
/// <summary> /// 用于不会迁移的命令 /// </summary> /// <param name="type"></param> /// <param name="content"></param> /// <returns></returns> public ResponseData DoWithOne(RequestType type, string content) { lock (_syncLocker) { content.KeyCheck(); RedisCoder.Request(type, content); return(RedisCoder.Decoder(type)); } }
public ResponseData DoClusterSetSlot(RequestType type, string action, int slot, string nodeID) { ResponseData result = new ResponseData() { Type = ResponseType.Empty, Data = "未知的命令" }; try { result = TaskHelper.Run((token) => { lock (SyncRoot) { 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.RequestOnlyParams(list.ToArray()); var sresult = RedisCoder.Decoder(type, token); if (sresult != null && sresult.Type == ResponseType.Redirect) { return((ResponseData)OnRedirect.Invoke(sresult.Data, OperationType.DoClusterSetSlot, type, action, slot, nodeID)); } else if (sresult != null && sresult.Type == ResponseType.Error) { throw new Exception(sresult.Data); } else { return(sresult); } } }, _actionTimeout).Result; } catch (TaskCanceledException tex) { result.Type = ResponseType.Error; result.Data = "Action Timeout"; } catch (Exception ex) { result.Type = ResponseType.Error; result.Data = ex.Message; } return(result); }
/// <summary> /// 用于不会迁移的命令 /// </summary> /// <param name="type"></param> /// <param name="content"></param> /// <param name="timeSpan"></param> /// <returns></returns> public async Task <ResponseData> DoWithOneAsync(RequestType type, string content, TimeSpan timeSpan) { return(await TaskHelper.Run(() => { lock (_syncLocker) { content.KeyCheck(); RedisCoder.Coder(type, type.ToString(), content); return RedisCoder.Decoder(); } }).WithCancellationTimeout(timeSpan)); }
/// <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)); }
public void DoExpire(string key, int seconds) { var cmd = RedisCoder.Coder(RequestType.EXPIRE, RequestType.EXPIRE.ToString(), key, seconds.ToString()); Request(cmd); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { OnRedirect.Invoke(result.Data, OperationType.DoExpire, key, seconds); return; } }
public async Task <ScanResponse> DoScanKeyAsync(TimeSpan timeSpan, RequestType type, string key, int offset = 0, string pattern = "*", int count = -1) { return(await TaskHelper.Run(() => { lock (_syncLocker) { key.KeyCheck(); if (offset < 0) { offset = 0; } if (!string.IsNullOrEmpty(pattern)) { if (count > -1) { RedisCoder.Coder(type, type.ToString(), key, offset.ToString(), RedisConst.MATCH, pattern, RedisConst.COUNT, count.ToString()); } else { RedisCoder.Coder(type, type.ToString(), key, offset.ToString(), RedisConst.MATCH, pattern); } } else { if (count > -1) { RedisCoder.Coder(type, type.ToString(), key, offset.ToString(), RedisConst.COUNT, count.ToString()); } else { RedisCoder.Coder(type, type.ToString(), key, offset.ToString()); } } var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return (ScanResponse)OnRedirect.Invoke(result.Data, OperationType.DoScanKey, type, key, offset, pattern, count); } else { if (result.Type == ResponseType.Lines) { return result.ToScanResponse(); } return null; } } }).WithCancellationTimeout(timeSpan)); }
public void DoExpire(string key, int seconds) { lock (_syncLocker) { key.KeyCheck(); RedisCoder.Request(RequestType.EXPIRE, key, seconds.ToString()); var result = RedisCoder.Decoder(RequestType.EXPIRE); if (result.Type == ResponseType.Redirect) { OnRedirect.Invoke(result.Data, OperationType.DoExpire, key, seconds); return; } } }
public void DoExpireAt(string key, int timestamp) { lock (_syncLocker) { key.KeyCheck(); RedisCoder.Coder(RequestType.EXPIREAT, RequestType.EXPIREAT.ToString(), key, timestamp.ToString()); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { OnRedirect.Invoke(result.Data, OperationType.DoExpireAt, key, timestamp); return; } } }
/// <summary> /// Others Scan /// </summary> /// <param name="type"></param> /// <param name="key"></param> /// <param name="offset"></param> /// <param name="pattern"></param> /// <param name="count"></param> /// <returns></returns> public ScanResponse DoScanKey(RequestType type, string key, int offset = 0, string pattern = "*", int count = -1) { lock (_syncLocker) { key.KeyCheck(); var cmd = ""; if (offset < 0) { offset = 0; } if (!string.IsNullOrEmpty(pattern)) { if (count > -1) { RedisCoder.Coder(type, type.ToString(), key, offset.ToString(), RedisConst.MATCH, pattern, RedisConst.COUNT, count.ToString()); } else { RedisCoder.Coder(type, type.ToString(), key, offset.ToString(), RedisConst.MATCH, pattern); } } else { if (count > -1) { RedisCoder.Coder(type, type.ToString(), key, offset.ToString(), RedisConst.COUNT, count.ToString()); } else { RedisCoder.Coder(type, type.ToString(), key, offset.ToString()); } } var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return((ScanResponse)OnRedirect.Invoke(result.Data, OperationType.DoScanKey, type, key, offset, pattern, count)); } else { if (result.Type == ResponseType.Lines) { return(result.ToScanResponse()); } return(null); } } }
/// <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 requestType1)) { RedisCoder.RequestOnlyParams(@params); result = RedisCoder.Decoder(requestType1); } else { redisCmd = $"{@params[0]}_{@params[1]}".ToUpper(); if (EnumHelper.GetEnum(redisCmd, out RequestType requestType2)) { RedisCoder.RequestOnlyParams(@params); result = RedisCoder.Decoder(requestType2); } else { result.Type = ResponseType.Error; result.Data = "未知的命令 cmd:" + cmd; } } } } } catch (Exception ex) { result.Type = ResponseType.Error; result.Data = ex.Message; } return(result); } }
/// <summary> /// SCAN /// </summary> /// <param name="type"></param> /// <param name="offset"></param> /// <param name="pattern"></param> /// <param name="count"></param> /// <returns></returns> public ScanResponse DoScan(RequestType type, int offset = 0, string pattern = "*", int count = -1) { var cmd = ""; if (offset < 0) { offset = 0; } if (!string.IsNullOrEmpty(pattern)) { if (count > -1) { cmd = RedisCoder.Coder(type, type.ToString(), offset.ToString(), RedisConst.MATCH, pattern, RedisConst.COUNT, count.ToString()); } else { cmd = RedisCoder.Coder(type, type.ToString(), offset.ToString(), RedisConst.MATCH, pattern); } } else { if (count > -1) { cmd = RedisCoder.Coder(type, type.ToString(), offset.ToString(), RedisConst.COUNT, count.ToString()); } else { cmd = RedisCoder.Coder(type, type.ToString(), offset.ToString()); } } Request(cmd); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return((ScanResponse)OnRedirect.Invoke(result.Data, OperationType.DoScan, type, offset, pattern, count)); } else { var scanResponse = new ScanResponse(); if (result.Type == ResponseType.Lines) { return(result.ToScanResponse()); } return(null); } }
/// <summary> /// 发送命令 /// </summary> /// <param name="cmd"></param> public ResponseData Do(RequestType type) { var cmd = RedisCoder.Coder(type, type.ToString()); Request(cmd); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.Do, null)); } else { return(result); } }
public ResponseData DoBatchWithDic(RequestType type, Dictionary <string, string> dic) { lock (_syncLocker) { RedisCoder.CoderForDic(type, dic); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoBatchWithDic, type, dic)); } else { return(result); } } }
public ResponseData DoBatchWithList(RequestType type, string id, List <string> list) { lock (_syncLocker) { RedisCoder.CoderForList(type, id, list); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoBatchWithList, type, list)); } else { return(result); } } }
public void DoExpireInsert(RequestType type, string key, string value, int seconds) { lock (_syncLocker) { key.KeyCheck(); RedisCoder.Coder(type, type.ToString(), key, value); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { OnRedirect.Invoke(result.Data, OperationType.DoExpireInsert, key, value, seconds); return; } RedisCoder.Coder(RequestType.EXPIRE, string.Format("{0} {1} {2}", type.ToString(), key, seconds)); RedisCoder.Decoder(); } }
/// <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); } } }
public ResponseData DoBatchWithIDDic(RequestType type, string id, Dictionary <double, string> dic) { var cmd = RedisCoder.CoderForDicWidthID(type, id, dic); Request(cmd); var result = RedisCoder.Decoder(); if (result.Type == ResponseType.Redirect) { return((ResponseData)OnRedirect.Invoke(result.Data, OperationType.DoBatchWithIDDic, type, id, dic)); } else { return(result); } }