在分布式系统的开发中,为了提高系统运行性能,我们从服务器中获取的数据需要缓存在本地,以便下次使用,而不用从服务器中重复获取,有同学可能要问,为什么不使用 分布式缓存等,注意,服务器端肯定是考虑到扩展,可以使用各种缓存方法,但数据来到本地,在客户端(各种形式的客户端)是否了需要进行缓存以提升性能呢,回答是肯定的。

在.net 4 中,框架增加了System.Runtime.Caching 名称空间,用于支持缓存,虽然它可以用于服务器端,也可用于本地。

关于缓存在.net 中如何使用,它的概念,可以参考:

http://www.dotblogs.com.tw/larrynung/archive/2010/11/26/19746.aspx

关于如何自定义缓存策略的实现,可参考:

http://www.dotblogs.com.tw/larrynung/archive/2013/06/12/105458.aspx

缓存什么时候失效的检查是自定义的的关键,如以上示例所示,使用 Timer 组件来触发检查事件,其局限性为:必须引用System.Windows.Form.dll类库,并且性能也消耗也大,可参考:Timer 与 Thread 线程的性能比较。

这是我的实现1:

    internal class PartyChangeMonitor : ChangeMonitor    {

        #region 私有变量
        private string _uniqueID = Guid.NewGuid().ToString();
        private DateTime _MonitorTime;
        private int _PartyID;
        private int _CheckInterval;         #endregion         #region Public Property
        public override string UniqueId
        {
            get { return _uniqueID; }
        }
        #endregion         #region Constructor
        public PartyChangeMonitor(int partyID, int checkInterval)
        {
            _PartyID = partyID;
            _CheckInterval = checkInterval * ;
            _MonitorTime = DateTime.Now;
            isStoped = false;             this.StartDaemon();
            InitializationComplete();
        }
        #endregion         #region Protected Method
        protected override void Dispose(bool disposing)
        {         }
        #endregion         #region 心跳监控
        Thread thrDaemon;
        bool isStoped = true;
        //登录时启动,开始心跳检测
        void StartDaemon()
        {
            //System.Threading.ThreadPool.get
            this.thrDaemon = new Thread(new ThreadStart(this.Daemon));
            thrDaemon.Start();
        }
        /// <summary>
        /// 监视任务,如果已过期,则停止检测
        /// </summary>
        void Daemon()
        {
            while (!this.isStoped)
            {
                Thread.Sleep(_CheckInterval);                 DateTime _LastUpdatedTime = Party.GetLastUpdatedTime(_PartyID);
                if (_LastUpdatedTime > _MonitorTime)
                {
                    OnChanged(_LastUpdatedTime);
                    isStoped = true;
                }
            }
        }
        #endregion
    }

以上实现有个问题是,每个检查策略都会开启一个线程,这样如果有1000个策略呢,10000个呢,CPU在线程间切换的性能消耗就把机器拖跨,这个实现虽然比使用Timer组件要好很多,但离真正的可用还是差哪么一步,因此,才有了以下实现:

这是我的实现2:

    internal class PartyChangeMonitor2 : ChangeMonitor     {
        #region 私有变量
        private string _uniqueID ;
        private DateTime _MonitorTime;
        private int _PartyID;
        #endregion         #region Public Property
        public override string UniqueId
        {
            get { return _uniqueID; }
        }
        #endregion         #region Constructor
        public PartyChangeMonitor2(int partyID, int checkInterval)
        {            
            _uniqueID = Guid.NewGuid().ToString();             _PartyID = partyID;
            _MonitorTime = DateTime.Now;             LocalCache.RegisterCheckHandler(UniqueId,CheckExpired, checkInterval);
            InitializationComplete();
        }
        #endregion         #region Protected Method
        protected override void Dispose(bool disposing)
        {
            LocalCache.RemoveCheckHandler(this.UniqueId);
            base.Dispose();
        }
        #endregion         #region 过期检测
        /// <summary>
        /// 如果已过期,则停止检测
        /// </summary>
        /// <returns>true 数据已过期,可以移除检测,false 数据有效,要继续检测</returns>
        public bool CheckExpired()
        {
            DateTime _LastUpdatedTime = Party.GetLastUpdatedTime(_PartyID);
            if (_LastUpdatedTime > _MonitorTime)
            {
                OnChanged(_LastUpdatedTime);
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion
    }

此实现无论有多少 缓存策略,都只有一个守护线程在工作,最大程度提高了系统性能与可用性。

.net 4.0 自定义本地缓存策略的不同实现的更多相关文章

  1. Guava的两种本地缓存策略

    Guava的两种缓存策略 缓存在很多场景下都需要使用,如果电商网站的商品类别的查询,订单查询,用户基本信息的查询等等,针对这种读多写少的业务,都可以考虑使用到缓存.在一般的缓存系统中,除了分布式缓存, ...

  2. ios 缓存策略

    NSURLRequestCachePolicy 缓存策略   1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略, 如果缓存不存在,直接从服务端 ...

  3. HTTP 缓存策略

    浏览器一般缓存图片.CSS.JS等静态文件,因为这些文件的更新频率相对来说比较低,合理利用浏览器的缓存对网站的性能提升有很大帮助.HTTP缓存分为两部分,分别是本地缓存和缓存协商,当本地缓存不生效时会 ...

  4. NSURLRequestCachePolicy 缓存策略

    1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略, 如果缓存不存在,直接从服务端获取.如果缓存存在,会根据response中的Cache-Co ...

  5. 基于ConcurrentHashMap的本地缓存

    基于ConcurrentHashMap的本地缓存 在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无 ...

  6. http缓存策略以及强缓存和协商缓存浅析

    http缓存策略以及强缓存和协商缓存浅析 本地缓存-强缓存 本地缓存,也就是我们常说的强缓存:是指当浏览器请求资源时,如果请求服务端的资源命中了浏览器本地的缓存资源,那么浏览器就不会发送真正请求给服务 ...

  7. .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存

    .Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...

  8. RDD概念、特性、缓存策略与容错

    一.RDD概念与特性 1. RDD的概念 RDD(Resilient Distributed Dataset),是指弹性分布式数据集.数据集:Spark中的编程是基于RDD的,将原始数据加载到内存变成 ...

  9. 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存

    源码:http://files.cnblogs.com/ios8/ASIHttpRequestDemo2.zip NSURL *url = [NSURLURLWithString:@"htt ...

随机推荐

  1. 基础学习day02--标识符、关键字、数据类型与运算符

    一.标识符和关键字   关键字: 就是被java语言赋予了特殊含义的单词. 特点就是所有的关键字都是小写.   标识符: 就是给包.类.接口.方法.变量名起的名字. 规则:1.以数字.字母._以及$符 ...

  2. IOS Quartz2D简介

    Quartz2D 简介( 后续会有相关应用) 第一部分 绘制直线 代码示例: - (void)drawRect:(CGRect)rect{ //获取图形上下文 CGContextRef cxConte ...

  3. 【转】IOS开发中图片资源使用png还是jpg格式

    对于iOS本地应用程序来说最简单的答案就是始终使用PNG,除非你有非常非常好的理由不用它. 当iOS应用构建的时候,Xcode会通过一种方式优化.png文件而不会优化其它文件格式.它优化得相当的好 他 ...

  4. Objective-C之优雅的命名

    There are only two hard things in Computer Science: cache invalidation and naming things.在计算机科学中只有两件 ...

  5. j-query应用---鼠标悬停不同文字显示不同背景图片banner动画

    源代码部分:注意事项:样式表的引用的路径要一致. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  6. MySQL 如何修改字符集 utf8 改为 utf8mb4

    在实行sql server 向 mysql 迁移数据时,报错: Incorrect string value: '\xF0\x9F\x98\x8A' 原因是mysql 采用的是 utf8 的字符集,而 ...

  7. Android 开发之 Android 开发的起步

    前言  Android 开发的起步 我们可以先来看看百科上面怎么说? 百度百科上 Android的介绍 一.Windows环境下在线搭建Android环境. 1. 下载 Android开发工具. JD ...

  8. .NET三层架构例子超链接可以点击显示内容页面

    在研究了一个星期的三层架构写出的一个小功能,使用三层架构并实现点击新闻标题可以跳转到自己写的新闻页面. 首先是一个DBHelper,这个不是我自己写的,是朋友给我的 using System; usi ...

  9. 图片代替radio

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  10. Android 内存分析

    1.使用adb命令查看app内存使用情况 adb shell dumpsys meminfo <package_name> adb shell top | grep <package ...