private List <object> CreateBaseKeyValues(IThrottleKey key, Limiter limiter) { List <object> values = key.Values.ToList(); if (PolicyIdentityValues != null && PolicyIdentityValues.Length > 0) { values.InsertRange(0, PolicyIdentityValues); } return(values); }
public void SetLock(IThrottleKey key, Limiter limiter) { string throttleId = CreateThrottleKey(key, limiter); _store.Remove(throttleId); string lockId = CreateLockKey(key, limiter); DateTime expiration = CurrentDate().Add(limiter.LockDuration.Value); _store.Set(lockId, true, expiration); }
private long?GetLimiterCount(TimeSpan span) { Limiter item = Limiters.FirstOrDefault(l => l.Period == span); long? result = null; if (item != null) { result = item.Count; } return(result); }
public long?GetThrottleCount(IThrottleKey key, Limiter limiter) { string id = CreateThrottleKey(key, limiter); var cacheItem = _store.Get(id) as ThrottleCacheItem; if (cacheItem != null) { return(cacheItem.Count); } return(null); }
public string CreateLockKey(IThrottleKey key, Limiter limiter) { List <object> values = CreateBaseKeyValues(key, limiter); string lockKeySuffix = TimeSpanToFriendlyString(limiter.LockDuration.Value); values.Add("lock"); values.Add(lockKeySuffix); string id = string.Join(":", values); return(id); }
public string CreateThrottleKey(IThrottleKey key, Limiter limiter) { List <object> values = CreateBaseKeyValues(key, limiter); string countKey = TimeSpanToFriendlyString(limiter.Period); values.Add(countKey); // Using the Unix timestamp to the key allows for better // precision when querying a key from Redis if (limiter.Period.TotalSeconds == 1) { values.Add(GetUnixTimestamp()); } string id = string.Join(":", values); return(id); }
public void AddOrIncrementWithExpiration(IThrottleKey key, Limiter limiter) { string id = CreateThrottleKey(key, limiter); var cacheItem = _store.Get(id) as ThrottleCacheItem; if (cacheItem != null) { cacheItem.Count = cacheItem.Count + 1; } else { cacheItem = new ThrottleCacheItem() { Count = 1, Expiration = CurrentDate().Add(limiter.Period) }; } _store.Set(id, cacheItem, cacheItem.Expiration); }
private void SetLimiter(TimeSpan span, long?count) { Limiter item = Limiters.FirstOrDefault(l => l.Period == span); if (item != null) { _limits.Remove(item); } if (!count.HasValue) { return; } item = new Limiter { Count = count.Value, Period = span }; _limits.Add(item); }
public Task <bool> LockExistsAsync(IThrottleKey key, Limiter limiter) => Task.FromResult(LockExists(key, limiter));
public bool LockExists(IThrottleKey key, Limiter limiter) { string lockId = CreateLockKey(key, limiter); return(_store.TryGetValue(lockId, out _)); }
public Task SetLockAsync(IThrottleKey key, Limiter limiter) { SetLock(key, limiter); return(Task.CompletedTask); }
public Task AddOrIncrementWithExpirationAsync(IThrottleKey key, Limiter limiter) { AddOrIncrementWithExpiration(key, limiter); return(Task.CompletedTask); }
public Task <long?> GetThrottleCountAsync(IThrottleKey key, Limiter limiter) => Task.FromResult(GetThrottleCount(key, limiter));
public Task <string> CreateThrottleKeyAsync(IThrottleKey key, Limiter limiter) => Task.FromResult(CreateThrottleKey(key, limiter));
public Task RemoveThrottleAsync(IThrottleKey key, Limiter limiter) { RemoveThrottle(key, limiter); return(Task.CompletedTask); }
public void RemoveThrottle(IThrottleKey key, Limiter limiter) { string lockId = CreateThrottleKey(key, limiter); _store.Remove(lockId); }