本发明涉及树数据缓存查询技术领域,特别涉及一种树结构资源存储、查询的方法和装置。
背景技术:
在监控系统中可监控故障产生的实体,如主机、CPU、表空间等称为资源。通常业务系统由数据库、主机等资源构成,主机本身也有子资源,如内存,cpu等。这些资源在监控过程中通常会产生大量的告警事件,即资源产生故障的信息。例如主机本身会有如“连接断开”,“cpu使用率过高”等事件,而其各子资源也会有自己的告警事件,如主机的子资源内存的“内存页数过高”事件。在IT监控系统中,所监控的资源通常存在树结构关系,如图1所示,图1左列为树结构关系的资源构成资源树的示例,图1右列为资源产生的历史告警事件的示例。
用户在查询事件时,通常希望能够查询出所选资源及其各子资源的所有的告警事件。但由于监控资源数量庞大,则其资源对应的历史告警事件数量因为时间的累计更庞大。那么对于资源多、事件多的情况下,对历史事件进行条件查询时,对于百万、千万以上的事件信息,通过传统的数据库方式进行结构化查询语言(Structured Query Language,SQL)查询,性能极其缓慢,用户体验很差。
现有的提高查询性能方案是:用户对于资源事件的查询通常都是关注1~2个月内的数据,将2个月内的告警事件以列表数据提前加载到内存中,在查询时,通过遍历这些缓存列表,提高事件查询的速度。现有的这种方案是通过缓存方式,查询性能虽然高于数据库SQL查询方式,但是针对树节点资源查询时需要遍历整个事件列表,在树节点深度较长时,需要大量的递归遍历子资源事件的情况,在数据量巨大时,性能表现也不尽人意。
技术实现要素:
本发明提供了一种树结构资源存储、查询的方法和装置,能够有效地提高数据量巨大时的事件查询速度。
为达到上述目的,本发明的技术方案是这样实现的:
一方面,本发明提供了一种树结构资源存储的方法,包括:
通过前序遍历算法遍历树结构资源;
将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中;并在一个位置哈希表中记录各个资源在所述事件列表中的起始位置和事件数量;其中所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和。
其中,在通过前序遍历算法遍历树结构资源之前,所述方法还包括:
建立一个空的事件列表,用于按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;
建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
将树结构资源的事件数据加载到缓存中。
其中,所述将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中;并在一个位置哈希表中记录各个资源在所述事件列表中的起始位置和事件数量包括:
前序遍历树结构资源时,将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
在所述位置哈希表中记录该当前资源的起始位置和事件数量;
如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
相应于上述的树结构资源存储的方法,本发明提供了一种树结构资源存储的装置,包括:
前序遍历模块,用于通过前序遍历算法遍历树结构资源;
存储单元,用于将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中,并在一个位置哈希表中记录各个资源在所述事件列表中的起始位置和事件数量;其中所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和。
可选地,所述装置还包括:
建表模块,用于建立一个空的事件列表,以按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;以及建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
加载模块,用于在通过前序遍历算法遍历树结构资源之前,将树结构资源的事件数据加载到缓存中。
其中,所述存储单元包括:
数据添加模块,用于前序遍历树结构资源时,将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
位置记录模块,用于在所述位置哈希表中记录该当前资源的起始位置和事件数量;
数量更新模块,用于如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
本发明提供的树结构资源存储的方法和装置的有益效果:
本发明通过前序遍历算法遍历树结构资源,将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中,并在一个位置哈希表中记录各个资源在该事件列表中的起始位置和事件数量,保证了各个资源自身的事件数据与其各子资源的事件数据的连续存储,并可依据各个资源自身的事件数量和其各子资源的事件数量之和方便地统计出各个资源的事件数量;从而在需要查询资源时,能够非常简便地在位置哈希表中查询出待查询资源在事件列表中的起始位置和事件数量,然后在所述事件列表中直接截取出该待查询资源及其各子资源的事件数据。
另一方面,本发明提供了一种树结构资源查询的方法,包括:
获取预先存储的树结构资源的事件列表和位置哈希表,其中,所述事件列表中存储有通过前序遍历算法遍历树结构资源时依次遍历出的各个资源及其各子资源的事件数据,所述位置哈希表中记录有各个资源在所述事件列表中的起始位置和事件数量;所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和;
在所述位置哈希表中查询待查询资源在所述事件列表中的起始位置和事件数量;
根据查询出的起始位置和事件数量,在所述事件列表中截取出该待查询资源及其各子资源的事件数据。
上述方法还包括预先存储树结构资源的事件列表和位置哈希表,所述预先存储树结构资源的事件列表和位置哈希表包括:
建立一个空的事件列表,用于按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;
建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
将树结构资源的事件数据加载到缓存中;
通过前序遍历算法遍历树结构资源;
将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
在所述位置哈希表中记录该当前资源的起始位置和事件数量;
如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
相应于上述的树结构资源查询的方法,本发明提供了一种树结构资源查询的装置,包括:
初始化单元,预先获取树结构资源的事件列表和位置哈希表,其中,所述事件列表中存储有通过前序遍历算法遍历树结构资源时依次遍历出的各个资源及其各子资源的事件数据,所述位置哈希表中记录有各个资源在所述事件列表中的起始位置和事件数量;所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和;
查询单元,用于在所述位置哈希表中查询待查询资源在所述事件列表中的起始位置和事件数量;
截取单元,用于根据查询出的起始位置和事件数量,在所述事件列表中截取出该待查询资源及其各子资源的事件数据。
其中,所述初始化单元还包括:
建表模块,用于建立一个空的事件列表,以按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;以及建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
加载模块,用于将树结构资源的事件数据加载到缓存中;
前序遍历模块,用于通过前序遍历算法遍历树结构资源;
数据添加模块,用于前序遍历树结构资源时,将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
位置记录模块,用于在所述位置哈希表中记录该当前资源的起始位置和事件数量;
数量更新模块,用于如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
本发明提供的树结构资源查询的方法和装置的有益效果:
通过预先获取树结构资源的事件列表和位置哈希表,由于该事件列表和位置哈希表是在通过前序遍历算法遍历树结构资源时获取,将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在该事件列表中,并在该位置哈希表中记录各个资源在该事件列表中的起始位置和事件数量,保证了各个资源自身的事件数据与其各子资源的事件数据的连续存储,并可依据各个资源自身的事件数量和其各子资源的事件数量之和方便地统计出各个资源的事件数量;从而在需要查询资源时,能够非常简便地在位置哈希表中查询出待查询资源在事件列表中的起始位置和事件数量,然后在所述事件列表中直接截取出该待查询资源及其各子资源的事件数据,有效地提高了数据量巨大时的事件查询速度。
附图说明
图1为树结构资源及其历史告警事件的示例;
图2为本发明实施例提供的一种树结构资源存储的方法流程图;
图3为一个树结构资源示例;
图4为图3所示的数结构资源中各个资源包括的事件数据示例;
图5为本发明实施例提供的另一种树结构资源存储的方法流程图;
图6为本发明实施例提供的一种树结构资源存储的装置结构图;
图7为本发明实施例提供的一种树结构资源查询的方法流程图;
图8为本发明实施例提供的一种树结构资源查询的装置结构图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
本发明的整体思路是:通过前序遍历算法遍历资源树,将树结构资源的事件数据查出,按照前序遍历的顺序放到事件列表中,同时通过位置哈希表记录资源的事件起始位置和事件数量,这样构建出事件列表和位置哈希表,在查询时通过起始位置和事件数量可以直接截取出所要查询的事件数据。
如图2所示,本发明实施例提供的一种树结构资源存储的方法,该方法主要包括如下步骤:
S210,通过前序遍历算法遍历树结构资源。
树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次。树的3种最重要的遍历方式分别称为前序遍历、中序遍历和后序遍历。
前序遍历是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。需要注意的是:遍历左右子树时仍然采用前序遍历方法。
图3为一个树结构资源示例,以图3所示的深度3的二叉树(7个树节点)的树结构资源为例,包括A、B、C、D、E、F、G七个资源,采用前序遍历算法遍历资源的顺序为:A->C->F->G->E->B->D。
S220,将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中;并在一个位置哈希表中记录各个资源在所述事件列表中的起始位置和事件数量;其中所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和。
需要说明的是,在通过前序遍历算法遍历树结构资源之前,本发明实施例的方法还包括:
建立一个空的事件列表,用于按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;
建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
将树结构资源的事件数据加载到缓存中。
下面采用示例数据说明位置哈希表:
{
“100”:[0,20],//--100是键名,[0,20]是键值
“101”:[15,5],
“102”:[20,3]
}
其中100,101,102是资源ID,资源100的事件起始位置为0,长度20;资源101的事件起始位置为15,长度为5;资源102的事件起始位置为20,长度为3。资源100的长度包含了资源101的位置和长度,表示资源101是资源100的子资源。
本步骤S220具体包括:
前序遍历树结构资源时,将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到事件列表的尾部;
在位置哈希表中记录该当前资源的起始位置和事件数量;
如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新位置哈希表中该当前资源的事件数量。此处的事件数量为各个资源自身的事件数量与其各子资源的事件数量之和。
以图3所示的树结构资源为例,假若其各个资源包括的事件数据如图4所示。其中,资源A包括A1、A2事件数据,资源B包括B1事件数据,资源C包括C1、C2、C3事件数据,资源D包括D1事件数据,资源E包括E1事件数据,资源F包括F1、F2事件数据,资源G包括G1事件数据。
将遍历出的各个资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中,得到的事件列表信息为:
{A1,A2,C1,C2,C3,F1,F2,G1,E1,B1,D1}。
在一个位置哈希表中记录各个资源在上述事件列表中的起始位置和事件数量,得到的位置哈希表信息(起始位置是索引号,0开始)为:
{
A:[0,11],
B:[9,2],
C:[2,7],
D:[10,1],
E:[5,1],
F:[6,3],
G:[8,1]
}下面以资源的历史告警事件存储为例,本发明实施例提供的树结构资源存储的方法流程如图5所示,包括如下步骤:
S500,建立一个空的事件列表和一个空的位置哈希表。
S501,将资源数据从数据库中加载到缓存中。
需要说明的是,本步骤只是在历史告警事件变动,或间隔一定周期重启系统时,才将资源数据加载到缓存中。
S502,选择资源树根节点。
S503,处理当前资源。
S504,从数据库中查询当前资源的历史告警事件。
S505,将查询出历史告警事件添加到事件列表的尾部。
S506,获取当前资源的事件数量及在事件列表的起始位置,在位置哈希表中记录该当前资源的起始位置和事件数量。
S507,判断当前资源的全部子资源是否遍历完?如果是,进入步骤S508,如果否,进入步骤S509。
S508,使用当前资源的事件数量加上各子资源的事件数量来更新位置哈希表中该当前资源的事件数量。
S509,继续前序遍历资源树。
基于上述的树结构资源存储的方法,本发明实施例提供了一种树结构资源存储的装置,如图6所示,包括:
建表模块601,用于建立一个空的事件列表,用于按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;以及建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
加载模块602,用于在通过前序遍历算法遍历树结构资源之前,将树结构资源的事件数据加载到缓存中。
前序遍历模块610,用于通过前序遍历算法遍历树结构资源。
存储单元62,用于将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中,并在一个位置哈希表中记录各个资源在所述事件列表中的起始位置和事件数量;此处的事件数量为各个资源自身的事件数量与其各子资源的事件数量之和。
其中,所述存储单元62包括:
数据添加模块621,用于前序遍历树结构资源时,将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
位置记录模块622,用于在所述位置哈希表中记录该当前资源的起始位置和事件数量;
数量更新模块623,用于如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
由此可知,本发明实施例提供的树结构资源存储的方法和装置,通过前序遍历算法遍历树结构资源,将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在一个事件列表中,并在一个位置哈希表中记录各个资源在该事件列表中的起始位置和事件数量,保证了各个资源自身的事件数据与其各子资源的事件数据的连续存储,并可依据各个资源自身的事件数量和其各子资源的事件数量之和方便地统计出各个资源的事件数量;从而在需要查询资源时,能够非常简便地在位置哈希表中查询出待查询资源在事件列表中的起始位置和事件数量,然后在所述事件列表中直接截取出该待查询资源及其各子资源的事件数据,有效地提高了数据量巨大时的事件查询速度。
下面以深度3的二叉树(7个树节点)具体举例:
现有查询方案针对每个节点资源查询事件的次数:
深度1资源:资源数量1,遍历出所有子资源(6个),查询自己及所有子资源的事件(7次),合并事件;
深度2资源:资源数量2,遍历出所有子资源(2个),查询自己及所有子资源的事件(3次),合并事件;
深度3资源:资源数量4,查询资源的事件(1次);
综上,平均查询一个资源的动作:
查询子资源1次,查询资源事件(7+3*2+4*1)/7=17/7,合并事件1次。
以此方法计算,其他深度平均事件查询次数:
深度2:(3*1+1*2)/3=5/3=1.67;
深度4:(15*1+7*2+3*4+1*8)/15=49/15=3.27;
深度5:(31*1+15*2+7*4+3*8+1*16)/31=129/31=4.16;
深度n:(Σ(2n-i-1)*2i)/(2n-1)其中n为深度,i取值0到n-1;
而采用本发明的方案查询事件次数:
每个节点:查询位置哈希表1次,根据位置查询事件1次,而且与二叉树的深度无关,都是查询事件1次。
综上:本发明的方案与现有方案的核心性能差异在于获取事件次数。本发明能力平均提高查询效率(Σ(2n-i-1)*2i)/(2n-1)倍,其中n为深度,i取值0到n-1。
基于相同的发明构思,本发明还提供了一种树结构资源查询的方法,如图7所示,包括:
S701,获取预先存储的树结构资源的事件列表和位置哈希表;
其中,所述事件列表中存储有通过前序遍历算法遍历树结构资源时依次遍历出的各个资源及其各子资源的事件数据,所述位置哈希表中记录有各个资源在所述事件列表中的起始位置和事件数量;所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和。
S702,在该位置哈希表中查询待查询资源在该事件列表中的起始位置和事件数量。
S703,根据查询出的起始位置和事件数量,在该事件列表中截取出该待查询资源及其各子资源的事件数据。
具体地,根据要查询的资源的ID,查询出在“位置哈希表”中该资源的事件数据在“事件列表”中的初始位置和事件数量。然后根据查询处的起始位置和事件数量,便可在“事件列表”截取出该资源及其子资源的事件数据。
例如,仍以图3所示的树结构资源和图4所示的各个资源包括的事件数据为例,预先获取树结构资源的事件列表信息为:
{A1,A2,C1,C2,C3,F1,F2,G1,E1,B1,D1}。
预先获取树结构资源的位置哈希表信息(起始位置是索引号,0开始)为:
{
A:[0,11],
B:[9,2],
C:[2,7],
D:[10,1],
E:[5,1],
F:[6,3],
G:[8,1]
}
当需要查询C资源的所有事件时,从位置哈希表中获得资源C的键值为[2,7],根据该键值,在事件列表中找到序号2的位置,然后截取7个长度的值,即为C1,C2,C3,F1,F2,G1,E1。
其中,预先存储树结构资源的事件列表和位置哈希表包括:
建立一个空的事件列表,用于按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;
建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
将树结构资源的事件数据加载到缓存中;
通过前序遍历算法遍历树结构资源;
将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
在所述位置哈希表中记录该当前资源的起始位置和事件数量;
如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
可以理解,存储树结构资源的事件列表和位置哈希表的步骤不是在每次查询时都会执行,只是在树结构资源变动,或间隔一定周期重启系统时才会执行。
基于上述的树结构资源查询的方法,本发明实施例还提供了一种树结构资源查询的装置,如图8所示,包括:
初始化单元80,预先获取树结构资源的事件列表和位置哈希表,其中,所述事件列表中存储有通过前序遍历算法遍历树结构资源时依次遍历出的各个资源及其各子资源的事件数据,所述位置哈希表中记录有各个资源在所述事件列表中的起始位置和事件数量;所述事件数量为各个资源自身的事件数量与其各子资源的事件数量之和;
查询单元81,用于在所述位置哈希表中查询待查询资源在所述事件列表中的起始位置和事件数量;
截取单元82,用于根据遍历出的起始位置和事件数量,在所述事件列表中截取出该待查询资源及其各子资源的事件数据。
其中,该初始化单元80还包括:
建表模块801,用于建立一个空的事件列表,用于按照前序遍历的顺序依次存储各个资源及其各子资源的事件数据;以及建立一个空的位置哈希表,该位置哈希表的键名为各个资源的ID,键值为两位的整型数组,用于分别记录各个资源在所述事件列表中的起始位置和事件数量;
加载模块802,用于将树结构资源的事件数据加载到缓存中;
前序遍历模块803,用于通过前序遍历算法遍历树结构资源;
数据添加模块804,用于前序遍历树结构资源时,将依次遍历出的当前资源的事件数据和其各子资源的事件数据添加到所述事件列表的尾部;
位置记录模块805,用于在所述位置哈希表中记录该当前资源的起始位置和事件数量;
数量更新模块806,用于如果遍历的当前资源存在子资源,则在遍历完其各子资源时,使用当前资源的事件数量加上其各子资源的事件数量来更新所述位置哈希表中该当前资源的事件数量。
由此可知,本发明实施例提供的树结构资源查询的方法和装置,通过预先获取树结构资源的事件列表和位置哈希表,由于该事件列表和位置哈希表是在通过前序遍历算法遍历树结构资源时获取,将遍历出的各个资源及其各子资源的事件数据按照前序遍历的顺序依次存储在该事件列表中,并在该位置哈希表中记录各个资源在该事件列表中的起始位置和事件数量,保证了各个资源自身的事件数据与其各子资源的事件数据的连续存储,并可依据各个资源自身的事件数量和其各子资源的事件数量之和方便地统计出各个资源的事件数量;从而在需要查询资源时,能够非常简便地在位置哈希表中遍历出待查询资源在事件列表中的起始位置和事件数量,然后在所述事件列表中直接截取出该待查询资源及其各子资源的事件数据,有效地提高了数据量巨大时的事件查询速度。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。