发明内容
有鉴于此,本说明书一个或多个实施例提供针对时序数据的索引构建方法、索引写入方法,查询方法。
为实现上述目的,本说明书一个或多个实施例提供技术方案如下:
根据本说明书一个或多个实施例的第一方面,提出了一种针对时序数据的索引构建方法,待索引的每条时序数据包括状态属性、时段属性、以及至少一个来源属性,创建具有三级结构的索引,三级索引分别以一组来源属性、状态属性、时段属性作为索引关键字;所述来源属性用于表征产生时序数据的数据源的特征;所述状态属性用于表征所述时序数据所属数据源的状态属性;所述时段属性用于表征产生所述时序数据的时间范围;
所述方法包括:
创建1级索引,包括多条1索引信息,每条1级索引信息对应一组来源属性值,用于索引至具有相应一组来源属性值的2级索引表;每条1级索引信息中包括:一组来源属性值、2级索引表标识;
创建2级索引,包括多张2级索引表,每张2级索引表对应一组来源属性值;表内的每条2级索引信息对应一种状态属性值,用于索引至具有相应状态属性值的3级索引表;每条2级索引信息中包括:状态属性值、3级索引表标识;
创建3级索引,包括多张3级索引表,每张3级索引表对应一种状态属性值;表内每条3级索引信息对应一种时段属性值,用于索引至具有相应时段属性值的时序数据;每条3级索引信息中包括:时段属性值、时序数据的存储位置。
根据本说明书一个或多个实施例的第二方面,提出了一种基于如上述索引结构的时序数据索引写入方法,所述方法包括:
针对待索引的目标时序数据i,确定目标时序数据的一组来源属性值{A1i,A2i,……,Ani}值、状态属性值Bi值、时段属性值Ci值,以及存储位置;
创建以Ci为标识的三级索引信息I3i;
根据目标时序数据的{A1i,A2i,……,Ani}值、Bi值,依次判断当前索引中是否存在以{A1i,A2i,……,Ani}值为标识的1级索引信息、以Bi为标识的二级索引信息;
若都存在,则找到对应的3级索引信息表,将I3i写入;
若{A1i,A2i,……,Ani}不存在,则依次创建以{A1i,A2i,……,Ani}值为标识的1级索引信息,以Bi值为标识的2级索引信息,并将I3i写入对应的3级索引信息表;
若{A1i,A2i,……,Ani}存在,Bi不存在,则创建以Bi值为标识的2级索引信息,并将I3i写入对应的3级索引信息表。
根据本说明书一个或多个实施例的第三方面,提出了一种基于如上述索引结构的时序数据查询方法,所述方法包括:
接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性为值C值的时序数据的查询请求;
查询一组来源属性值包括{A1,A2,……,An}值的1级索引信息,确定对应的2级索引信息列表;
在确定的2级索引信息列表中,查询以B值为标识的2级索引信息,确定对应的3级索引信息列表;
在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息;
将确定的3级索引信息所索引的时序数据作为查询结果。
根据本说明书一个或多个实施例的第四方面,提出了一种另一种索引结构的时序数据查询方法,所述方法包括:
接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性为值C值的时序数据的查询请求;
针对{A1,A2,……,An}值中的任一来源属性值Ai,确定与该Ai值关联的标识编号集Si;
对标识编号集S1,S2,……,Sn取交集,得到目标标识编号;
根据目标标识编号对应的1级索引信息,确定对应的2级索引信息列表;
在确定的2级索引信息列表中,查询以B值为标识的2级索引信息,确定对应的3级索引信息列表;
在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息;
将确定的3级索引信息所索引的时序数据作为查询结果。
根据本说明书一个或多个实施例的第五方面,提出了一种基于另一种索引结构的时序数据查询方法,所述方法包括:
接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性值为C值的时序数据的查询请求;
将{A1,A2,……,An}值、B值利用符号映射表映射为对应的编号;
查询一组来源属性值包括{A1,A2,……,An}值对应编号的1级索引信息,确定对应的2级索引信息列表;
在确定的2级索引信息列表中,查询以B值对应的编号为标识的2级索引信息,确定对应的3级索引信息列表;
在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息;
将确定的3级索引信息所索引的时序数据作为查询结果。
本说明书的一个或多个实施例中,待索引的每条时序数据包括至少一个来源属性、状态属性、时段属性,创建具有三级结构的索引,三级索引分别以一组来源属性、状态属性、时段属性作为索引关键字。每条1级索引信息对应一组来源属性值,用于索引至具有相应一组来源属性值的2级索引表;每条1级索引信息中包括:一组来源属性值、2级索引表标识。每张2级索引表对应一组来源属性值;表内的每条2级索引信息对应一种状态属性值,用于索引至具有相应状态属性值的3级索引表;每条2级索引信息中包括:状态属性值、3级索引表标识。每张3级索引表对应一种状态属性值;表内每条3级索引信息对应一种时段属性值,用于索引至具有相应时段属性值的时序数据;每条3级索引信息中包括:时段属性值、时序数据的存储位置。当接收到针对指定来源属性、状态属性、时间范围的时序数据的查询请求时,先根据查询请求中的来源属性筛选出1级索引信息,再根据查询请求中的状态属性在筛选出的1级索引信息索引的2级索引列表中,筛选出对应的2级索引信息,最后根据查询请求中的时间范围,从筛选出的2级索引信息索引的3级索引列表中,筛选出对应的3级索引信息,并根据筛选出的3级索引信息找到对应的时序数据。
利用本说明书的一个或多个实施例,利用如上信息构建的三级索引结构查询相关的时序数据,时序数据的各个属性的层级关系更加合理,各个维度更清晰,查询过程更符合实际需要,提高了查询效率。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
一条时序数据(series)包括多个数据点(data point),每个数据点包括一个时间戳(TimeStamp)和一个数值(Field Value),例如[t1:v1,t2:v2,t3:v3,……,tn:vn],其中,t表示时间戳,v表示对应的一个状态值,存储一个时序数据需要记录产生该时序数据的数据源的特征(Tag,数据源不变的特征,如数据源的设备名称、设备所在地区等),该时序数据所属数据源的状态(Field,也称量测指标,是数据源随着时间变化的一个状态,如温度、湿度、风速、功率等),该时序数据所记录数据点的时间范围(Max Time,Min Time)。一个时序数据由多个tag,一个field,一个时间范围确定。如图1所示,时序键值部分为产生时序数据的数据源的特征,图中示出了三个,ems、building=“A”、room=“A101”,域值名称为数据源的一个状态,图中示出了两个,power、light,域值取值对应于各状态在某时间点的状态值,那么对应于时序数据[1588820980:1.0;1588821981:1.3;1588822985:1.5;……;1588828986:1.5]的数据源特征包括ems、building=“A”、room=“A101”,其描述的随时间变化的状态是light,该时序数据的时间范围为[1588820980,1588828986]。
相关技术中,采用了两级索引的方式,一级索引是以seriesKey+fieldKey作为索引关键字,即,将(多个tags+一个field)作为索引关键字,二级索引是以时间范围作为索引关键字,即,将(Max Time,Min Time)作为索引关键字。然而,若tags的组合很多,field也很多,那么一级索引信息的数量会非常的庞大,例如,tags组合有200种,filed有5种,(tags+filed)组合之后,最多会有10*5=1000条一级索引信息,导致查询时的速度变慢,此外,若查询同一tags对应的不同field,那么会重复比较tags,例如,查询tagsA的field1以及field2,那么需要遍历两次一级索引信息,第一次匹配(tagsA+filed1)找到对应的时序数据,第二次匹配(tagsA+field2)找打对应的时序数据,查询效率同样慢。
如图2所示,为时序数据的两级索引结构的示意图,Series Index Section用于存储一级索引信息(相当于一级索引列表),包括多个Series Index Block(一级索引信息),索引关键字key使用的是(serieKey+fieldKey),用于索引多个时序数据,并用Index BlockMeta记录了所索引的二级索引的数量count,索引关键字(serieKey+fieldKey),索引关键字的大小KeyLength,所索引时序数据的类型Type。每个Series Index Block中包括多个IndexEntry(二级索引),索引关键字key使用的是(Max Time,Min Time),Offset用于记录索引时序数据的位置信息,size用于记录所索引的时序数据(Series Data Block)的大小,Min Time记录了所索引时序数据的最小时间戳,Max Time记录了所索引时序数据的最大时间戳。Series Data Section用于存储时序数据,包括多个Series Data Block,每个SeriesData Block用于存储一条时序数据,记录了一条时序数据中各个数据的类型Type(value的Type),如int、long、float、double等,每个时序数据的时间戳(Timestamp),以及所有Timestamp所占空间的大小Length,即,len(Timestamps),使得实际查询时,确定存储value的起始位置。
如图3所示,为图2的实际索引过程,当接收到一个查询请求后,遍历每个seriesindex block的key(serieskey+fieldkey),找到对应的series index block,然后遍历每个index entry的Min Time与Min Time,找到对应的series data block(时序数据)。
在图2所示的结构中,当fieldkey数量增多时,会形成大量的Series Index Block(一级索引信息),这并不利于查询时的效率。此外,若查询形如“select field1,field2、field3from serieskey1”,那么需要遍历3次一级索引信息,第一次利用“serieskey1+field1”遍历,第2次用“serieskey1+field2”遍历,第3次用“serieskey1+field3”遍历,这同样不利于查询时的效率。
基于此,本说明书提出一种针对时序数据的索引构建方法,待索引的每条时序数据包括至少一个来源属性、状态属性、时段属性,创建具有三级结构的索引,三级索引分别以一组来源属性、状态属性、时段属性作为索引关键字。每条1级索引信息对应一组来源属性值,用于索引至具有相应一组来源属性值的2级索引表;每条1级索引信息中包括:一组来源属性值、2级索引表标识。每张2级索引表对应一组来源属性值;表内的每条2级索引信息对应一种状态属性值,用于索引至具有相应状态属性值的3级索引表;每条2级索引信息中包括:状态属性值、3级索引表标识。每张3级索引表对应一种状态属性值;表内每条3级索引信息对应一种时段属性值,用于索引至具有相应时段属性值的时序数据;每条3级索引信息中包括:时段属性值、时序数据的存储位置。当接收到针对指定来源属性、状态属性、时间范围的时序数据的查询请求时,先根据查询请求中的来源属性筛选出1级索引信息,再根据查询请求中的状态属性在筛选出的1级索引信息索引的2级索引列表中,筛选出对应的2级索引信息,最后根据查询请求中的时间范围,从筛选出的2级索引信息索引的3级索引列表中,筛选出对应的3级索引信息,并根据筛选出的3级索引信息找到对应的时序数据。
利用本说明书的一个或多个实施例,利用如上信息构建的三级索引结构,时序数据的各个属性的层级关系更加合理,查询过程更符合实际需要,提高了查询效率。
本说明书还提供了针对时序数据的索引结构的构建方法,与该索引结构对应的时序数据的索引的写入方法,以及与利用该索引结构的时序数据的查询方法。此外本说明书还提供了一种时序数据的文件存储方法,以及与该文件存储方法的时序数据查询方法。
接下来对针对时序数据的三级索引结构的构建方法进行详细的说明。
一条待索引的时序数据包括状态属性、时段属性、以及至少一个来源属性,这些属性能够确定唯一一条时序数据,其中,来源属性用于描述产生该时序数据的数据源的一些特征,这些特征相对稳定,不会随着时间动态变化,例如数据源的产品型号,所属地区,所述公司等等;状态属性用于描述该时序数据所属数据源的状态(换而言之,用于描述这条时序数据记录的数据是什么),即,数据源随着时间发送变化的状态,例如风速、功率、温度等,该时序数据就是用于记录其中一个状态随着时间的变化情况;时段属性用于描述该时序数据所记录状态的变化时间范围,例如记录是2021/6/2/09:39:01至2021/6/2/09:40:29期间的数据源的某状态变化。
构建方法包括以下步骤:
步骤101、创建1级索引,包括多条1索引信息,每条1级索引信息对应一组来源属性值,用于索引至具有相应一组来源属性值的2级索引表;每条1级索引信息中包括:一组来源属性值、2级索引表标识。
步骤103、创建2级索引,包括多张2级索引表,每张2级索引表对应一组来源属性值;表内的每条2级索引信息对应一种状态属性值,用于索引至具有相应状态属性值的3级索引表;每条2级索引信息中包括:状态属性值、3级索引表标识。
步骤105、创建3级索引,包括多张3级索引表,每张3级索引表对应一种状态属性值;表内每条3级索引信息对应一种时段属性值,用于索引至具有相应时段属性值的时序数据;每条3级索引信息中包括:时段属性值、时序数据的存储位置。
上述具有一组来源属性值的2级索引表中的各个2级索引信息虽然未记录一组来源属性值,但由于是在具有一组来源属性值的1级索引信息所索引的2级索引列表中,因此会具有对应的一组来源属性值(换而言之,通过索引关系,能够确定各个索引信息所具有的属性)。3级索引信息同理,3级索引列表中的各个3级索引信息虽然未记录状态属性值,但由于是在具有状态属性值的2级索引信息所索引的3级索引列表中,因此会具有对应的状态属性值,向上追溯,还会具有对应的一组来源属性值。
如图4所示,为本说明书示出的三级索引结构示意图,1级索引包括多条1级索引信息,每条索引信息记录了一组来源属性值,以及所索引的2级索引表的标识。
其中,1级索引信息所记录的2级索引表标识用于找到具有相应一组来源属性值的2级索引表,在一示例中,可直接将所索引的2级索引表的存储地址作为该2级索引表的标识,3级索引表标识同理。
实际应用中,一般是由边云服务(边缘云服务,是基于云计算技术的核心和边缘计算的能力,构筑在边缘基础设施之上的云计算平台)将一段时间内存储的时序数据以及该这些时序数据的索引信息发送至中心云服务统一保存。
因此,上述三级索引结构的保存形式一般如图5所示,文件包括三部分,Data、Index、Metadata,Data用于保存时序数据,包括多个chunk,每个chunk为一条压缩后的时序数据。Index用于保存索引信息,包括多个1级索引信息块(Level_1_index),每个1级索引信息块记录了多个tag,即多个来源属性值,多个2级索引信息块(Level_2_index),以及2级索引块的数量(Level_2_index_Count),各2级索引信息块的地址,包括多个offset,每个offset用于记录一个(Level_2_index)的相对于该1级索引信息块的位置信息。每个2级索引块记录一个Field,即状态属性值,多个3级索引信息块(Chunk index);每个3级索引块记录了一个时间范围(Max Time,Min Time),即时段属性,一个位置信息(offset),记录了所索引的时序数据块(Chunk)的相对于该文件的位置信息。Metadata用于保存该文件的基本信息,如Data部分相对于该文件的位置信息,Index部分相对于该文件的位置信息。
如此,无须依赖其他文件或信息,便可快速在一个文件中查询对应的时序数据,并且由于是以文件的形式进行数据的保存,提高了边缘云服务与中心云服务同步数据的效率。
以上是对针对时序数据构建的三级索引结构的说明,接下来对基于该三级索引结构的待索引时序数据的索引写入方法进行详细说明。
索引写入方法包括以下步骤:
步骤201、针对待索引的目标时序数据i,确定目标时序数据的一组来源属性值{A1i,A2i,……,Ani}值、状态属性值Bi值、时段属性值Ci值,以及存储位置。
步骤203、创建以Ci为标识的三级索引信息I3i;
步骤205、根据目标时序数据的{A1i,A2i,……,Ani}值、Bi值,依次判断当前索引中是否存在以{A1i,A2i,……,Ani}值为标识的1级索引信息、以Bi为标识的二级索引信息:
步骤207、若都存在,则找到对应的3级索引信息表,将I3i写入;
步骤209、若{A1i,A2i,……,Ani}不存在,则依次创建以{A1i,A2i,……,Ani}值为标识的1级索引信息,以Bi值为标识的2级索引信息,并将I3i写入对应的3级索引信息表;
步骤211、若{A1i,A2i,……,Ani}存在,Bi不存在,则创建以Bi值为标识的2级索引信息,并将I3i写入对应的3级索引信息表。
如图6所示,为本说明书示出的写入索引时的写入流程,当确定需要为一条待索引时序数据增加索引信息后,确定该待索引时序数据的状态属性值,时段属性值,以及一组来源属性值。每个时序数据都有唯一的3级索引信息,即,每个3级索引信息用于索引一条时序数据,因此,必然需要为待索引时序数据创建对应的3级索引信息。
先利用待索引时序数据的一组来源属性值,查询在1级索引中,是否存在以这一组来源属性值为索引关键字的1级索引信息,如果有,则根据该1级索引信息找到对应的2级索引表,在对应的2级索引表中,查询是否存在以该待索引时序数据的状态属性值为索引关键字的2级索引信息,如果有,则根据该2级索引信息找到对应的3级索引表,并将为该待索引时序数据创建的3级索引信息写入对应的3级索引表。
如果在对应的2级索引表,不存在以该待索引时序数据的状态属性值为索引关键字的2级索引信息,则在对应的2级索引表中创建以该待索引时序数据的状态属性值为索引关键字的2级索引信息,并将为该待索引时序数据创建的3级索引信息写入对应的3级索引表。
如果1级索引中不存在以该待索引时序数据的一组来源属性值为索引关键字的1级索引信息,则创建依次以该待索引时序数据的一组来源属性值为索引关键字的1级索引信息,以该待索引时序数据的状态属性值为索引关键字的2级索引信息,然后为该待索引时序数据创建的3级索引信息写入对应的3级索引表。
以上是针对待索引时序数据的索引写入方法的详细说明,接下来是基于如上述的三级索引结构的时序数据查询方法进行详细说明。
实际应用中,会对时序数据进行相关的查询及计算,例如降采样、聚合(sum、count、max、min等)、插值等,这些都基于时间线维度进行的相关计算。其中,聚合(Aggregation):指对同一时间线、或不同时间线上的数据点进行分组、求和、计数等计算操作。降采样(Downsample):指查询时间区间跨度较长,且原始数据采样频率较高时,可通过降采样降低数据的查询展现精度,比如按秒采集的数据,查询时按小时级别采样,减少结果集的数据点数。插值(Interpolation):指时间线中间缺失部分数据点时,可通过插值算法进行数据点自动填充。
查询时序数据的条件多种多样,例如查询某条时间线一段时间内的数据点。
例如:查询ID=1234ABC、型号:V120_20的设备,在(2020-10-24T00:00:00Z~2020-10-24T00:30:00Z)30分钟时间范围内,运行风速指标值。
查询多条时间线一段时间内的数据点,并按5分钟粒度降采样。
例如:查询ID=1234ABC的设备,在(2020-10-24T00:00:00Z~2020-10-25T00:00:00Z)一天时间范围内,功率、风速的指标值明细,按5分钟粒度采样返回数据。
对某条时间线按时间范围做聚合。
例如:查询ID=1234ABC的设备,在2020-10-24T00:00:00Z~2020-10-24T00:30:00Z时间范围内,运行功率的平均值。
查询多条时间线的最新点。
例如:查询ID=1234ABC的设备,最新的功率、风速。
按Tag做时间线聚合查询。
例如:查询厂商=KingWind的设备,在2020-10-24T00:00:00Z的平均风速。
可以发现,查询条件多种多样,一般包括来源属性(设备的名称,tag等)、状态属性(功率、风速)、时段属性(时间范围)三部分,因此,接收的查询请求的条件一般包括一组来源属性值、状态属性值为、时段属性,即,需要查询三个部分都符合条件的时序数据,若任一部分为空,说明该部分没有条件,该部分的所有项都可作为匹配项。
基于此,本说明提出一种针对时序数据的查询方法,包括以下步骤:
步骤301、接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性为值C值的时序数据的查询请求。
任一查询请求的条件包括三个部分,第一部分来源属性,第二部分状态属性,第三部分时段属性。来源属性一般至少一个,有多个时来源属性时,为一组来源属性,例如上述例子中的“查询ID=1234ABC的设备”,只包含了一个来源属性值(ID=1234ABC),上述例子中的“查询ID=1234ABC、型号:V120_20的设备”,包括了两个来源属性值(ID=1234ABC,型号:V120_20)。状态属性一般也是一个,时段属性一般也是一个。
步骤303、查询一组来源属性值包括{A1,A2,……,An}值的1级索引信息,确定对应的2级索引信息列表。
每个1级索引信息以一组来源属性值唯一标识,包括多个来源属性值,若1级索引信息中的一组来源属性值中,包括查询请求中的{A1,A2,……,An}所有值,说明该1级索引信息符合查询请求中第一部分条件,依据符合条件的1级索引信息,找到对应的2级索引列表(即,找到的2级索引列表中的各2级索引信息是符合第一部分条件的2级索引信息)。
步骤305、在确定的2级索引信息列表中,查询以B值为标识的2级索引信息,确定对应的3级索引信息列表。
判断是否符合第一部分条件后,在符合第一部分条件中的2级索引列表中,筛选符合第二部分条件的2级索引信息,即,在2级索引列表中,将状态属性值与查询请求中的状态属性值为B值的2级索引信息筛选出来。
查询请求中一般包含一个状态属性值,当包括多个状态属性值时,只要2级索引信息的状态属性值与查询请求中的任一状态属性值相匹配是,则该2级索引信息满足查询请求中的第二部分条件。
步骤307、在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息。
判断符合第一部分的条件以及第二部分的条件后,在符合第一部分的条件以及第二部分的条件的3级索引列表中,筛选符合第三部分条件的3级索引信息,即,在3级索引列表中,将时段属性对应的时间范围与查询请求中的时段属性对应的时间范围有重合的3级索引信息筛选出来。
查询请求中一般包含一个时段属性值(即,对应于一个时间范围),当包括多个时段属性值时,只要3级索引信息的时段属性值对应的时间范围与查询请求中的任一时段属性值对应的时间范围有重合,则该3级索引信息满足查询请求中的第三部分的条件。
步骤309、将确定的3级索引信息所索引的时序数据作为查询结果。
经过多次查询筛选后,筛选得到的3级索引信息是符合查询请求中的三部分条件的索引信息,所索引的时序数据为满足查询请求中的查询条件的时序数据,将确定的3级索引信息所索引的时序数据作为查询结果。
在实际应用中,还可以在各1级索引信息、2级索引信息中记录所索引时序数据的时间范围,换而言之,每条1级索引信息中包括:一组来源属性值、2级索引表标识、时段属性值;每条2级索引信息中包括:状态属性值、3级索引表标识、时段属性值。
其中,1级索引信息中的时段属性值用于描述该1级索引信息所索引的时序数据的时间范围(换而言之,与该1级索引信息拥有相同一组来源属性值的所有时序数据对应的时间范围);2级索引信息的时段属性值用于描述该2级索引信息所索引的时序数据的时间范围(换而言之,与2级索引信息拥有相同的状态属性值以及所具有的一组来源属性值的所有时序数据对应的时间范围)。
那么在接收到针对指定条件的查询请求时,在判断一个1级索引信息符合查询请求中第一部分条件后,根据1级索引信息中的时段属性值对应的时间范围是否在查询请求的时段属性值对应的时间范围内,若是,说明该1级索引信息索引的2级索引列表中,存在满足第三部分条件的2级索引信息,此时可以继续判断筛选出的1级索引信息所索引的2级索引列表中,是否存在满足查询请求中第二部分条件的2级索引信息。
同理,在判断一个2级索引信息符合查询请求中第二部分条件后,根据2级索引信息中的时段属性值对应的时间范围是否在查询请求的时段属性值对应的时间范围内,若是,说明该2级索引信息索引的3级索引列表中,存在满足第三部分条件的3级索引信息,此时可以继续判断筛选出的2级索引信息所索引的3级索引列表中,是否存在满足查询请求中第三部分条件的3级索引信息。
通过为每个1级索引信息及2级索引信息添加时段属性信息,可减少查询过程中不必要的查询与比较。
实际应用中,查询条件多种多样,大多数查询,是查询具有某些特征的数据源产生的时序数据,因此,在本说明书一个或多个实施例中,可以为当前每个1级索引信息分配标识编号,针对每个来源属性值,确定该来源属性值所关联的标识编号集,其中,标识编号集的每个标识编号对应的1级索引信息的一组来源属性值中,包括该属性值,例如,某1级索引信息的一组来源属性值为{“AKE”,“BJ”},那么来源属性值“BJ”所关联的标识编号集中,就可包含该1级索引信息对应的标识编号。
例如,1级索引信息分配的标识编号如下:
表1
标识编号 |
索引关键字 |
1 |
{Tag1,Tag2} |
2 |
{Tag2,Tag3} |
3 |
{Tag1,Tag4} |
4 |
{Tag2,Tag3,Tag4} |
那么包括的来源属性值包括:Tag1、Tag2、Tag3、Tag4,这些来源属性值关联的标识集关系如下:
表2
来源属性 |
关联标识编号集 |
Tag1 |
{1,3} |
Tag2 |
{1,2,4} |
Tag3 |
{2,4} |
Tag4 |
{3,4} |
那么此时,查询指定条件的时序数据时,过程如下:
步骤401、接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性为值C值的时序数据的查询请求。
步骤403、针对{A1,A2,……,An}值中的任一来源属性值Ai,确定与该Ai值关联的标识编号集Si,并对标识编号集S1,S2,……,Sn取交集,得到目标标识编号。
步骤405、根据目标标识编号对应的1级索引信息,确定对应的2级索引信息列表。
步骤407、在确定的2级索引信息列表中,查询以B值为标识的2级索引信息,确定对应的3级索引信息列表。
步骤409、在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息。
步骤411、将确定的3级索引信息所索引的时序数据作为查询结果。
其中,目标标识编号可能是一个,也可能多个,例如,查询条件中包括的来源属性值包括上表的tag2、tag3,tag2关联的标识编号集为{1,2,4},tag3关联的标识编号集为{2,4},那么取交集后的目标标识编号包括2,4,根据标识编号2、4找到对应的1级索引信息,确定对应的2级索引列表,进而查询相应的2级索引信息。
在三级索引结构的基础上增加各来源属性值的倒排列表,是为了快速找到符合查询请求中第一部分条件的1级索引信息,避免了查询中重复遍历各个1级索引信息的过程。其他查询中的过程与上述查询方法类似,相关之处可相互参照。
实际应用中,来源属性标签值或状态属性值可能是一串很长的字符串,且保存各个来源属性值、状态属性值所需的存储空间大小也不同,因此,为了节约存储空间以及提高查询时索引关键字的对比效率,可以构建符号映射表,将任一来源属性值、状态属性值对应的字符串映射为固定大小的编号,并记录至符号映射表;在保存任一来源属性值、状态属性值、时段属性值时,保存该值对应的编号,编号可以是由数字组成,由大到小依次对应;或者编号为固定大小的字符串,按字典顺序排列。
以数字作为映射后的编号为例:
表3
原字符串 |
映射后的编号 |
Beijing |
1 |
Shanghai |
2 |
Guangzhou |
3 |
Shenzhen |
4 |
那么在需要保存“Beijing”这一字符串时,在对应的存储位置保存编号“1”即可,需要保存“Shanghai”这一字符串时,在对应的存储位置保存编号“2”即可,以此类推。
那么相应的,查询指定条件的时序数据时,过程如下:
步骤501、接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性值为C值的时序数据的查询请求。
步骤503、将{A1,A2,……,An}值、B值利用符号映射表映射为对应的编号。
步骤505、查询一组来源属性值包括{A1,A2,……,An}值对应编号的1级索引信息,确定对应的2级索引信息列表。
步骤507、在确定的2级索引信息列表中,查询以B值对应的编号为标识的2级索引信息,确定对应的3级索引信息列表。
步骤509、在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息。
步骤511、将确定的3级索引信息所索引的时序数据作为查询结果。
在三级索引结构的基础上增加符号表,是为了查询过程中,减少或避免复杂字符串的比较,进而增快查询速度。其他查询中的过程与上述查询方法类似,相关之处可相互参照。
实际应用中,还可增加布隆过滤器,即,记录计算使用的K个不同的哈希函数、以及对应的N比特数组。针对任一来源属性标签值或状态属性值,利用记录的K个不同的哈希函数得到该属性值对应的K个整数,修改比特数组中这个K个整数对应的比特值。
如此,可快速确定索引中是否存在某个属性值,或者确定是否存储有某个属性值相关的信息。
接下来对本说明示出的一具体实施例进行详细的说明,基于以上方法,提供一种支持多维检索的时序数据文件,包括域值数据、索引数据以及元数据三部分,如下表所示,元数据部分存储整个文件的摘要信息以及索引数据部分、域值数据部分的索引信息(即,索引数据部分、域值数据部分在该文件中的位置信息)等。索引数据部分存储了用于快速查找对应时序数据的信息,包括时间线数据(记录了各个时序数据的索引信息),时间线索引数据(用于索引各个时间线),倒排列表,倒排列表索引,倒排索引块的索引,符号表,符号表索引,符号表布隆过滤器。域值数据部分存储的是压缩各个时序数据经压缩后的数据块。
域值数据(Data) |
索引数据(Index) |
元数据(Metadata) |
域值数据部分包括多个chunk块组成,如图7所示,每个chunk块是一条时序数据的压缩块,每个chunk包括压缩后的fieldData,即[t1:v1,t2:v2,t3:v3,……,tn,vn]的压缩块,以及该压缩块的压缩类型(compressType)。其中,对于不同的数据类型的域值数据,可以采用不同的压缩算法,例如,对于时间戳,可以采用差分delta-delta算法进行压缩,浮点数可以使用异或xor算法进行压缩。此外,可以在这些基本压缩算法的基础上,进一步使用通用算法提高压缩率,例如,在存储时序数据[t1:v1,t2:v2,t3:v3,……,tn,vn]时,采用差分delta-delta算法存储各个时间戳,使用或xor算法对各个域值数据进行存储,然后将整个时序数据[t1:v1,t2:v2,t3:v3,……,tn,vn]利用snappy、ZSTD算法进行压缩。
索引数据部分包括时间线数据(series)、时间线索引(series index)、倒排列表(postings)、倒排列表索引(postings list)、倒排索引块索引(postings index table)、符号表(symbol)、符号表索引(symbol index)、符号表布隆过滤器(symbol bloomfilter),如图8所示。
索引数据部分的符号表布隆过滤器(symbol bloom filter)用于快速判断给定的查询条件中包含的字符串是否在文件中,以提高查询效率,如图9所示,记录了使用的哈希函数的个数(hash code),各个哈希函数的类型(hash type),bloom filter记录数组的大小(size,size of bloom filter bytes),以及bloom filter记录数组(bloom filterbytes)。
索引数据部分的符号表(symbol)用于记录一系列的符号信息,将符号(字符串)映射为对应的编号,如图10所示,包括多个符号块(symbol block),一个符号块记录了多个符号,即,记录了多个字符串,该符号块记录的字符串个数(count),第一个字符串对应的开始编号。其中,分块存储符号表是为了提高符号映射时的效率,降低磁盘的I/O开销,因此会为每个符号块创建索引,而为了方便索引,符号表的各个符号是按照字典顺序从小到大依次存储的,且每个用于存储每个符号的空间大小相同,如此,只须存储符号,无须存储每个符号对应的编号。例如,第一个符号块的开始编号为1,第二个符号块的开始编号为第一个符号块的开始编号加上第一个符号块的符号个数,第三个符号块的开始编号为第二个符号块的开始编号加上第二个符号块的符号个数,第N个符号块的开始编号为第N-1个符号块开始编号加上第N-1个符号块的个数。符号块(symbol block)中的每个符号的编号Id=该符号块的起始编号(baseId)+符号在符号块中的位置。
索引数据部分的符号表索引(symbol index)用于索引符号表中的各个符号块,如图11所示,包括多个用于索引符号块的索引项(index entry)、索引项数量(numEntries)以及索引各个索引项的索引(index offsets),每个索引项记录了该索引项所索引的符号块的位置信息(offset,相对于文件的),所索引的符号块的大小(size),所索引符号块中,开始编号以及最小字符串(符号表按照字典的顺序排列存储的,最小对应于字典顺序中的最下)。各索引各个索引项的索引(index offsets),是为了可以使用二分法快速查找对应的索引块的索引项。
索引数据部分的时间线数据(series),用于存储索引任一条时序数据的索引信息,如图12所示,包括多个series块,每个series块用于索引与该series块具有相同的tags(相同的一组来源属性值)的时序数据。每个series块记录了度量(metric,一个特殊的来源属性值),多个来源属性值(tags),metric+tags标识(即,前述的来源属性值,metric、每个tag都是其中一种来源属性值)每个series块,记录了该series块索引的所有时序数据对应的时间范围,包括最大时间戳(Max Time),最小时间戳(Min Time),记录了多个域值元数据信息(field meta,也可称为域值索引信息),以及用于索引各个域值元数据信息的域值元数据索引(field index),域值元数据信息数量(field count)。其中,域值元数据根据域值元数据中的域值名称(nameID,即,前述的状态属性)的大小按序存储的,使得查询时,在field index中根据各偏移量二分查找对应的域值名称。
每个域值元数据(field meta)包括多个时序数据块索引(chunk index),域值数据类型(data type),该域值元数据的所有时序数据对应的时间范围,包括最大时间戳(MaxTime),最小时间戳(Min Time),所索引的时序数据块索引的数量(numChunks),该域值对应的第一个时序数据块的地址(也可称为该域值元数据的基地址,baseOffset)。
每个时序数据块索引(chunk index)包括所索引时序数据块相对于所在域值元数据的位置信息,所索引时序数据块的时间范围,包括最大时间戳(Max Time),最小时间戳(Min Time),所索引时序数据块的大小(size)。
索引数据部分的时间线索引(series index)用于索引时间线(series)中的任一series块(也就是为任一3级索引信息创建索引,用于快速找到对应3级索引信息),如图13所示,包括多个固定大小的series索引项(index entry),每个series索引项记录了所索引的series的位置信息(offset),所索引时序数据块对应的时间范围,包括最大时间戳(MaxTime),最小时间戳(Min Time)。
索引数据部分的倒排列表(postings)用于根据来源属性值找对应的series块(根据来源属性值找到对应的1级索引信息),如图14所示,包括多个倒排索引列表(postingslist),每个倒排索引列表用于索引一个来源属性值关联的series块(即,series块中包括该来源属性值,则series块与该来源属性值关联),记录了该列表所关联的series块的索引信息的位置信息,以及所关联series块的数量。其中,因为时间线索引(series index)中的各个索引项(index entry)的大小固定(以28字节为例),因此为节省存储倒排列表项的磁盘开销,记录的该列表所关联的series块的索引信息的位置信息offset(即偏移地址offset),的是时间线索引项index entry在文件中偏移offset除以28后的商,即倒排列表(postings list)中所记录的offset=时间线索引项index entry的偏移offset/28。这样处理后倒排列表记录的offset是连续的,可以使用差分delta-delta算法或者位图bitmap的方式进行压缩,从而进一步降低倒排列表项postings list在磁盘上的开销。
索引数据部分的倒排索引(postings index)用于索引任一来源属性值(tag中metric)对应的倒排列表,如图15所示,包括多个倒排索引块(index block),每个倒排索引块包括了多个来源属性值的倒排索引(tag entry),记录了该排索引块所包含的来源属性值的倒排索引的数量(numTags)。每个来源属性值的倒排索引记录了对应的倒排列表的位置信息,对应的倒排列表的大小,以及该来源属性值的key和value(实际应用中,一般是将“building=A03”作为一个来源属性值,key=building,value=A03,因此存储该来源属性值时,tagKey=building,tagvalue=A03)。
索引数据部分的倒排索引块索引(postings index table)用于快速索引对应的倒排索引,如图16所示,包括多个用于索引倒排索引块的索引项(index entry),倒排索引块索引的索引项记录了所索引的倒排索引块对应的最小来源属性值(index block mintag,倒排索引是按照来源属性对应的字符串的字典顺序排序的,最小对应于字典顺序的最小,例如A、C、F,最小的是A),所索引的倒排索引块的位置信息(offset),所索引的倒排索引块的大小(size)。其中,倒排索引块索引还记录了多个索引项在该倒排索引块索引中的偏移地址(index offset),由于是按字典顺序排序,利用对应的来源属性值,可使用二分法快速查找到该来源属性值对应的倒排索引块的索引信息。
元数据部分(metadata)用于记录文件的元数据信息,如图17所示,包括索引元数据(index meta)和文件元数据(file meta),可根据记录的位置信息快递定位文件的各个部分。索引元数据记录了域值数据部分、索引数据部分的每个子部分相对于该文件的偏移地址及大小,包括域值数据部分在文件中的相对位置信息(data offset)和大小(datasize),时间线数据部分在文件中的相对位置信息(series offset)和大小(series size),时间线索引部分在文件中的相对位置信息(series index offset)和大小(series indexsize),倒排列表部分在文件中的相对位置信息(postings offset)和大小(postingssize),倒排索引部分在文件中的相对位置信息(postings index offset)和大小(postings index size),倒排索引块索引部分在文件中的相对位置信息(postings indextable offset)和大小(postings index table size),符号表部分在文件中的相对位置信息(symbol offset)和大小(symbol size),符号表索引部分在文件中的相对位置信息(symbol index offset)和大小(symbol index size),符号表布隆过滤器部分在文件中的相对位置信息(symbol bloom filter offset,或可写为bloom filter offset)及大小(symbol bloom filter,或可写为bloom index size)。文件元数据部分用于描述该文件的相关信息,包括时间线数量(numSeries,就是1级索引信息的数量,或者所记录的不同数据源的数量),该文件的创建时间(creatTime),该文件最新一次的更新时间(updataTime),该文件所记录时序数据的时间范围,包括最小时间戳(minTime,即minTimeStamp),最大时间戳(maxTime,即maxTimeStamp),主版本号(major version,用于版本的迭代,确定文件的读取方式),次版本号(minor version)等。
实际应用中,当接收到针对指定时间范围,指定来源属性值(即,指定tag值,包括metric值),指定状态属性值(即,指定field值)的时序数据查询请求时,先根据文件的文件元数据(field meta)确定该文件的时间范围是否在查询请求对应的时间范围内。
若是,则根据文件的索引元数据(index meta)找到符号表布隆过滤器(symbolbloom filter)。利用符号表过滤器所记录的多个哈希函数,以及对应的bloom filter记录数组(bloom filter bytes),确定查询中的各个字符串在文件中是否有记录。
若是,则根据文件的索引元数据(index meta)找到倒排索引块索引(postingsindex table),然后针对查询条件中的每个来源属性值,利用postings index table中的index offset,二分法快速在倒排索引块索引的确定该来源属性值对应的倒排索引块(根据postings index table中的index entry,找到postings中的index block),在对应的倒排索引块中,利用该倒排索引块中的tag index,二分法快速找到对应的来源属性值对应的倒排列表(在postings中的index block,查询与该来源属性值相匹配的tag entry,找到对应的postings中的postings list)。
根据各来源属性值对应的倒排列表,确定各来源属性值的series块的交集,如图18所示,左上表为示出的各个时间线的来源属性,以及对应的编号;右上表为示出的各个来源属性值对应的倒排列表,左下表为查询中的各来源属性值对应的倒排列表,右下表为根据查询中的各来源属性值对应的倒排列表的交集找到的对应的时间线信息,即,找到在series中的series块的索引信息(找到对应的1级索引信息的索引信息,即,找到seriesindex中的index entry)。根据series块的索引信息中的时间范围,确定该series块中的时序数据是否与查询条件中的时间范围有交集。
若是,利用查询条件中的状态属性值,在对应的series块中,并利用series块中的field index,二分法找到对应的field meta。根据field meta中所记录的时间范围,确定该field meta中的时序数据是否与查询条件中的时间范围有交集。
若是,则根据查询中的时间范围,在field meta中找到对应的时序数据索引信息chunk index,并利用chunk index找到对应的时序数据,作为查询结果。
需要说明的是,上述能够用二分法快速查找的,都是按照字典顺序存储索引的,如此才可使用二分法快速查找。上述各个判断条件中的若否,说明不满足查询条件中的某一部分条件。
本说明书一个或多个实施例,本文方案在索引时序数据时,按照时间线,将所有时序数据放在时间线下面一起索引,在查询多个状态属性值时,只需要查询一次时间线索引,避免了多次比较1级索引信息,提高了查询效率。将时序数据的来源属性值与状态属性值利用字典映射的方式,映射为固定大小的编号,去除了在存储时序数据的来源属性值与状态属性值时的大量重复字符,降低了磁盘存储空间和读写IO开销。在存储倒排索引和符号表时,都采用的时分块存储方式进行存储的,在进行数据查找时,将索引项全部加载至内存中,只需根据索引项中信息按需加载符号表和倒排索引信息,降低了查找时的内存开销和磁盘读取IO开销。在存储时序数据时,在使用基本的时序压缩算法对时序数据压缩的基础上,又继续使用了通用压缩算法进行进一步压缩,进一步提高了数据压缩率。
此外,由于符号表是分块存储的,符号表在存储时,只需要存储符号本身,不需要存储每个符号对于的编号。使用偏移位置为时间线隐式分配Id的方法,倒排索引直接索引时间线在文件中的偏移,无需为时间线额外分配Id即可构建倒排列表。倒排索引使用分块存储的方法,在检索时按需加载倒排列表,无需全部倒排列表加载至内存中,减少查询时的内存资源的使用。
以上本说明书对各个方法实施例的说明,本说明书还提供了各个方法实施例对应的装置,接下来对本说明书提供的各个装置实施例进行详细的说明。
本说明书提供了一种针对时序数据的索引构建装置,如图19所示,待索引的每条时序数据包括状态属性、时段属性、以及至少一个来源属性,创建具有三级结构的索引,三级索引分别以一组来源属性、状态属性、时段属性作为索引关键字;所述来源属性用于表征产生时序数据的数据源的特征;所述状态属性用于表征所述时序数据所属数据源的状态属性;所述时段属性用于表征产生所述时序数据的时间范围;
所述装置包括:
1级索引构建模块1901,用于创建1级索引,包括多条1索引信息,每条1级索引信息对应一组来源属性值,用于索引至具有相应一组来源属性值的2级索引表;每条1级索引信息中包括:一组来源属性值、2级索引表标识;
2级索引构建模块1903,用于创建2级索引,包括多张2级索引表,每张2级索引表对应一组来源属性值;表内的每条2级索引信息对应一种状态属性值,用于索引至具有相应状态属性值的3级索引表;每条2级索引信息中包括:状态属性值、3级索引表标识;
3级索引构建模块1905,用于创建3级索引,包括多张3级索引表,每张3级索引表对应一种状态属性值;表内每条3级索引信息对应一种时段属性值,用于索引至具有相应时段属性值的时序数据;每条3级索引信息中包括:时段属性值、时序数据的存储位置。
本说明书提供了一种基于如上述的时序数据索引写入装置,如图20所示,所述装置包括:
目标时序数据确定模块2001,用于针对待索引的目标时序数据i,确定目标时序数据的一组来源属性值{A1i,A2i,……,Ani}值、状态属性值Bi值、时段属性值Ci值,以及存储位置;
三级索引信息创建模块2003,用于创建以Ci为标识的三级索引信息I3i;
三级索引信息写入模块2005,用于根据目标时序数据的{A1i,A2i,……,Ani}值、Bi值,依次判断当前索引中是否存在以{A1i,A2i,……,Ani}值为标识的1级索引信息、以Bi为标识的二级索引信息:若都存在,则找到对应的3级索引信息表,将I3i写入;若{A1i,A2i,……,Ani}不存在,则依次创建以{A1i,A2i,……,Ani}值为标识的1级索引信息,以Bi值为标识的2级索引信息,并将I3i写入对应的3级索引信息表;若{A1i,A2i,……,Ani}存在,Bi不存在,则创建以Bi值为标识的2级索引信息,并将I3i写入对应的3级索引信息表。
所述装置还可以包括标识分配模块2007(图中未示出),用于为当前所有1级索引信息分配标识编号;针对任一来源属性值,以该来源标签值为标识,为该来源标签值关联一个标识编号集,标识编号集的任一标识编号对应的1级索引信息的一组来源属性值中包括该来源属性值。
所述装置还可以包括符号表构建模块2009(图中未示出),用于构建符号映射表,将任一来源属性值、状态属性值、时段属性值对应的字符串映射为固定大小的编号,并记录至所述符号映射表;在保存任一来源属性值、状态属性值、时段属性值时,保存该值对应的编号。
本说明书提供了一种基于如上述索引结构的时序数据查询装置,如图21所示,所述装置包括:
查询请求接收模块2101,用于接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性为值C值的时序数据的查询请求;
2级索引信息列表确定模块2103,用于查询一组来源属性值包括{A1,A2,……,An}值的1级索引信息,确定对应的2级索引信息列表;
3级索引信息列表确定模块2105,用于在确定的2级索引信息列表中,查询以B值为标识的2级索引信息,确定对应的3级索引信息列表;
3级索引信息确定模块2107,用于在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息;
查询结果确定模块2109,用于将确定的3级索引信息所索引的时序数据作为查询结果。
本说明书提供了一种基于如上述的索引结构的时序数据查询装置,如图22所示,所述装置包括:
查询请求接收模块2201,用于接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性为值C值的时序数据的查询请求;
目标标识编号确定模块2203,用于针对{A1,A2,……,An}值中的任一来源属性值Ai,确定与该Ai值关联的标识编号集Si,并对标识编号集S1,S2,……,Sn取交集,得到目标标识编号;
2级索引信息列表确定模块2205,用于根据目标标识编号对应的1级索引信息,确定对应的2级索引信息列表;
3级索引信息列表确定模块2207,用于在确定的2级索引信息列表中,查询以B值为标识的2级索引信息,确定对应的3级索引信息列表;
3级索引信息确定模块2209,用于在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息;
查询结果确定模块2211,用于将确定的3级索引信息所索引的时序数据作为查询结果。
本说明书提供了一种基于如上述的索引结构的时序数据查询装置,如图23所示,所述装置包括:
查询请求接收模块2301,用于接收针对一组来源属性值为{A1,A2,……,An}值、状态属性值为B值、时段属性值为C值的时序数据的查询请求;
符号映射模块2303,用于将{A1,A2,……,An}值、B值利用符号映射表映射为对应的编号;
2级索引信息列表确定模块2305,用于查询一组来源属性值包括{A1,A2,……,An}值对应编号的1级索引信息,确定对应的2级索引信息列表;
3级索引信息列表确定模块2307,用于在确定的2级索引信息列表中,查询以B值对应的编号为标识的2级索引信息,确定对应的3级索引信息列表;
3级索引信息确定模块2309,用于在确定的3级索引信息列表中,查询时段属性值对应的时间范围与C值对应的时间范围有重合的3级索引信息,确定出对应的3级索引信息;
查询结果确定模块2311,用于将确定的3级索引信息所索引的时序数据作为查询结果。
本说明书提供了一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器通过运行所述可执行指令以实现如上述任一所述的方法。
图24是一示例性实施例提供的一种设备的示意结构图。请参考图24,在硬件层面,该设备包括处理器2402、内部总线2404、网络接口2406、内存2408以及非易失性存储器2410,当然还可能包括其他业务所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器2402从非易失性存储器2410中读取对应的计算机程序到内存2408中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
上述实施例阐明装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
本说明书提供了一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如上述中任一所述方法的步骤。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。