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)); }
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); }