在分布式系统的开发中,为了提升系统运行性能,咱们从服务器中获取的数据须要缓存在本地,以便下次使用,而不用从服务器中重复获取,有同窗可能要问,为何不使用 分布式缓存等,注意,服务器端确定是考虑到扩展,可使用各类缓存方法,但数据来到本地,在客户端(各类形式的客户端)是否了须要进行缓存以提高性能呢,回答是确定的。 缓存
在.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
}
此实现不管有多少 缓存策略,都只有一个守护线程在工做,最大程度提升了系统性能与可用性。