C#缓存操作

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白鼠

Ionic3 表单处理

在项目中,可以使用angular中的 @angular/forms模块处理表单,但是并不需要在app.module中引用@angular/forms模块,因为在...

491
来自专栏从流域到海域

《数据结构》 单链表常用操作代码集合

Ps:每段代码中,添加了Solo署名的是博主自己写的,其余来自课本或老师。 //单链表存储结构 typedef struct Node //结点类型定义 ...

1986
来自专栏技术小讲堂

Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎背景知识文档结构服务端API准备Require配置与系统配置模块中的工作模块间的工作烂图赏鉴代码送上

开篇扯淡 距离上一篇文章已经有好几个月,也不是没有时间记录点东西,主要是换了新的工作,在一家外资工作,目前的工作内容大多都是前端开发,新接触的东西因为时间原因,...

2726
来自专栏一个会写诗的程序员的博客

《Spring Boot极简教程》第5章 Spring Boot自动配置原理

我们可以看到有783个java文件。spring-boot核心工程有551个java文件。从上面的java文件数量大致可以看出,SpringBoot技术框架的核...

992
来自专栏IMWeb前端团队

PhantomJS基础及示例

概述 PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast...

2078
来自专栏技术之路

silverlight ListBox 多列图片效果

这个功能之前用wpf写过一次这次用Silverlight写一次 这两种写法上基本上没有太大的差别 这个Demo并不完美,只是给大家提供一个思路 源码:Silve...

1977
来自专栏数据结构与算法

洛谷P3178 [HAOI2015]树上操作

题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节...

3408
来自专栏MasiMaro 的技术博文

Windows下的代码注入

木马和病毒的好坏很大程度上取决于它的隐蔽性,木马和病毒本质上也是在执行程序代码,如果采用独立进程的方式需要考虑隐藏进程否则很容易被发现,在编写这类程序的时候可以...

561
来自专栏哲学驱动设计

WPF框架的内存泄漏BUG

    用户在使用GIX4某模块的过程中,内存只见加不见减。我们怀疑出现了内存泄漏,所以我花了相当一段时间来进行此问题的排查。     我使用Red Gate公...

1895
来自专栏一个会写诗的程序员的博客

第5章 Spring Boot自动配置原理

我们可以看到有783个java文件。spring-boot核心工程有551个java文件。从上面的java文件数量大致可以看出,SpringBoot技术框架的核...

1123

扫码关注云+社区