public void SetAndExists() { string key = "6"; var result = _redisDatabase.Set(key, "呼吁", TimeSpan.FromSeconds(60)); //var result = RedisHelper.Set(key, "呼吁", TimeSpan.FromSeconds(60)); var isExists = _redisDatabase.Exists(key); Assert.AreEqual(true, result); }
/// <summary> /// /// </summary> /// <param name="keySucceed"></param> /// <param name="keyError"></param> /// <param name="hitDuration"></param> private void RecordRequest(string keySucceed = null, string keyError = null, string hitDuration = "1d") { if (!string.IsNullOrEmpty(keySucceed)) { if (!_redisManager.Exists(keySucceed)) { _redisManager.StringIncrement(keySucceed, expiry: _ConvertToTimeSpan(hitDuration)); } else { _redisManager.StringIncrement(keySucceed); } } else { if (!_redisManager.Exists(keyError)) { _redisManager.StringIncrement(keyError, expiry: _ConvertToTimeSpan(hitDuration)); } else { _redisManager.StringIncrement(keyError); } } TimeSpan _ConvertToTimeSpan(string timeSpan) { var l = timeSpan.Length - 1; var value = timeSpan.Substring(0, l); var type = timeSpan.Substring(l, 1); switch (type) { case "d": return(TimeSpan.FromDays(double.Parse(value))); case "h": return(TimeSpan.FromHours(double.Parse(value))); case "m": return(TimeSpan.FromMinutes(double.Parse(value))); case "s": return(TimeSpan.FromSeconds(double.Parse(value))); case "f": return(TimeSpan.FromMilliseconds(double.Parse(value))); case "z": return(TimeSpan.FromTicks(long.Parse(value))); default: return(TimeSpan.FromDays(double.Parse(value))); } } }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task InvokeAsync(HttpContext context) { var token = context.RequestAborted.Register(async() => { await Task.CompletedTask; return; }); var analysisConfigListTemp = _requestAnalysisOption.PolicyOption; _iLogger.LogDebug($"流量分析获取的请求路径:{context.Request.Path.Value}"); //TODO 支持包含{id}此类路径 var analysisConfigTemp = analysisConfigListTemp?.Where(s => s.Enabled == true && s.Path.Equals(context.Request.Path.Value, StringComparison.OrdinalIgnoreCase))?.FirstOrDefault(); int maxLimitTemp = 0; int maxErrorLimitTemp = 0; if (analysisConfigTemp == null) { goto gotoNext; } if (analysisConfigTemp != null && maxLimitTemp == 0) { maxLimitTemp = analysisConfigTemp.MaxSucceedLimit; } if (analysisConfigTemp != null && maxErrorLimitTemp == 0) { maxErrorLimitTemp = analysisConfigTemp.MaxErrorLimit; } string path = context.Request.Path.Value.Replace('/', ':'); string limitkey = $"{RedisKeys.Key_Request_Limit_IP_Lock}{GetRequestIp()}"; if (!analysisConfigTemp.IsGlobalLock) { limitkey = limitkey + path; } if (_redisManager.Exists(limitkey)) { _iLogger.LogWarning($"[Analysic] 触发请求锁定 IsGlobalLock:{analysisConfigTemp.IsGlobalLock} 时长:{analysisConfigTemp.LockDuration} "); await BuildErrorJson(context); await Task.CompletedTask; return; } var CheckIpValidResultByConfig = CheckIpValid(maxLimitTemp, maxErrorLimitTemp, context.Request.Path.Value.Replace('/', ':')); if (!CheckIpValidResultByConfig.Item1) { //触发限制 if (!string.IsNullOrWhiteSpace(analysisConfigTemp.LockDuration)) { _redisManager.GetOrSet($"{limitkey}", () => { return(context.Request.QueryString.Value); }, _ConvertToTimeSpan(analysisConfigTemp.LockDuration), (int)_ConvertToTimeSpan(analysisConfigTemp.LockDuration).TotalSeconds - 1); } _iLogger.LogWarning($"[Analysic] 触发请求限制 时长:{analysisConfigTemp.HitDuration} "); await BuildErrorJson(context); await Task.CompletedTask; return; } else { await _next(context); var currentIp = GetRequestIp(); if (context.Response.StatusCode == 200) { string keySucceed = $"{RedisKeys.Key_Request_Limit_IP_Succ}{currentIp}"; RecordRequest(keySucceed: $"{keySucceed}{path}", hitDuration: analysisConfigTemp.HitDuration); } else { string keyError = $"{RedisKeys.Key_Request_Limit_IP_Error}{currentIp}"; RecordRequest(keyError: $"{keyError}{path}", hitDuration: analysisConfigTemp.HitDuration); } await Task.CompletedTask; return; } gotoNext: await _next(context); }