遍历计时器的方法及装置的制造方法
【技术领域】
[0001]本发明涉及互联网技术领域,尤其涉及一种遍历计时器的方法及装置。
【背景技术】
[0002]终端在向服务器请求数据时,服务器会对数据库进行访问,从数据库中获取终端请求的数据内容并返回给终端。由于每次请求都会访问数据库,因此当请求并发数较大时,会对数据库造成比较大的访问压力。为降低数据库的访问压力,工程人员对现有技术进行了改进,将从数据库中获取的数据缓存在服务器内存中。当终端发起数据请求时,服务器在内存中查找终端请求的数据,如果查找到该数据则直接返回给终端,由此减少数据库的访问次数。
[0003]通常,服务器端内存资源是十分宝贵的,无法将数据永久地存储在服务器内存中。因此现有技术为内存中的数据建立了有效期机制,即为不同的数据设置不同的有效期,这个有效期是一个时长值,用以表征数据在内存中保存的时间长短。为监控数据是否过期,月艮务器需要为内存中的每条数据设置一个计时器(Timer),将上述有效期时长设置为计时器的计时时长。如果计时器到时,则触发计时器事件,将对应的数据从内存中删除。
[0004]为及时释放计时器任务,节省服务器的处理资源,服务器需要定期对计时器进行遍历,查找并关闭到时的计时器。通常服务器遍历计时器的周期为计时器的最小计时单位,例如I秒或10毫秒。也就是说,服务器会每隔I秒(甚至更短)对内存中所有的计时器进行一次遍历。现有技术中,计时器列表是按照计时器建立的先后顺序对所有计时器进行保存的。服务器每次遍历计时器时,都需要将当前的系统时刻值与计时器列表中的每一个计时器的到时时刻值进行一次比对,关闭到时时刻值小于当前系统时刻值的计时器。这种遍历计时器的方式效率非常低,实际应用中,当服务器内存中保存的数据较多时(例如十万甚至百万级别的数据),服务器每次都需要对十万百万个计时器进行遍历,这会占用服务器的大量处理资源,严重影响服务器性能。
【发明内容】
[0005]本发明提供了一种遍历计时器的方法及装置,能够解决计时器遍历效率低下的问题。
[0006]为解决上述问题,一方面,本发明提供了一种遍历计时器的方法,该方法包括:
[0007]构建计时器二叉树,计时器二叉树的节点数值为计时器的到时时刻值,节点数值大于父节点数值的子节点为父节点的右子节点,节点数值小于父节点数值的子节点为父节点的左子节点;
[0008]从根节点开始遍历,查找节点数值小于等于当前时刻值的目标节点;
[0009]关闭目标节点对应的计时器。
[0010]另一方面,本发明还提供了一种遍历计时器的装置,该装置包括:
[0011]构建单元,用于构建计时器二叉树,计时器二叉树的节点数值为计时器的到时时刻值,节点数值大于父节点数值的子节点为父节点的右子节点,节点数值小于父节点数值的子节点为父节点的左子节点;
[0012]遍历单元,用于从根节点开始遍历,查找节点数值小于等于当前时刻值的目标节占.V ,
[0013]处理单元,用于关闭目标节点对应的计时器。
[0014]本发明提供的遍历计时器的方法及装置,能够根据计时器到时时刻值的大小构建计时器二叉树,其中,节点数值大于父节点数值的子节点为父节点的右子节点,节点数值小于父节点数值的子节点为父节点的左子节点。在遍历计时器时,通过对计时器二叉树的遍历查找到时的计时器。本发明中,计时器二叉树根据节点数值的大小构建左右分支,当遍历到计时器到时的节点时,可以将该节点左侧分支的所有下级节点全部确定为目标节点,而无需继续对这些节点依次进行遍历。与现有技术相比,本发明能够大大减少计时器的遍历次数,提高计时器的遍历效率,节省服务器的处理资源。
[0015]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【附图说明】
[0016]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0017]图1示出了本发明实施例提供的一种遍历计时器的方法流程图;
[0018]图2a示出了本发明实施例提供的一种在计时器二叉树中新增节点的示意图;
[0019]图2b示出了本发明实施例提供的一种遍历计时器二叉树的示意图;
[0020]图3示出了本发明实施例提供的另一种遍历计时器的方法流程图;
[0021 ]图4a示出了本发明实施例提供的一种计时器二叉树的示意图;
[0022]图4b示出了本发明实施例提供的另一种在计时器二叉树中新增节点的示意图;
[0023]图4c示出了本发明实施例提供的又一种在计时器二叉树中新增节点的示意图;
[0024]图4d示出了本发明实施例提供的一种对计时器二叉树进行重新排序的示意图;
[0025]图5示出了本发明实施例提供的一种遍历计时器的装置的组成框图;
[0026]图6示出了本发明实施例提供的另一种遍历计时器的装置的组成框图。
【具体实施方式】
[0027]下面将参照附图更详细地描述本发明公开的示例性实施例。虽然附图中显示了本发明公开的示例性实施例,然而应当理解,可以以各种形式实现本发明公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明公开的范围完整的传达给本领域的技术人员。
[0028]本发明实施例提供了一种遍历计时器的方法,该方法应用于服务器一侧,主要用于对服务器内存使用的计时器进行遍历。如图1所示,该方法包括:
[0029]101、构建计时器二叉树。
[0030]服务器为每一条缓存的数据对应启动一个计时器,计时器的启动时刻为数据存入到内存中的时刻,计时器的计时时长为数据的有效时长,而数据的有效时长又由数据的重要程度、请求频率等因素决定,从几秒钟到几个小时不等,不同数据的计时时长可以不同。从计时器的启动时刻开始,经过计时时长后的时刻值,为计时器的到时时刻值。
[0031]例如某条数据在13:04:12存入到内存中,服务器在13:04:12启动计时器,计时器的计时时长为I分钟,那么计时器的到时时刻值为13:05:12ο
[0032]本实施例中,服务器创建计时器二叉树,该二叉树用于记录所有计时器的到时时刻值。其中,二叉树的节点数量与服务器启动的计时器数量相同,每个节点用于记录一个计时器的到时时刻值。在节点排序上,本实施例采用“左小右大”的规则(实际应用中也可以使用“左大右小”规则),从二叉树的根节点开始遍历,将节点数值比父节点小的子节点,排列在父节点的左侧分支,将节点数值比父节点大的子节点,排列在父节点的右侧分支。每当新启动一个计时器时,服务器就从根节点开始进行一次遍历,确定新增节点的位置,将新增节点添加到计时器二叉树中。
[0033]示例性的,一个简单的计时器二叉树可以如图2a所示。其中,计时器二叉树的每个节点对应一个计时器,节点数值为计时器的到时时刻值,为便于理解,本示例将到时时刻值简化为数字形式的时刻值。节点数值大于父节点数值的子节点排列到父节点的右侧分支,作为父节点的右子节点;节点数值小于父节点数值的子节点排列到父节点的左侧分支,作为父节点的左子节点。对于任意一个节点而言,其左侧分支下的所有节点的节点数值均小于该节点的节点数值,其右侧分支下的所有节点的节点数值均大于该节点的节点数值。
[0034]当增加新节点时,服务器从根节点开始将新增节点的节点数值与各个节点的节点数值依次进行比较,当新增节点数值大于当前遍历节点数值时,向当前遍历节点的右侧分支继续遍历,当新增节点数值小于当前遍历节点数值时,向当前遍历节点的左侧分支继续遍历,直至不存在可比对的节点为止,得到新增节点的位置。在图2a中,新增节点“2.8”的遍历顺序如图中虚线所示。
[0035]102、从根节点