예제 #1
0
        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);
        }