1.缘起:
假设我们有一个订单系统,现在这个系统要增加一个功能――允许客人查核他认为有问题的订单的详细信息。当客人觉得自己的某个订单不对劲时,他首先会从订单系统查询这个订单的详细信息,然后打电话告诉我们的客服有问题的订单的编号,客服再去查核,如果属实,客服还要进一步上报,如果该订单非常重要,则可能需要更进一步上报复查等。
从这个需求我们看到,同一个订单可能会在比较短的时间内查询数次甚至数十次,所以我们可以称这个订单为“热点”订单。而其它的成千上万的订单可能在一个月内都不被查询一次。
我设计热缓存ESBasic.ObjectManagement.Cache. IHotCache就是缓存类似“热点”订单的这些对象。
热缓存的形象示意图如下:
2.适用场合:
根据上述的描述,我们可以总结一下热缓存IHotCache的使用场合:
(1)根据我们系统的需求,目标对象群中的某些对象的“热”的程度可以明显地与其它对象区分开来。
(2)加载某一类型的对象到我们的系统中需要花费比较大的气力(比如加载速度很慢、加载过程很繁琐),而且一旦加载就会被经常使用。
(3)在指定的时间周期内不被访问的对象可以被卸载掉。如果一个“热”对象变“冷”了,那么我们就可以将其从热缓存中移除。
(4)当然,要被缓存的对象必须有唯一的ID。
3.设计思想与实现
IHotCache的接口定义如下:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> ///<summary>
///IHotCache用于缓存那些活跃的对象,并定时删除不活跃的对象。该接口的实现必须是线程安全的。
///</summary>
publicinterfaceIHotCache<TKey,TObject>whereTObject:class
{
///<summary>
///DetectSpanInSecs多长时间检测一次对象是否活跃,单位:秒。
///</summary>
intDetectSpanInSecs{set;}
///<summary>
///MaxMuteSpanInMinutes对象最大的沉默时间(分钟)。如果一个对象在MaxMuteSpanInMinutes时间间隔内都不被访问,则将被从缓存中清除。
///如果该属性的值被设置为小于或等于0,则表示永远不会从缓存中清除。
///</summary>
intMaxMuteSpanInMinutes{set;}
///<summary>
///MaxCachedCount最多缓存的对象个数。当超过此个数时,不再缓存新的对象。
///</summary>
intMaxCachedCount{get;set;}
IObjectRetriever<TKey,TObject>ObjectRetriever{set;}
intCount{get;}
longRequestCount{get;}//请求次数
longHitCount{get;}//命中的次数
DateTimeLastReadTime{get;}
voidInitialize();
voidClear();
voidAdd(TKeyid,TObjectobj);
voidRemove(TKeyid);
///<summary>
///Get如果缓存中存在目标则直接返回,否则通过ObjectRetriever提取对象并缓存。
///</summary>
TObjectGet(TKeyid);
IList<TObject>GetAll();
eventCbSimpleCacheContentChanged;
}
注意这个接口的泛型参数TObject有一个泛型约束,其表明TObject必须是一个引用类型,这表示我们不能使用热缓存来缓存那些值类型的对象。
当你向IHotCache请求一个对象时,如果对象不在热缓存中(有可能是从来还未加载进缓存,也有可能是因为对象变“冷”后被移除缓存了),则会加载该对象到热缓存中并返回。我们是借助前面介绍的对象获取器IObjectRetriever来获取目标对象的。
热缓存会每隔一段时间检测一次缓存中的对象是否已经变“冷”――即在MaxMuteSpanInMinutes时间段内都没有被访问过。这个定时检测就是使用循环引擎AgileCycleEngine来做到的。如果一个对象已经变“冷”,则会将其移除热缓存――热缓存只缓存那些“热”的东西,所以放“冷”了的就必须把它移除掉。
RequestCount和HitCount分别表示热缓存接收到的请求对象的次数,和缓存命中的次数――即无需IObjectRetriever加载而直接从缓存中返回对象的次数。这两个属性提供一些统计数据,以反映我们当前使用热缓存的价值究竟有多大,以此我们可以判断这个地方是否真的需要使用热缓存。
关于HotCache的具体实现,还需要注意以下几个方面:
(1)为了允许在多线程的环境中使用热缓存,所以HotCache必须在对内部的dictionary操作的时候进行加锁控制。
(2)热缓存在初始化(Initialize方法)时,启动循环引擎来定时检测缓存的每个对象的冷热程度。
(3)使用CachePackage类来封装每个被缓存的对象,其中主要是记录了被封装对象的最后一次访问时间。
(4)如果缓存中不存在目标对象、IObjectRetriever也加载不到目标对象,Get方法将返回null。
4. 使用时的注意事项
(1)有两种方式可以将对象添加到热缓存中,一种是热缓存借助IObjectRetriever自动加载对象;另一种是通过调用其Add方法加入。如果我们已经预计到某个对象是“热”对象,那么就可以先将其Add到热缓存中以备用。特别是,当IObjectRetriever获取这个对象比较费气力时:)。
(2)热缓存加速了对“热”对象的访问,但是这是以占用内存为代价的。如果你的对象访问比较平均,没有凸显出特别“热”的对象,那么使用热缓存的作用就不大了。
(3)当你确定不会再使用某个对象时,可以立即调用Remove方法将其从热缓存中手动移除,而不是等到其变“冷”后才被热缓存自动移除。当这样的对象比较多,而且对象比较大时,这样做可以立即释放比较大的内存空间。
(4)如果某个对象已经被判定为无效或者已被外界修改(缓存中的对象的数据已经是老版本),则可以调用Remove方法将其从热缓存中移除。
(5)MaxMuteSpanInMinutes属性设置为多少比较合适,取决于你的具体应用,也许是10分钟,也有可能是24小时。如果这个属性和DetectSpanInSecs属性、MaxCachedCount属性能进行合理搭配设置,则可以使得热缓存的运行价值最大化。
5.扩展
热缓存IHotCache暂时没有任何扩展。
注:ESBasic源码可到http://esbasic.codeplex.com/下载。
ESBasic讨论:37677395
ESBasic开源前言
分享到:
相关推荐
本人将 zhuweisky博主的博客整理成了PDF文件,以便于脱机浏览,没有经过博主的同意就这么做 实在是不好意思^-^ 现将其资料免费下载 以示对博主的尊重 源博客地址:...
.NET设计规范:约定、惯用法与模式,在.net环境下进行开发设计的经典之作,权威指导.
LiteGo:「迷你」的Android异步并发类库LiteGo是一款基于Java语言的「异步并发类库」,它的核心是一枚「迷你」并发器,它可以自由地设置同一时段的最大「并发」数量,等待「排队」线程数量,还可以设置「排队策略」...
新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。 本书提供配套光盘,内含Designing ...
NET应用架构设计原则、模式与实践.pdf NET应用架构设计原则、模式与实践.pdf
应用系统建立在此框架之上,采用构件式、可复用开发,节省开发成本,加快开发速度,在软件开发上更好的做到多快省。 适合低中高任意开发水平的开发者,可以开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后台、...
新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。 本书提供配套光盘,内含Designing ...
博文地址:http://blog.csdn.net/csnd_ayo/article/details/72457190
5.7.4 参数数量可变的成员 147 5.7.5 指针参数 150 5.8 小结 152 第6章 为扩展性而设计 153 6.1 扩展机制 153 6.1.1 非密封类 153 6.1.2 保护成员 155 6.1.3 事件与回调函数 156 6.1.4 虚成员 ...
自己写的ado.net类库,已实现有关数据库操作的各种方法,子类只需提供数据库连接,即可调用,极大了实现了代码复用.这是我针对实际开发中经常需要重复开发数据库操作而提出的解决方案. 注意,该类实现的是关于sqlserver...
这里收集一些著名的 C/C++ 开发库、SDK、类库、可复用类与结构代码 等信息,列举它们的介绍、参考和网站链接,为各位 C/C++ 程序员和爱好者提供检索和查阅类库的方便。 下面收集的 C/C++ 类库介绍整理来源于文章:...
自从.NET推出以来,他已使用.NET帮助很多行业的用户开发了体现其商业理念的软件产品.Xin Chen是.NET和EAI方面的专家,他与Microsoft和Accenture等多家技术领先的公司合作,为它们的客户提供了优秀的解决方案....
此外,还可以创建一个新类库实现软件复用。 • 第十章介绍.NET下的数据库支持,阐述了ADO.NET的基本概念和结构,并通过示例詊细介绍C#下Web Service数据库访问的方法。 • 第十一章将在以前的基础上介绍一个...
这些规范历经.NET框架三个版本的长期开发,凝聚了数千名开发人员的经验和智慧。微软的各开发组正在使用这些规范开发下一代影响世界的软件产品。 第1章 概述 1 1.1 精心设计的框架所具备的品质 2 1.1.1 精心...
Android应用源码开发Demo,主要用于毕业设计学习。
Android应用源码开发Demo,主要用于毕业设计学习。
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——...
CRMEB-DT小程序公众号h5商城v4.0.2商业版 美妆H5模版(多端合一) 手册:https://help.crmeb.net/crmeb-v4/1863402 演示:http://demo26.crmeb.net/admin/ ...7.组件化开发,可复用,开发便捷 8.可视化编辑快速装修主页