示例#1
0
        public bool LockExists(IThrottleKey key, Limiter limiter)
        {
            string lockId = CreateLockKey(key, limiter);
            object reslut = null;

            return(_store.TryGetValue(lockId, out reslut));
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        private long?GetLimiterCount(TimeSpan span)
        {
            Limiter item   = Limiters.FirstOrDefault(l => l.Period == span);
            long?   result = null;

            if (item != null)
            {
                result = item.Count;
            }

            return(result);
        }
示例#5
0
        /// <summary>
        /// 获取数量
        /// </summary>
        /// <param name="key"></param>
        /// <param name="limiter"></param>
        /// <returns></returns>
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        public string CreateThrottleKey(IThrottleKey key, Limiter limiter)
        {
            List <object> values = CreateBaseKeyValues(key, limiter);

            string countKey = TimeSpanToFriendlyString(limiter.Period);

            values.Add(countKey);

            //使用unix时间戳
            if (limiter.Period.TotalSeconds == 1)
            {
                values.Add(GetUnixTimestamp());
            }

            string id = string.Join(":", values);

            return(id);
        }
示例#8
0
        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;
                Console.WriteLine(cacheItem.Count);
            }
            else
            {
                cacheItem = new ThrottleCacheItem()
                {
                    Count      = 1,
                    Expiration = CurrentDate().Add(limiter.Period)
                };
            }

            _store.Set(id, cacheItem, cacheItem.Expiration);
        }
示例#9
0
        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);
        }
示例#10
0
        public void RemoveThrottle(IThrottleKey key, Limiter limiter)
        {
            string lockId = CreateThrottleKey(key, limiter);

            _store.Remove(lockId);
        }