예제 #1
0
        public async Task <ThrottleCounter> IncrementAsync(string key, ThrottleRequirement requirement, long incrementValue = 1, bool reachLimitAtMax = false)
        {
            if (requirement == null)
            {
                throw new ArgumentNullException(nameof(requirement));
            }

            Connect();

            bool limitReached = false;
            var  value        = await _database.StringIncrementAsync(key, incrementValue);

            bool           justCreated = value == incrementValue;
            DateTimeOffset reset;

            if (justCreated || requirement.Sliding)
            {
                await _database.KeyExpireAsync(key, requirement.RenewalPeriod, CommandFlags.FireAndForget);

                reset = _clock.UtcNow.Add(requirement.RenewalPeriod);
            }
            else
            {
                var remainingTime = await _database.KeyTimeToLiveAsync(key);

                reset = _clock.UtcNow.Add(remainingTime.Value);
            }

            if (value > requirement.MaxValue || (reachLimitAtMax && value == requirement.MaxValue))
            {
                limitReached = true;
            }

            return(new ThrottleCounter(reset, value, limitReached));
        }
예제 #2
0
        public async Task <ThrottleCounter> GetAsync(string key, ThrottleRequirement requirement)
        {
            if (requirement == null)
            {
                throw new ArgumentNullException(nameof(requirement));
            }

            Connect();

            ThrottleCounter counter;
            var             entry = await _database.StringGetWithExpiryAsync(key);

            if (entry.Value.IsNull)
            {
                counter = new ThrottleCounter(_clock.UtcNow.Add(requirement.RenewalPeriod));
            }
            else
            {
                long value        = (long)entry.Value;
                bool limitReached = value >= requirement.MaxValue;
                counter = new ThrottleCounter(_clock.UtcNow.Add(entry.Expiry.Value), value, limitReached);
            }

            return(counter);
        }