.net 4.0 自定义本地缓存策略的不一样实现

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

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

关于缓存在.net 中如何使用,它的概念,能够参考: 框架

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

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

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

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

这是个人实现1: this

复制代码
    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 * 1000;
            _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
    } spa

复制代码

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

这是个人实现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
    }

复制代码

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

相关文章
相关标签/搜索