.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
    }

複製代碼

 此實現不管有多少 緩存策略,都只有一個守護線程在工做,最大程度提升了系統性能與可用性。

相關文章
相關標籤/搜索