文章出處
文章列表
1.緩存輔助方法類的接口代碼:
public interface IThrottleStore { /// <summary> /// 試圖獲取值 /// </summary> /// <param name="key"></param> /// <param name="entry"></param> /// <returns></returns> bool TryGetValue(string key, out ThrottleEntry entry); /// <summary> /// 增量請求 /// </summary> /// <param name="key"></param> void IncrementRequests(string key); /// <summary> /// 反轉 /// </summary> /// <param name="key"></param> void Rollover(string key); /// <summary> /// 清除 /// </summary> void Clear(); }
2.緩存輔助方法的實體類代碼:
/// <summary> /// 調節實體 /// </summary> public class ThrottleEntry { /// <summary> /// 開始時間 /// </summary> public DateTime PeriodStart { get; set; } /// <summary> /// 請求 /// </summary> public long Requests { get; set; } /// <summary> /// 構造函數 /// </summary> public ThrottleEntry() { PeriodStart = DateTime.UtcNow; Requests = 0; } }
3.緩存輔助類的實現代碼:
public class InMemoryThrottleStore : IThrottleStore { /// <summary> /// 定義類型字段時,采用線程安全字典 /// </summary> private readonly ConcurrentDictionary<string, ThrottleEntry> _throttleStore = new ConcurrentDictionary<string, ThrottleEntry>(); public bool TryGetValue(string key, out ThrottleEntry entry) { return _throttleStore.TryGetValue(key, out entry); } public void IncrementRequests(string key) { _throttleStore.AddOrUpdate(key, k => { return new ThrottleEntry() { Requests = 1 }; }, (k, e) => { e.Requests++; return e; }); } public void Rollover(string key) { ThrottleEntry dummy; _throttleStore.TryRemove(key, out dummy); } public void Clear() { _throttleStore.Clear(); } }
文章列表
全站熱搜