在分佈式系統的開發中,爲了提升系統運行性能,咱們從服務器中獲取的數據須要緩存在本地,以便下次使用,而不用從服務器中重複獲取,有同窗可能要問,爲何不使用 分佈式緩存等,注意,服務器端確定是考慮到擴展,可使用各類緩存方法,但數據來到本地,在客戶端(各類形式的客戶端)是否了須要進行緩存以提高性能呢,回答是確定的。 緩存
在.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
{
#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:
{
#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
}
此實現不管有多少 緩存策略,都只有一個守護線程在工做,最大程度提升了系統性能與可用性。