A2D中一项功能是关于Cache的,能够将判断、获取、删除cache的代码缩减到最少量,如下是Order业务逻辑的demo示范:
interface IOrder { [Cachable("Order.GetMessage", "Default", ExpireType = CacheExpireType.Absolutely, Increment = 5)] string GetMessage(); [CacheEvict("Order.GetMessage", "Default")] void UpdateMessage(string userInput); } [AOPServiceEnabled] class OrderImpl : ContextBoundObject, IOrder { private string msg = "not changed message"; public string GetMessage() {
Thread.Sleep(2000); //模仿重负载处理,延时2秒 return string.Format("{0}-{1}", msg, DateTime.Now); } public void UpdateMessage(string userInput) { msg = userInput; } }
在OrderImpl(业务逻辑实现类)中,没有看到判断、更新、获取cache的代码,非常简洁(控制cache的代码写在了接口部分)。
那如何调用这个Order逻辑呢?
ObjectFactory.Register<IOrder, OrderImpl>(); //IoC注册 var o1 = ObjectFactory.Resolve<IOrder>(); //获取IOrder实例
ObjectFactory是A2D的IoC控制器,能进行两种方式的注入:普通Instance以及单例。
看看主demo程序:
static void Main(string[] args) { A2DConfig.LoadConfig(); //A2D的配置文件,稍后给出 ObjectFactory.Register<IOrder, OrderImpl>(); var o1 = ObjectFactory.Resolve<IOrder>(); int i = 1; while (true) { if (i % 11==0) o1.UpdateMessage("changed at"+DateTime.Now); //调用这个函数后,会强制delete GetMessage所对应的缓存 Thread.Sleep(1000); Console.WriteLine(o1.GetMessage()); i++; } }
运行效果图:
下面是A2D的配置文件:
<?xml version="1.0" encoding="utf-8" ?> <A2D> <CacheStorages> <Storage Location="Default" Scope="PerSession"> <!--PerSession/Global--> <!--相当于1级缓存(本地, 没有网络I/O)--> <LocalCacheSetting> <CacheAlgorithm>LFU</CacheAlgorithm><!--LFU/LRU/None--> <CacheCapacity>1000</CacheCapacity> </LocalCacheSetting> </Storage> </CacheStorages> <EventSetting> <!--客户端的名称,需要发往event server--> <Identifier>app server name 1</Identifier> <RetryConnectInterval>1000</RetryConnectInterval> <!--要连接的event server信息--> <EventServer> <Enabled>false</Enabled> <Address>127.0.0.1</Address> <Port>202020</Port> </EventServer> <!--订阅的事件以及响应事件的class type定义--> <!--缓存系统的事件支持 START--> <EventPair> <WhenList> <When>A2DFramework.CacheService.CacheEvents.CachePutEvent</When> </WhenList> <ThenList> <Then>A2DFramework.CacheService.CacheEventHandlers.CachePutEventHandler</Then> </ThenList> </EventPair> <EventPair> <WhenList> <When>A2DFramework.CacheService.CacheEvents.CacheRemovedEvent</When> </WhenList> <ThenList> <Then>A2DFramework.CacheService.CacheEventHandlers.CacheRemovedEventHandler</Then> </ThenList> </EventPair> <!--缓存系统的事件支持 END--> </EventSetting> </A2D>
CacheStorage节点中的Storage节点可以有多个,目前只定义了一个节点:Default, 这个Default要与IOrder中的Cachable标签中的参数对应起来
EventSetting节点不能省略,因为缓存子系统依赖于事件子系统。
本demo程序已经更新到A2D中了:
A2D Framework网址:https://a2d.codeplex.com/SourceControl/latest
如何下载:
一直计划做一个计算机知识体系的系列文章,目的是将自己学过的计算机知识融会贯通,也算是给自己学习计算机以来的一个总结;同时给周围那些同我一样不是计算机专业出身的人一些帮助,让他们能够少走弯路,通过这一系列的文章来尽快的系统的补充完整自己的技术死角。
自己学习的时候,走过很多弯路,比如在不懂汇编的时候竟然拿一本编译原理在看,这种不符合学习顺序的事情希望通过这系列文章不要继续发生在更多人身上。我会结合自己的学习经验和工作经验来讲我所知道的东西通过这一系列的文章来表达出来,将自己认为最有效的学习顺序以及学习内容告诉那些需要的人,希望能够帮助周围的朋友同时以及文章前面的你少走一些弯路。如果你自认为计算机知识掌握的已经很全面了,那这些文章不适合你,还请飘过。当然 你也可以“温故而知新”。
我认为每一名程序员,无论是php还是java c,都应该对 计算机知识进行系统的学习,纵然不能做到精通,但一定要做到熟知。我认为有如下方面
1.假如我们就根本不知道一些知识存在,那我们永远没有办法将其纳入我们的思维中来。举个最简单的例子,假如我们不了解数据结构,我们就不会去思考该选择哪种数据结构,使用链表还是用数组,因为我们不知道数据结构的存在。所以为了将系统设计的更合理更健壮,我们也应该熟悉基础知识体系。
2.在我们研发过程中出现问题时,假如我们的知识体系不完善,我们就没有办法去想到解决方案,甚至无法确定问题的存在。比如 当一个php-cgi占用cpu很高,假如我们不知道strace可以查看进程中的系统调用,我们除了重启cgi,别的什么都干不了。所以为了我们能够更全面的解决问题,我们也应该系统的去了解这些知识。
3.在我们学习新东西的时候,如果我们的知识体系很完善,我们学习起来会更容易会更快。比如 我们学习memcache redis,其实就是一个管理内存分配调度存储的程序,不同之处就是redis可以持久化到硬盘上。当然这是原理 细节肯定很多,这里要说的是完善的知识体系会帮助我们更快的学习和掌握新技术。
4.如果我们打算做程序员做研发,那我们就应该有一个很完善的技术知识体系,难道我们做了好多年,我们连那些应届生都知道的东西我们竟然不知道,那就太惨了。所以为了对得起自己程序员的这个职业,我们也应该去系统的学习。
5.如果你的知识够全面,考虑问题更周全,解决问题更迅速,学习新知识更快捷,能常人之不能,那么你的薪资待遇也应该是不错的。所以为了你能够活的更好,你也应该好好去学习。艺多不压身,这个社会上没有慈善组织,我们只有凭借我们自己的技能拿到更高的待遇,从而过得更好,获得幸福。
整个系列文章会分为三个阶段,基础篇、进阶篇、高级篇。
基础篇:包括 计算机组成原理、计算机网络及应用、汇编语言、编译原理、操作系统、数据结构、c语言、c++ 等基础知识、 linux操作系统。通过计算机组成原理了解计算机硬件的作用,通过计算机网络了解各种网络协议的原理及应用,通过汇编语言了解cpu的工作运算处理原理以及为编译原理的学习打点基础,通过对操作系统的学习来了解硬件资源分配、进程调度以及与程序开发的关系,知道当我们按下一个键的时候具体发生了什么,了解显卡cpu内存硬盘工作关系。通过c、c++来学习数据结构,帮助我们更好的理解数据结构,也为我们开发或学习开源代码提供基础,通过学习linux系统管理来开始学习伟大的linux。
基础篇我们所应该达到的目标应该是对整个计算机基础知识体系有了一个很全面的了解,现阶段了解熟知就可以。这为我们以后的学习和工作打下了良好的基础,其实新技术新功能都是在这些基础上不断的组合出来的,我们要做到以不变应万变,这才是根基,这才是最重要的东西。我们应该好好掌握。
进阶篇:这里面应该是一些对基础篇一些具体的应用去做一些剖析,以及工作经验的一些总结,比如 mysql数据库管理以及优化、nginx的应用、php的应用以及优化、vim编辑器的使用、svn git 等版本控制的使用,shell脚本的编写。
进阶篇应是一些总结和应用,在我们平时工作中用到的遇到的一些东西的总结和应用,对我们平时的工作应该有所帮助。
高级篇:这里面对一些技术做一些源码分析,比如php源代码的分析,nginx源代码的分析,sphinx搜索引擎的源码分析,这里面几乎要用到基础篇的所有知识,一些原理还有一些语言 如汇编这种低级语言 c、c++高级语言来帮我们阅读以及分析这些优秀开源产品的源代码。
高级篇对一些比较成熟的产品进行了源码解析,能够在帮助我们熟悉这些开源产品的功能的同时,又能增加我们对基础知识的巩固以及应用,也学习到了那些高手们的开发经验。这个阶段后我们开发一些底层的东西 如文件系统 内存管理系统 开发这些底层应用应该是没有问题的了。
文章序号排列:比如“基础篇的第一章第一节”的文章序号就是1-1.1 “进阶篇的第二章第三节”的文章序号就是2-2.3 “高级篇的第8张第一节”的文章序号就是3-3.1。
这件事情一直一拖再拖,写这篇文章第一是为这个系列写个前言正式开始实施这个计划,第二也是给自己一些压力,有压力才有动力,希望能够尽快的完成这件事情。
在这里向大家承诺,以后每周最少要为这个系列写一篇文章(节假日除外),否则 你们可以拿出你们一点宝贵的时间来给我写邮件骂我侮辱我鄙视我都可以,我的邮箱是[email protected]。