.net 4.0 自定义本地缓存策略的不同实现
在分布式系统的开发中,为了提高系统运行性能,我们从服务器中获取的数据需要缓存在本地,以便下次使用,而不用从服务器中重复获取,有同学可能要问,为什么不使用 分布式缓存等,注意,服务器端肯定是考虑到扩展,可以使用各种缓存方法,但数据来到本地,在客户端(各种形式的客户端)是否了需要进行缓存以提升性能呢,回答是肯定的。
在.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 自定义本地缓存策略的不同实现的更多相关文章
- Guava的两种本地缓存策略
Guava的两种缓存策略 缓存在很多场景下都需要使用,如果电商网站的商品类别的查询,订单查询,用户基本信息的查询等等,针对这种读多写少的业务,都可以考虑使用到缓存.在一般的缓存系统中,除了分布式缓存, ...
- ios 缓存策略
NSURLRequestCachePolicy 缓存策略 1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略, 如果缓存不存在,直接从服务端 ...
- HTTP 缓存策略
浏览器一般缓存图片.CSS.JS等静态文件,因为这些文件的更新频率相对来说比较低,合理利用浏览器的缓存对网站的性能提升有很大帮助.HTTP缓存分为两部分,分别是本地缓存和缓存协商,当本地缓存不生效时会 ...
- NSURLRequestCachePolicy 缓存策略
1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略, 如果缓存不存在,直接从服务端获取.如果缓存存在,会根据response中的Cache-Co ...
- 基于ConcurrentHashMap的本地缓存
基于ConcurrentHashMap的本地缓存 在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无 ...
- http缓存策略以及强缓存和协商缓存浅析
http缓存策略以及强缓存和协商缓存浅析 本地缓存-强缓存 本地缓存,也就是我们常说的强缓存:是指当浏览器请求资源时,如果请求服务端的资源命中了浏览器本地的缓存资源,那么浏览器就不会发送真正请求给服务 ...
- .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存
.Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...
- RDD概念、特性、缓存策略与容错
一.RDD概念与特性 1. RDD的概念 RDD(Resilient Distributed Dataset),是指弹性分布式数据集.数据集:Spark中的编程是基于RDD的,将原始数据加载到内存变成 ...
- 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
源码:http://files.cnblogs.com/ios8/ASIHttpRequestDemo2.zip NSURL *url = [NSURLURLWithString:@"htt ...
随机推荐
- 转:EClipse 10个最有用的快捷键
Eclipse快捷键 10个最有用的快捷键 Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代 ...
- JSPatch一些容易犯错的地方
JSPatch一些自己使用后的发现: 1.JS不区分整数和浮点数.解析字典以后的value不需要通过 floatValue等方法转换,而是自动就转换成对应的数据类型. 2.nil在JSPatch中 不 ...
- Java眼中的XML--文件读取--2 应用SAX方式解析XML
1.获取一个SAXParserFactory的实例.2.通过factory获取SAXParser实例. 3.新建一个包和继承自DefaultHandler的类. 因为SAX遍历方式,比如便利一个节 ...
- 忙碌的Nova君 (活动安排问题、贪心算法)
题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设 ...
- 转 Android Dalvik虚拟机初识
首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题 ...
- Orchard扩展 自定义后台管理导航菜单 Admin Menu
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉. 金天:看源码永远是Coder学习的最快捷路径. 看本文需要对Orchard大致体系, 特别是Mo ...
- Effective Java 13 Minimize the accessibility of classes and members
Information hiding is important for many reasons, most of which stem from the fact that it decouples ...
- 在MFC中添加用户自定义消息
1.定义一个宏 (用户自定义消息从WM_USER开始) #define WM_XXXXX WM_USER+数值 2.声明一个函数并实现 afx_msg LRESULT OnXXXXX( WPARAM ...
- Android Listener侦听的N种写法
Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用 ...
- 利用Keydown事件阻止用户输入
先了解下各事件的区别 keydown:在控件有焦点的情况下按下键时发生 keypress:在控件有焦点的情况下按下键时发生 keyup: 在控件有焦点的情况下释放键时发生 意义 keypress主 ...