public CheckResult Check(IThrottleKey key, bool increment = true) { foreach (Limiter limiter in Limiters) { var result = new CheckResult { IsThrottled = false, IsLocked = false, ThrottleKey = _repository.CreateThrottleKey(key, limiter), Limiter = limiter }; var ignorelist = _repository.SetOrGetIgnoreList(); //判断是否在白名单中 if (ignorelist.Length > 0) { if (key.Values.Intersect(ignorelist).Count() > 0) { return(result); } } if (limiter.LockDuration.HasValue) { result.LockKey = _repository.CreateLockKey(key, limiter); if (_repository.LockExists(key, limiter)) { result.IsLocked = true; return(result); } } //判断有没有达到限制数量 if (limiter.Count <= 0) { continue; } long?counter = _repository.GetThrottleCount(key, limiter); //计数 if (counter.HasValue && counter.Value >= limiter.Count) { if (limiter.LockDuration.HasValue) { //设置锁定 _repository.SetLock(key, limiter); _repository.RemoveThrottle(key, limiter); } result.IsThrottled = true; return(result); } if (increment) { _repository.AddOrIncrementWithExpiration(key, limiter); } } return(CheckResult.NotThrottled); }
public CheckResult Check(IThrottleKey key, bool increment = true) { foreach (Limiter limiter in Limiters) { var result = new CheckResult { IsThrottled = false, IsLocked = false, ThrottleKey = _repository.CreateThrottleKey(key, limiter), Limiter = limiter }; if (limiter.LockDuration.HasValue) { result.LockKey = _repository.CreateLockKey(key, limiter); if (_repository.LockExists(key, limiter)) { result.IsLocked = true; return(result); } } // Short-circuit this loop if the // limit value isn't valid if (limiter.Count <= 0) { continue; } long?counter = _repository.GetThrottleCount(key, limiter); if (counter.HasValue && counter.Value >= limiter.Count) { if (limiter.LockDuration.HasValue) { _repository.SetLock(key, limiter); _repository.RemoveThrottle(key, limiter); } result.IsThrottled = true; return(result); } if (increment) { _repository.AddOrIncrementWithExpiration(key, limiter); } } return(CheckResult.NotThrottled); }