文章分类 -  ESBasic

摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2011/01/18/1937990.html1.缘起:本文所描述的TCP代理服务器工作于网络协议层次中的应用层,位于传输层之上。只要是以TCP的方式为客户提供服务的(包括我们的HTTP服务器,HTTP底层走的仍然是TCP),我们都可以在真正的TCP服务器前面增加代理服务器。 TCP代理服务器可以隐藏背后真正TCP服务器,如此便可以起到保护真正TCP服务器的作用。由于TCP代理服务器工作于应用层,所以,黑客对应用层以下级别的协议栈的攻击(比如TCP半连接攻击)就无法穿过TCP代理服务器,这样,即使TCP代. 阅读全文
posted @ 2013-04-04 22:33 ADTL 阅读(206) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/12/10/1901839.html(题外话:前面连续N篇介绍都是一些应用比较复杂的类,这篇来个简单易懂的)1.缘起: .NET Framework提供的Soap序列化的方式可以实现对象的xml序列化和反序列化(object <=> xml),但是它有三个缺点:(1)它要求对象的类型定义时必须打上[Serializable]标签,这是强侵入性的。(2).NET的Soap序列化与程序集的版本紧密关联,如果对象的类型定义没有发生变化,而仅仅是定义该类型的程序集版本发生了变化,那么反序列化( 阅读全文
posted @ 2013-04-04 22:32 ADTL 阅读(190) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/11/04/1868779.html1.缘起:在增量自动获取器章节的缘起部分,我们曾提到增量缓存,本节我们将深入探讨它以及用于管理增量缓存的管理器。我们还是以增量自动获取器章节提到的例子作为基础,并做更进一步的讨论。 OK,现在让我们开始这有趣的旅程。首先,基于前面例子给出的上下文,我们知道IIncreaseAutoRetriever获取的增量是用于累积当天的已成交订单报表的。“当天已成交报表”就是一个典型的增量缓存,每当有新的增量到来,都会累加到上面。我们假设今天是2009.07.08,那么我们 阅读全文
posted @ 2013-04-04 22:30 ADTL 阅读(122) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/10/06/1844662.html1.缘起:假设我们的订单报表系统,需要能够实时地统计当天的已成交订单的报表。最直观的解决方案就是,当每次接收到查询报表的请求时,就从存储设备读取当天所有已成交的订单,然后再进行分析计算给出结果。这是可行的,而且得到的结果也是非常实时的。但是,这种方式无疑也是非常低效的,因为我们报表数据的统计过程可能相当复杂,而且,可能是成千上万的用户在同时查询报表数据。在这种情况下,将给存储服务器和业务服务器都造成巨大的压力。现在我们假设需求能够放宽一点――报表数据不用非常实时 阅读全文
posted @ 2013-04-04 22:28 ADTL 阅读(134) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/06/30/1768133.html 1.缘起: 从IMultiTree到IAgileMultiTree,一切进展得都不错。但是,还有改进的地方。多叉树的一个优点在于,根据指定的节点能够非常迅速地找到其所有的子节点。但是缺点在于,根据节点值的ID定位到目标节点不够快,因为需要对所有的节点进行遍历操作。 阅读全文
posted @ 2013-04-04 22:27 ADTL 阅读(170) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/05/12/1733225.html1.缘起: 我们还是以多叉树IMultiTree章节介绍的那个例子来继续讲解。假设,在系统运行的过程中,集团又成立了分公司D及其下属的一些单位,这些资料已经被存入了数据库中,但是这些信息在我们当前正在运行的MultiTree实例中并不存在,如果此时向MultiTree实例请求与D分公司相关的信息,那么将一无所获。除非,你手动地将D分公司及其下属单位的节点值添加到MultiTree实例中。这是一个比较麻烦的动作。试着设想一下这样一种情况,当我们要请求的节点在当前M 阅读全文
posted @ 2013-04-04 22:26 ADTL 阅读(174) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/04/18/1714733.html1.缘起:假设我们要描述一个集团公司的组织结构,这个集团公司的体系分为如下几层:集团、公司、子公司、部门、小组。即一个集团由多个公司构成,每个公司又有几个子公司构成,每个子公司拥有多个部门,每个部门又内分为几个小组。很明显,这种体系结构就是一个多叉树。我设计了ESBasic.ObjectManagement.Trees.Multiple.IMultiTree来抽象多叉树,其提供了很多简便的方法让我们对多叉树进行节点查询和操作。多叉树的形象示意图如下: 从上图中. 阅读全文
posted @ 2013-04-04 22:25 ADTL 阅读(220) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/03/10/1682474.html1.缘起:当数据源中的数据量多到一定程度时,我们在查询时就经常使用分页策略。如果数据源是一个完整的整体,这没有什么大不了的,我们经常就在做类似的事情。但是,如果数据源不是一个完整的整体,而是由很多有序的片段构成的,并且不同的片段可能位于不同的位置(比如,位于不同的服务器节点上的内存中),甚至,每个片段内的数据还会随着时间的变化而变化的。在这种假设的情况下,来从这个“虚拟的完整”数据源获取某个分页就不再是那么简单的事情了。一个分页可能位于一个片段的内部的某个区间, 阅读全文
posted @ 2013-04-04 22:24 ADTL 阅读(152) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/01/05/1639445.html1.缘起:假设我们有一个订单系统,现在这个系统要增加一个功能――允许客人查核他认为有问题的订单的详细信息。当客人觉得自己的某个订单不对劲时,他首先会从订单系统查询这个订单的详细信息,然后打电话告诉我们的客服有问题的订单的编号,客服再去查核,如果属实,客服还要进一步上报,如果该订单非常重要,则可能需要更进一步上报复查等。 从这个需求我们看到,同一个订单可能会在比较短的时间内查询数次甚至数十次,所以我们可以称这个订单为“热点”订单。而其它的成千上万的订单可能在一个月 阅读全文
posted @ 2013-04-04 22:23 ADTL 阅读(193) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2010/01/18/1650373.html1.缘起:假设我们的会员管理系统有一个排行榜的功能,需要每隔一段时间就对系统中的所有会员(假设会员数有100万)的积分进行排序,然后对其中的前100名进行某些奖励。这是一个典型的TopN算法――对巨大数量的对象进行排序,然后只需要取出最Top的前N名(N比对象总数小很多),作为排行榜的数据。解决这样的问题,我们要注意一点,如果我们每次都对所有的对象进行完全排序,那无疑效率非常低下,而且非常不划算。因为我们只需要前N名,而不是所有对象的先后顺序。我设计了ESBas 阅读全文
posted @ 2013-04-04 22:23 ADTL 阅读(134) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/12/10/1620808.html1.缘起:ESBasic中许多管理对象的容器都用到了这个ESBasic.ObjectManagement.IObjectRetriever接口,所以单独将其提出来介绍一下。当我们向对象容器(Container)请求某个对象时,也许目标对象还未加载到容器中,这可能是因为容器在初始化的时候就没有加载这个对象,也有可能是因为这个对象是容器初始化以后新增到数据库(当然也有可能是其它的持久化存储)的。在这种情况下,对象容器就可以借助IObjectRetriever来将目标 阅读全文
posted @ 2013-04-04 22:22 ADTL 阅读(105) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/12/21/1629142.html1.缘起:假设我们有一个会员管理系统,需要向各方提供查询会员基础资料的功能。会员一经注册,其基础资料就将不再发生变化(如会员帐号、身份证ID、注册时间等等)。基于这样的需求,我们可以将会员的基础资料“永久地”缓存在内存中,从而提升对任何一个会员基础资料的查询速度。我设计了ESBasic.ObjectManagement.Cache.ISmartDictionaryCache来对这种性质的对象进行缓存。 职能字典缓存的形象示意图如下:2.适用场合:在使用ISmar 阅读全文
posted @ 2013-04-04 22:22 ADTL 阅读(164) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/11/21/1607429.html1.缘起:为了提升系统的性能或减轻数据库的压力等原因,我们经常在系统中使用缓存来把那些经常使用的数据保留在内存中。如果因为某些原因,缓存中这些经常使用的数据不能及时与数据源进行同步更新,那么采用定时刷新缓存中的数据有可能就是一种合适的选择。如果你的缓存是定时刷新,那么你就需要自己为其维护一个定时器或循环引擎。如果你的系统中像这样定时刷新的缓存有多个,而且每个缓存定时刷新的时间间隔又要求不一样,那么,使这些缓存按照你预想的情况进行运转,你就需要花费一些气力。我设计 阅读全文
posted @ 2013-04-04 22:21 ADTL 阅读(832) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/11/11/1600660.html1.缘起:对象池应该是一个“历史悠久”的概念了,像我们经常说的线程池、还有ADO.NET中的数据库连接池等,都属于对象池的应用。我们的应用有时也会碰到需要使用对象池的情况,我举个例子说明一下。假设,我们需要记录某个类MyClass的每个方法每次被调用时方法执行所消耗的时间,而且,这个类是使用在多线程的环境中的,每个方法都可以同时在多个线程中执行,不需要被同步,这样可以使并发达到最大。好,我们可以使用Stopwatch这个类来准确地记录每个方法的时间,关键是怎么使 阅读全文
posted @ 2013-04-04 22:20 ADTL 阅读(123) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/11/04/1596021.html1.缘起:假设我们的订单处理系统所要处理的订单是有优先级的,也就是说,不同的订单类型所要求被处理的紧迫程度不同,对那些优先级高的注单要先处理,对于优先级低的注单可稍后处理。对于处于同一优先级的订单了,就按照其到达的先后顺序进行处理。这是一个典型的管理具有优先级的对象的需求,注单就是具有优先级(With Priority)的对象。我设计了ESBasic.ObjectManagement.Managers.IPriorityManager优先级管理器(确切地说,应该 阅读全文
posted @ 2013-04-04 22:19 ADTL 阅读(115) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/10/21/1587280.html1.缘起:我们经常需要对一些动态对象进行管理,最常见的例子就是在线用户管理。当一个用户成功登陆到服务器后,我们就需要将其管理起来;当他退出后,就不再需要再管理他了。这就是所谓动态对象的含义,这些对象并不是一直需要被管理,只有当其被激活后,才需要被管理。它们总是在“激活”状态和“非激活”状态之间不断地切换。我设计了对象管理器ESBasic.ObjectManagement.Managers.IObjectManager来管理类似的动态对象。这个类是ESBasic提 阅读全文
posted @ 2013-04-04 22:18 ADTL 阅读(175) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/10/27/1590682.html1.缘起: 假设我们的订单系统需要管理所有未处理的订单,而客人经常需要查询属于自己的未处理的订单列表。另外,可能客服人员也需要根据订单ID迅速地找到对应的未处理订单。基于第一个需求,我们就可以将未处理的订单依据客人的帐号进行分组管理。我设计了ESBasic.ObjectManagement.Managers.IGroupingObjectManager分组对象管理器来完成对对象进行分组管理的功能。 分组对象管理器的形象示意图如下:2.适用场合:当你的需求覆盖以下 阅读全文
posted @ 2013-04-04 22:18 ADTL 阅读(195) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/10/10/1580354.html1.缘起:对于需要进行线程同步的地方,我们经常用的就是.NET内置的lock关键字和ReaderWriterLock类。lock的功能相对简单,因为它不区分读写,也就是说如果都在lock块中,读线程都会阻塞另一个读线程,在很多读远远多于写的应用中,这会极大地折损性能。所以我们也经常需要使用读写分离的锁ReaderWriterLock,使用它,我们可以明确的指定是要获取“读”锁还是“写”锁。而且,当前的“读”线程是不会阻塞其它的“读”线程的。lock的使用非常简洁 阅读全文
posted @ 2013-04-04 22:17 ADTL 阅读(162) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/10/15/1583723.html1.缘起:假设我们的用户管理系统要求用户的ID和Name都必须是唯一的,并且用户的ID和Name一经确定就不能被修改。而且管理系统经常需要根据ID来查找Name,也经常需要根据Name来查找ID。根据这样的需求,我们可以考虑使用一个Dictionary来将ID和Name缓存起来,通常ID作为Key,Name作为Value。这样便可实现通过ID查询Name的快速查找,但是,通过Name查找ID就不是那么快了,因为涉及到对Dictionary的Values做遍历的操 阅读全文
posted @ 2013-04-04 22:17 ADTL 阅读(116) 评论(0) 推荐(0)
摘要:转自:http://www.cnblogs.com/zhuweisky/archive/2009/09/30/1576733.html1.缘起:假设我们的C/S系统中服务端与客户端之间采用UDP进行通信,那么服务端如何知道每个客户端当前是否仍然在线了?有可能某个客户端一直没有退出,但是在很长一段时间内都没有与服务端作任何通信,那么服务端就应该认为这个客户端已经离线了吗?为了能让服务端掌握每个客户端是否在线的状态,我们可以这样做,只要客户端一启动起来,就每隔一段时间间隔(如10秒)就向服务端发一个“我还在线”的消息,以表明自己的状态。而服务端如果在一个更大的时间间隔内(如20秒)都没有收到某个客 阅读全文
posted @ 2013-04-04 22:16 ADTL 阅读(162) 评论(0) 推荐(0)