CN109299100B - 管理内存数据及在内存中维护数据的方法和系统 - Google Patents
管理内存数据及在内存中维护数据的方法和系统 Download PDFInfo
- Publication number
- CN109299100B CN109299100B CN201811187043.XA CN201811187043A CN109299100B CN 109299100 B CN109299100 B CN 109299100B CN 201811187043 A CN201811187043 A CN 201811187043A CN 109299100 B CN109299100 B CN 109299100B
- Authority
- CN
- China
- Prior art keywords
- value
- fragment
- skip list
- field
- node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 53
- 239000012634 fragment Substances 0.000 claims abstract description 523
- 238000003780 insertion Methods 0.000 claims description 9
- 230000037431 insertion Effects 0.000 claims description 9
- 238000012217 deletion Methods 0.000 claims description 8
- 230000037430 deletion Effects 0.000 claims description 8
- 238000000151 deposition Methods 0.000 claims description 2
- 230000006870 function Effects 0.000 description 17
- 238000012545 processing Methods 0.000 description 13
- 238000010586 diagram Methods 0.000 description 10
- 238000007726 management method Methods 0.000 description 10
- 241001269238 Data Species 0.000 description 4
- 230000008859 change Effects 0.000 description 4
- 238000004590 computer program Methods 0.000 description 4
- 238000013461 design Methods 0.000 description 3
- 241000208340 Araliaceae Species 0.000 description 2
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 2
- 235000003140 Panax quinquefolius Nutrition 0.000 description 2
- 239000003795 chemical substances by application Substances 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 235000008434 ginseng Nutrition 0.000 description 2
- 230000004083 survival effect Effects 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 238000000429 assembly Methods 0.000 description 1
- 230000000712 assembly Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 238000013523 data management Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000007667 floating Methods 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
Abstract
提供了管理内存数据及在内存中维护数据的方法和系统。管理内存数据的方法包括:设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段;为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储关键字为数据记录的关于索引字段的取值且值为指示第二级跳表的指针或对象的节点,与每个分片对应的第二级跳表被设置为用于存储关键字为数据记录的关于排序字段的取值且值为指示用于存储数据记录的至少一个属性字段的取值的存储空间的指针的节点。根据所述方法和系统,可提高数据写入和数据查询的效率。
Description
技术领域
本公开总体说来涉及内存数据管理和维护领域,更具体地讲,涉及一种管理内存数据的方法和系统以及一种在内存中维护数据的方法和系统。
背景技术
现有的数据库包括关系型数据库和非关系型数据库。诸如MySQL和SQL Server的关系型数据库主要用于对关系型数据进行管理和维护。诸如Redis和MongoDB的非关系型数据库主要用于对非关系型数据进行管理和维护。关系型数据意指基于关系模型(Relational Model,简称为RM)的数据。非关系型数据意指非基于关系模型的数据。
为了对时间序列数据进行处理,提出了诸如InfluxDB的时间序列数据库(TimeSeries Database,简称为TSDB)。为了对内存中的数据进行处理,提出了诸如VoltDB的内存数据库。
然而,在需要快速处理数据和同时执行大量数据写入任务和/或数据查询任务的特定场景下,包括以上列举出的数据库的传统的数据库具有读/写数据的耗时长的问题,还具有单位时间内能够同时执行的数据写入任务和/或数据查询任务的数量少的问题。综上所述,现有技术中存在数据写入效率低和数据查询效率低的缺陷。
发明内容
本公开的示例性实施例旨在克服现有技术中存在的数据写入效率低和数据查询效率低的缺陷。
根据本公开的示例性实施例,提供一种管理内存数据的方法,包括:设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同;为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
可选地,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
根据本公开的另一示例性实施例,提供一种在内存中维护数据的方法,包括:针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点;从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点;在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
可选地,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
可选地,确定对应的分片的步骤包括:计算与所述待插入的数据记录的关于所述每个分片组的索引字段的取值对应的哈希值;获得计算出的哈希值除以所述每个分片组的分片总数所得的余数;将与获得的余数对应的分片确定为对应的分片。
可选地,每个分片中存储有指示对应的第一级跳表的指针或对象。
可选地,在内存中维护数据的方法还包括:在未能查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,创建第二级跳表,在第一级跳表中创建以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字且以指示创建的第二级跳表的指针或对象为与该关键字对应的值的节点,并在创建的第二级跳表中添加以与所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
可选地,用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间中存储有通过以下方式之一获得的字符串:按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并,按照预定的JSON格式对所述至少一个属性字段的取值进行序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行序列化,按照预定的Schema格式对所述至少一个属性字段的取值进行序列化。
可选地,在内存中维护数据的方法还包括:确定所述多个分片组中索引字段与待查询的数据记录的索引字段相同的分片组;在确定的分片组中,根据所述待查询的数据记录的索引字段的取值来确定对应的分片;从与确定的分片对应的第一级跳表中查找以所述待查询的数据记录的索引字段的取值为关键字的节点;从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针;从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值。
可选地,从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值的步骤包括:通过以下方式之一来取出所述待查询的数据记录的所述至少一个属性字段的取值:按照预定的字符串拆分规则对所述至少一个属性字段的取值进行拆分,按照预定的JSON格式对所述至少一个属性字段的取值进行反序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行反序列化,以及按照预定义的Schema格式对所述至少一个属性字段的取值进行反序列化。
可选地,确定对应的分片的步骤包括:计算与所述待查询的数据记录的索引字段的取值对应的哈希值;获得计算出的哈希值除以所述确定的分片组的分片总数所得的余数;将与获得的余数对应的分片确定为对应的分片。
可选地,所述待插入的数据记录和/或所述待查询的数据记录是时序型数据记录,并且,排序字段均为时间戳。
可选地,所述取值范围指定时间戳的起始值和终止值或者指定时间戳的终止值。
可选地,在第二级跳表中添加节点的步骤包括:按照时间戳的取值指示的时间添加节点,使得第二级跳表中的节点按照时间由近及远的顺序排列。
可选地,在内存中维护数据的方法还包括:设置与第二级跳表对应的节点数量阈值,其中,从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针的步骤包括:从查找到的节点中的指针或对象所指示的第二级跳表中,按照由近及远的顺序取出关键字在所述取值范围内的预定数量的节点中的每个节点中存储的指针,其中,所述预定数量不超过所述节点数量阈值。
可选地,在内存中维护数据的方法还包括:设置与第二级跳表对应的节点数量阈值;以预定周期分别遍历与每个分片组的对应的第一级跳表和第二级跳表;当遍历到的与所述每个分片组对应的第二级跳表中的节点数量超过节点数量阈值时,根据该第二级跳表中的节点的排列顺序,删除该第二级跳表中排列顺序在与节点数量阈值对应的节点之后的所有节点,并且删除被删除的节点所存储的指针所指示的存储空间,其中,所述排列顺序为时间由近及远的排列顺序。
可选地,在内存中维护数据的方法还包括:设置过期期限长度;以预定周期遍历与各个分片对应的第一级跳表和第二级跳表,通过定位第二级跳表中的时间戳的取值达到所述过期期限长度的节点来整体删除第二级跳表中的排列顺序在该节点之后的节点,其中,所述排列顺序为时间由近及远的排列顺序。
根据本公开的另一示例性实施例,提供一种管理内存数据的系统,包括:分片管理装置,用于设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同;跳表管理装置,用于为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
可选地,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
根据本公开的另一示例性实施例,提供一种在内存中维护数据的系统,包括:分片确定装置,用于针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点;节点查找装置,用于从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点;节点管理装置,用于在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
可选地,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
可选地,其中,分片确定装置计算与所述待插入的数据记录的关于所述每个分片组的索引字段的取值对应的哈希值,获得计算出的哈希值除以所述每个分片组的分片总数所得的余数,并且将与获得的余数对应的分片确定为对应的分片。
可选地,其中,每个分片中存储有指示对应的第一级跳表的指针或对象。
可选地,在内存中维护数据的系统还包括:跳表管理装置,其中,在未能查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,跳表管理装置创建第二级跳表,节点管理装置在第一级跳表中创建以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字且以指示创建的第二级跳表的指针或对象为与该关键字对应的值的节点,并在创建的第二级跳表中添加以与所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
可选地,用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间中存储有通过以下方式之一获得的字符串:按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并,按照预定的JSON格式对所述至少一个属性字段的取值进行序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行序列化,以及按照预定的Schema格式对所述至少一个属性字段的取值进行序列化。
可选地,在内存中维护数据的系统还包括:分片组确定装置和数据获取装置,其中,分片组确定装置确定所述多个分片组中索引字段与待查询的数据记录的索引字段相同的分片组,分片确定装置在确定的分片组中,根据所述待查询的数据记录的索引字段的取值来确定对应的分片,节点查找装置从与确定的分片对应的第一级跳表中查找以所述待查询的数据记录的索引字段的取值为关键字的节点,数据获取装置从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针,并从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值。
可选地,数据获取装置根据查询到的指针,通过以下方式之一来取出所述待查询的数据记录的所述至少一个属性字段的取值:按照预定的字符串拆分规则对所述至少一个属性字段的取值进行拆分,按照预定的JSON格式对所述至少一个属性字段的取值进行反序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行反序列化,以及按照预定义的Schema格式对所述至少一个属性字段的取值进行反序列化。
可选地,分片确定装置计算与所述待查询的数据记录的索引字段的取值对应的哈希值,获得计算出的哈希值除以所述确定的分片组的分片总数所得的余数,并将与获得的余数对应的分片确定为对应的分片。
可选地,所述待插入的数据记录和/或所述待查询的数据记录是时序型数据记录,并且,排序字段均为时间戳。
可选地,所述取值范围指定时间戳的起始值和终止值或者指定时间戳的终止值。
可选地,节点管理装置按照时间戳的取值指示的时间添加节点,使得第二级跳表中的节点按照时间由近及远的顺序排列。
可选地,在内存中维护数据的系统还包括:节点数量阈值设置装置,用于设置与第二级跳表对应的节点数量阈值,其中,数据获取装置从查找到的节点中的指针或对象所指示的第二级跳表中,按照由近及远的顺序取出关键字在所述取值范围内的预定数量的节点中的每个节点中存储的指针,其中,所述预定数量不超过所述节点数量阈值。
可选地,在内存中维护数据的系统还包括:节点数量阈值设置装置、跳表遍历装置和数据删除装置,其中,节点数量阈值设置装置设置与第二级跳表对应的节点数量阈值,跳表遍历装置以预定周期分别遍历与每个分片组的对应的第一级跳表和第二级跳表,当遍历到的与所述每个分片组对应的第二级跳表中的节点数量超过节点数量阈值时,节点删除装置根据该第二级跳表中的节点的排列顺序,删除该第二级跳表中排列顺序在与节点数量阈值对应的节点之后的所有节点,并且删除被删除的节点所存储的指针所指示的存储空间,其中,所述排列顺序为时间由近及远的排列顺序。
可选地,在内存中维护数据的系统还包括:过期期限长度设置装置、跳表遍历装置和数据删除装置,其中,过期期限长度设置装置设置过期期限长度,跳表遍历装置以预定周期遍历与各个分片对应的第一级跳表和第二级跳表,数据删除装置整体删除排列顺序在第二级跳表中的时间戳的取值达到所述过期期限长度的节点之后的节点,其中,所述排列顺序为时间由近及远的排列顺序。
根据本公开的另一示例性实施例,提供一种存储指令的计算机可读存储介质,其中,当所述指令被至少一个计算装置运行时,促使所述至少一个计算装置执行如上所述的方法。
根据本公开的另一示例性实施例,提供一种包括至少一个计算装置和至少一个存储指令的存储装置的系统,其中,所述指令在被所述至少一个计算装置运行时,促使所述至少一个计算装置执行如上所述的方法。
在根据本公开的示例性实施例的方法和系统中,可设置每个分片组中的所有分片对应统一的索引字段和排序字段的多个分片组,可为每个分片分别构建对应的第一级跳表和第二级跳表,使得与每个分片对应的第一级跳表存储以数据记录中关于索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表存储以数据记录中关于排序字段的取值为关键字且以指示所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
通过这样的方式,当执行数据写入时,可对所述多个分片组进行并行处理,可基于索引字段快速定位对应的分片和对应的第一级跳表,也可使用共享的存储空间来存储属性字段的取值。在这种情况下,可减少处理时间并提高处理效率。当进行查询时,可基于待查询的数据记录的索引字段的取值在对应的分片组中快速定位对应的分片以及与该分片对应的第一级跳表和第二级跳表并基于排序字段快速定位用于存储属性字段的取值的存储空间,从而可减少处理时间并提高处理效率。当执行数据写入时,可对多个分片组进行并行处理,也可并行的对同一分片组中的分片进行数据写入;当执行数据查询时,可并行的对来自同一分片组或不同分片组的不同分片进行数据查询。由此,可提高单位时间内能够同时执行的数据写入任务和/或数据查询任务的数量。另外,可将数据记录的任意一个属性字段设置为索引字段,从而可根据需要的属性字段灵活、方便地进行数据记录的写入和查询。
将在接下来的描述中部分阐述本公开总体构思另外的方面和/或优点,还有一部分通过描述将是清楚的,或者可以经过本公开总体构思的实施而得知。
附图说明
通过下面结合示例性地示出实施例的附图进行的描述,本公开示例性实施例的上述和其他目的和特点将会变得更加清楚,其中:
图1示出根据本公开的示例性实施例的管理内存数据的方法的流程图;
图2示出根据本公开的示例性实施例的分片的示意图;
图3示出根据本公开的示例性实施例的在内存中维护数据的方法的流程图;
图4示出根据本公开的示例性实施例的插入数据记录的操作的示意图;
图5示出根据本公开示例性实施例的在内存中查询数据的操作的流程图;
图6示出根据本公开的示例性实施例的管理内存数据的系统的框图;以及
图7示出根据本公开的示例性实施例的在内存中维护数据的系统的框图。
具体实施方式
现将详细参照本公开的实施例,所述实施例的示例在附图中示出,其中,相同的标号始终指的是相同的部件。以下将通过参照附图来说明所述实施例,以便解释本公开。
图1示出根据本公开的示例性实施例的管理内存数据的方法的流程图。如图1中所示,根据本公开的示例性实施例的管理内存数据的方法可包括步骤S110和步骤S120。在步骤S110,设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同。在步骤S120,为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。作为示例,每个分片组的索引字段和排序字段不同。
作为示例,每个分片中存储有指示对应的第一级跳表的指针或对象。
作为示例,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,这可对应于不同分片组的排序字段相同的情况。作为示例,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值,这可对应于不同分片组的排序字段不同的情况。
在本公开的示例性实施例中,分片组可以是分片的集合,一个分片组可包括一个或更多个分片;分片组的索引字段指的是与分片组对应的索引字段,分片组的排序字段指的是与分片组对应的排序字段;数据记录可具有一个或更多个属性字段,索引字段可以是数据记录的一个属性字段,排序字段也可以是数据记录的一个属性字段。例如,索引字段是卡号或商户类别码(Merchant Category Code,简称为MCC)等,排序字段是时间戳或年龄等。
在本公开的示例性实施例中,第一级跳表和第二级跳表为skiplist,也被称为跳跃表。可通过指针或对象将分片与第一级跳表进行关联。相应地,通过分片中存储的指针或对象,可定位与该分片对应的第一级跳表。可通过指针或对象将第一级跳表与第二级跳表进行关联。相应地,通过第一级跳表中存储的指针或对象,可定位与第一级跳表对应的第二级跳表。这里的对象与面向对象编程(Object Oriented,简称为OO)技术中定义的对象类似。
作为示例,在创建数据表时,可定义分片组的索引字段和/或排序字段,例如,定义哪个字段为索引字段,哪个字段为排序字段。可选地,可定义索引字段和/或排序字段的排列顺序。例如,定义第一个索引字段为卡号且第二个索引字段为商户类别码。又如,定义第一个排序字段为时间戳且第二个索引字段为年龄。
作为示例,在创建数据表时,可指定不同分片组的排序字段相同还是不同。例如,可指定不同分片组的排序字段同为时间戳。
在本公开的示例性实施例中,数据表可包括:多个分片组、与所述多个分片组中的每个分片分别对应的第一级跳表和第二级跳表。数据表还可包括或不包括用于存储数据记录的属性字段的取值的存储空间。可选地,用于存储数据记录的属性字段的取值的存储空间独立于数据表。
作为示例,可通过接口create(table_name,ttl,ttl-type,key_1:type_1:index,key_2:type_2:index,……,key_N:type_N:index,value:type)来创建数据表。用户可通过接口create在内存中创建数据表。相应地,当通过接口create接收到用户创建数据表的请求时,可执行步骤S110和步骤S120。换言之,可通过接口create接收执行步骤S110和步骤S120所需要的信息,其中,“table_name”表示数据表的名称;ttl(存活时间,time to live)表示数据表中存储的数据的存活阈值,其根据不同的存活过期类型(该类型由ttl-type字段来指示)而具有不同的取值范围,例如,当ttl-type字段指示按照数量阈值限制来删除过期数据时,ttl的取值可以是数据记录的最大保留数量,例如,当tll为100时,表示数据表可存储100条数据(例如,最近的100条数据),超出部分的数据会被删除;又例如,当ttl-type字段指示按照时间阈值限制来删除过期数据时,ttl的取值可以是数据记录的最大保留时段,例如,当tll为3天时,表示数据表可存储最近三天的数据,在此之前的数据会被删除。“key_i:type_i:index”表示与第i个分片组对应的索引字段(可称为第i个索引字段)的名称和索引字段的数据类型(1≤i≤N),N为自然数,其中,key_i表示第i个索引字段的名称,type_i表示第i个索引字段的数据类型,“index”表示key_i为索引字段,其仅仅是索引字段标识,可被替换为任何表示key_i是索引字段的字符或字符组合;“value:type”表示至少一个非索引字段的属性字段作为整体的名称(其中,所述至少一个属性字段的取值可被编码为整体)和对应的数据类型。在本示例中,排序字段是预先设置的属性字段,例如,时间戳,因此,可不在接口中设置排序字段。本公开的示例性是示例中的数据类型可包括:字符串型、浮点型等。
作为示例,可通过接口create(table_name,ttl,ttl-type,key_1:type_1:index,key_2:type_2:index,……,key_N:type_N:index,value_1:value_type_1,……,value_M:value_type_M)来创建数据表。接口create后的括号内是接口的参数。除了“value_1:value_type_1,……,value_M:value_type_M”之外的参数的设置与以上接口create的示例中对应参数的设置类似,这里不再赘述。对于“value_1:value_type_1,……,value_M:value_type_M”,value_j:value_type_j表示第j个非索引字段的属性字段的名称和类型,其中,1≤j≤M,M为自然数。
作为示例,在以上任意一个接口create的示例中,可增加参数“field_1:field_type_1:order,field_2:field_type_2:order,……,field_N:field_type_N:order”,其中,field_i表示与第i个分片组对应的排序字段(可称为第i个排序字段)的名称(1≤i≤N),N为自然数,field_type_i表示第i个排序字段的数据类型,“order”表示field_i为排序字段,其仅仅是排序字段标识,可被替换为任何表示field_i是排序字段的字符或字符组合。
以上接口create的示例仅仅用于描述本公开的构思,并不用于限制本公开的保护范围,其他用于创建数据表的接口也是可行的,例如,可省略以上接口中的一个或更多个参数,也可为以上接口增加一个或更多个参数。
可参照表1来理解本公开的示例性实施例中的数据记录。表1示出了根据本公开的示例性实施例的与银行交易有关的数据记录。表1所示数据记录可包括如下属性字段:卡号、时间戳、交易金额、交易地点、POS(Point of Sale,简称为POS)编号。表1包括3条数据记录。可将卡号作为索引字段,可将时间戳作为排序字段。
表1
卡号 | 时间戳 | 交易金额 | 交易地点 | POS编号 |
6222XXXX01 | 2018052814520505 | 100 | 北京上地xx路 | 10xxx |
6222XXXX01 | 2018052815520505 | 50 | 北京西二旗xx店 | 20xxx |
6222XXXX02 | 2018052811520505 | 1000 | 南京鼓楼区xxx | 30xxx |
图2示出根据本公开的示例性实施例的分片的示意图。如图2所示,分片0至分片n为n+1个分片,其中,n为大于2的自然数。这些分片中的每个分片对应一个第一级跳表。与分片0对应的第一级跳表包括节点11至节点1m,其中,m为自然数。每个分片中可存储指示对应的第一级跳表的指针或对象,以便于定位到与分片对应的第一级跳表。第一级跳中的每个节点可对应一个第二级跳表。与节点11对应的第二级跳表包括节点41至节点4k,与节点12对应的第二级跳表包括节点31至节点3j,与节点1m对应的第二级跳表包括节点21至节点2i,其中,i、j、k为自然数。第一级跳表的每个节点中可存储指示对应的第二级跳表的指针或对象,以便于定位到与第一级跳表的节点对应的第二级跳表。
可在跳表的节点中设置键值(key-value)对。具体地,对于第一级跳表的节点,可将数据记录的索引字段的取值设置为关键字(key),并将指示第二级跳表的指针或对象设置为与关键字对应的值(value)。对于第二级跳表中的节点,可将数据记录的排序字段的取值设置为关键字,并且与关键字对应的值为指针,该指针指示存储数据记录的至少一个属性字段的取值的存储空间。
作为示例,所述至少一个属性字段的取值包括数据记录的索引字段的取值和/或排序字段的取值,或者所述至少一个属性字段的取值既不包括数据记录的索引字段的取值也不包括数据记录的排序字段的取值。
另外,在第一级跳表的节点中可存储有指示该第一级跳表中的另一节点的指针或对象。在第二级跳表的节点中也可存储有指示该第二级跳表中的另一节点的指针或对象。对于第一级跳表或第二级跳表,当跳表中已经存在节点时,除了尾部节点之外的每个节点中存储有一个指示与该节点同属于一个跳表的节点的对象或指针,以便使跳表形成链状结构。当向第一节点和第二节点之间插入第三节点时,需要将第一节点中指示第二节点的指针或对象改变为指示第三节点,并在第三节点中利用指针或对象指示第二节点。
图3示出根据本公开的示例性实施例的在内存中维护数据的方法的流程图。如图3中所示,根据本公开的示例性实施例的在内存中维护数据的方法可包括步骤S210、步骤S220和步骤S230。
在步骤S210,针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点。作为示例,每个分片组的索引字段和排序字段不同。
作为示例,每个分片中存储有指示对应的第一级跳表的指针或对象。
作为示例,确定对应的分片的步骤包括:计算与所述待插入的数据记录的关于所述每个分片组的索引字段的取值对应的哈希值;获得计算出的哈希值除以所述每个分片组的分片总数所得的余数;将与获得的余数对应的分片确定为对应的分片。可使用哈希函数对索引字段的取值进行计算,以获得哈希值。例如,使用的哈希函数可以是由AustinAppleby提出的哈希函数Murmurhash。当然,本公开并不对使用的哈希函数进行限制,其他哈希函数也可用于哈希值的计算。在一个分片组包括分片0至分片n的情况下,例如,图2中所示各个分片属于同一分片组,如果余数是0,则所述一个分片组中的分片0与待插入的数据记录对应;如果余数是h(0<h≤n),则所述一个分片组中的分片h与待插入的数据记录对应。
在步骤S220,从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点。
在步骤S230,在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
作为示例,根据本公开的示例性实施例的在内存中维护数据的方法还包括:在未能查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,创建第二级跳表,在第一级跳表中创建以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字且以指示创建的第二级跳表的指针或对象为与该关键字对应的值的节点,并在创建的第二级跳表中添加以与所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
作为示例,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,这可对应于不同分片组的排序字段相同的情况。作为示例,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值,这可对应于不同分片组的排序字段不同的情况。
作为示例,当执行数据记录的插入时,对每个分片组都进行处理,对分片组的处理包括对与分片组对应的分片以及与分片对应的第一级跳表和第二级跳表的处理。具体而言,当执行数据记录的插入时,可接收作为数据记录的关于每个索引字段的取值和数据记录的至少一个属性字段的取值,还可接收数据记录的排序字段的取值。可从用户输入接收上述取值,当接收到该用户输入时,可按照以上描述的步骤S210、步骤S220和步骤S230来进行处理。
作为示例,可通过接口put(table_name,ts,key_1,key_2,……,key_N,value)来插入数据记录,该示例可对应于不同分片组的排序字段相同的情况。在插入数据记录前,可预先指定不同分片组的排序字段相同,例如,不同分片组的排序字段同为时间戳。这里,“table_name”表示将插入数据记录的数据表的名称,“ts”表示排序字段的取值,key_1,key_2,……,key_N表示待插入的数据记录的各个索引字段的取值,“value”表示待插入的数据记录的至少一个属性字段的取值。作为示例,该value可以是按照特定规则通过对所述至少一个属性值进行编码(例如,合并或序列化)而得到的值。
作为示例,待插入的数据记录的各个索引字段的取值的排列顺序与所述多个分片组的各个索引字段的排列顺序相同。换言之,接口put中的各个索引字段的取值(key_1,key_2,……,key_N)的排列顺序与数据表的分片组的各个索引字段的排列顺序相同。在这种情况下,可根据接口put中key_1,key_2,……,key_N的排列顺序确定每个取值对应的索引字段,从而可方便、高效的进行数据记录的插入操作。
作为示例,可通过接口put(table_name,key_1,key_2,……,key_N,field_1,field_2,……,field_N,value)来插入数据记录,该示例可对应于不同分片组的排序字段不同的情况,其中,field_1,field_2,……,field_N表示与key_1,key_2,……,key_N分别对应的各个排序字段的取值。该接口中的其他参数可参照对于接口put(table_name,ts,key_1,key_2,……,key_N,value)的描述来理解。
以上接口put的示例仅仅用于描述本公开的构思,并不用于限制本公开的保护范围,其他用于插入数据记录的接口也是可行的,例如,可省略以上接口中的一个或更多个参数,也可为以上接口增加一个或更多个参数。
作为示例,待插入的数据记录的各个排序字段的取值的排列顺序与所述多个分片组的各个排序字段的排列顺序相同。换言之,接口put中的各个排序字段的取值(field_1,field_2,……,field_N)的排列顺序与数据表的分片组的各个排序字段的排列顺序相同。在这种情况下,可根据接口put中field_1,field_2,……,field_N的排列顺序确定field_1,field_2,……,field_N中每个取值对应的索引字段,从而可方便、高效的进行数据记录的插入操作。
根据本公开的示例性实施例,待插入数据表的数据记录可以是如表1中所示的数据记录。可借助于上述接口put逐个插入表1中的各条数据记录。可将卡号作为索引字段,将时间戳作为排序字段。可将卡号的取值、时间戳的取值、交易金额的取值、交易地点的取值和POS编号的取值进行编码(例如,序列化或合并)以便被存储到与所有第二级跳表共享的存储空间中。
作为示例,用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间中存储有通过以下方式之一获得的字符串:按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并,按照预定的JSON格式对所述至少一个属性字段的取值进行序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行序列化,以及按照预定的Schema格式对所述至少一个属性字段的取值进行序列化。
作为示例,预定的字符串合并规则包括按照特定符号(例如,“|”)合并。例如,可根据预先设置的符号例如“|”,将交易金额的取值、交易地点的取值、POS编号的取值合并为字符串“100|北京上地xx路|10xxx”,并将该字符串存储到存储空间中。除了按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并以获得字符串之外,上述利用JSON格式、ProtocolBuffer格式和Schema格式获得字符串也是可行的。当然,以上描述仅仅作为示例而不应该被视为限制。
作为示例,所述待插入的数据记录是时序型数据记录,排序字段均为时间戳。作为示例,在第二级跳表中添加节点的步骤包括:按照时间戳的取值指示的时间添加节点,使得第二级跳表中的节点按照时间由近及远的顺序排列。可通过比较时间戳的取值来确定时间的远近,与较大的时间戳的取值对应的时间比与较小的时间戳的取值对应的时间近。因此,在第二级跳表中,可将时间戳的取值较大的节点排列在时间戳的取值较小的节点之前。
下面以待插入的数据记录为表1中的第1条数据记录为例来说明在内存中维护数据的方法。假设数据表包括两个分片组,第一个分片组的索引字段为卡号,第二个分片组的索引字段为POS编号,两个分片组的排序字段均为时间戳,两个分片组的第二级跳表共享存储空间SP。在步骤S210,对于第一分片组,根据卡号的取值“6222XXXX01”确定对应的分片(例如,分片0);对于第二分片组,根据POS编号的取值“10xxx”确定对应的分片(例如,分片3)。在步骤S210,对于第一分片组,从与分片0对应的第一级跳表中查找以“6222XXXX01”为关键字的节点(例如,查找到节点11);对于第二分片组,从与分片3对应的第一级跳表中查找以“10xxx”为关键字的节点(例如,查找到节点333)。在步骤S230,对于第一分片组,在与节点11对应的第二级跳表中插入以时间戳的取值“2018052814520505”为关键字且以指向存储空间SP的指针为与关键字对应的值的节点;对于第二分片组,在与节点333对应的第二级跳表中插入以时间戳的取值“2018052814520505”为关键字且以指向存储空间SP的指针为与关键字对应的值的节点,将“6222XXXX01”、“2018052814520505”、“100”、“北京上地xx路”以及“10xxx”编码后存储到存储空间S中。
另外,在待插入的数据记录为表1中的第1条数据记录至第3条数据记录的情况下。对于同一分片组而言,第1条数据记录和第2条数据记录具有相同的卡号,因此,这两条数据记录对应于同一个第二级跳表。在该第二级跳表中,当第1条数据记录被添加之后,由于第2条数据记录的时间戳的取值比第1条数据记录的时间戳的取值大,因此,将与第2条数据记录对应的节点添加到与第1条数据记录对应的节点之前。
图4示出根据本公开的示例性实施例的插入数据记录的操作的示意图。如图4中所示,可通过put接口(例如,如上所述的put接口)向内存中的数据表插入数据记录。本示例性实施例对应于不同分片组的排序字段相同的情况。通过put接口输入的各个索引字段的取值为key1、key2和key3,key1、key2和key3分别对应维度a、维度b和维度c,通过put接口输入的排序字段的取值为ts,通过put接口输入的至少一个属性字段的取值为value。数据表可包括分片组a、分片组b和分片组c。分片组a、分片组b和分片组c的索引字段分别对应于key1、key2和key3。分片组a、分片组b和分片组c的排序字段对应于ts。分片组a的索引字段、分片组b的索引字段和分片组c的索引字段三者的排列顺序与key1、key2和key3三者的排列顺序相同。当获知key1、key2和key3中任意一个取值的顺序即可确定该取值为哪个索引字段的取值。
图5示出根据本公开示例性实施例的在内存中查询数据的操作的流程图。如图5中所示,根据本公开示例性实施例的在内存中查询数据的操作包括步骤S310至步骤S360。
在步骤S310,接收待查询的数据记录的索引字段、索引字段的取值和排序字段的取值范围。这里,待查询的数据记录的索引字段指的是待查询的数据记录的索引字段的名称,例如,卡号。
作为示例,所述待查询的数据记录是时序型数据记录,并且,排序字段均为时间戳。
作为示例,所述取值范围指定时间戳的起始值和终止值或者指定时间戳的终止值。
在步骤S320,确定所述多个分片组中索引字段与待查询的数据记录的索引字段相同的分片组。
在步骤S330,在确定的分片组中,根据所述待查询的数据记录的索引字段的取值来确定对应的分片。
作为示例,可通过如下操作确定与待查询的数据记录对应的分片:计算与所述待查询的数据记录的索引字段的取值对应的哈希值;获得计算出的哈希值除以所述确定的分片组的分片总数所得的余数;将与获得的余数对应的分片确定为对应的分片。可使用哈希函数对索引字段的取值进行计算,以获得哈希值。例如,使用的哈希函数可以是由AustinAppleby提出的哈希函数Murmurhash。当然,本公开并不对使用的哈希函数进行限制,其他哈希函数也可用于哈希值的计算。
在步骤S340,从与确定的分片对应的第一级跳表中查找以所述待查询的数据记录的索引字段的取值为关键字的节点。
在步骤S350,从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针。
在步骤S360,从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值。
作为示例,可通过接口scan(table_name,key_name,key_value,start_time,end_time)来进行数据查询,其中,table_name用于限定从中查询数据的数据表的名称,key_name用于限定待查询的数据记录的索引字段,key_value用于限定待查询的数据记录的索引字段的取值,start_time和end_time用于限定待查询的数据记录的取值范围,例如,起始时间和终止时间。本示例可对应于数据表的所有分片组对应的排序字段相同的情况。
作为示例,可通过接口get(table_name,key_name,key_value,ts)来进行数据查询,其中,table_name用于限定从中查询数据的数据表的名称,key_name用于限定待查询的数据记录的索引字段,key_value用于限定待查询的数据记录的索引字段的取值,ts用于限定待查询的数据记录的取值范围,例如,ts用于限定待查询的数据记录的时间戳的取值,在这种情况下,实际期望查询的是时间戳的取值为ts的数据;又例如,ts用于限定待查询的数据记录的终止时间,在这种情况下,实际期望查询的是从查询数据的时刻开始到指定的ts为止的数据。本示例可对应于数据表的所有分片组对应的排序字段相同的情况。
以上接口scan和接口get的示例仅仅用于描述本公开的构思,并不用于限制本公开的保护范围,其他的用于数据查询的接口也是可行的,例如,可省略以上接口中的一个或更多个参数,也可为以上接口增加一个或更多个参数。
以表1中的数据记录为例,需要查询卡号的取值为“6222XXXX01”并且时间戳的起始值为“2018052815520505”且终止值为“2018052814520505”的数据。假设根据“6222XXXX01”确定将卡号作为索引字段的分片组中与待查询的数据记录对应的分片为分片0,从与分片0对应的第一级跳表的节点11节点1m中查找出以“6222XXXX01”为关键字的节点为节点11,确定与节点11对应的第二级跳表包括节点41至节点4k。从节点41至节点4k查找关键字的起始值为“2018052815520505”且终止值为“2018052814520505”的节点。从查找到的第二级跳表的节点存储的指针所指向的存储空间中取出数据。又如,当所述取值范围仅指定时间戳的终止值(例如,“2018052814520505”)时,可查找第二级跳表中的关键字的取值大于或等于“2018052814520505”的节点,从查找到的第二级跳表的节点存储的指针所指向的存储空间中取出数据。
作为示例,从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值的步骤包括:通过以下方式之一来取出所述待查询的数据记录的所述至少一个属性字段的取值:按照预定的字符串拆分规则对所述至少一个属性字段的取值进行拆分,按照预定的JSON格式对所述至少一个属性字段的取值进行反序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行反序列化,以及按照预定义的Schema格式对所述至少一个属性字段的取值进行反序列化。
例如,从查找到的节点中查找出与关键字对应的值分别为“100|北京上地xx路|10xxx”和“50|北京西二旗xx店|20xxx”。可根据预先设定的符号例如“|”对“100|北京上地xx路|10xxx”进行拆分,并根据预先设定的拆分出的字符串的含义获得第一个拆分出的字符串为交易金额的取值“100”,第二个拆分出的字符串为交易地点的取值“北京上地xx路”,第三个拆分出的字符串为POS编号的取值“10xxx”。类似地,可从“50|北京西二旗xx店|20xxx”获得交易金额的取值“50”、交易地点的取值“北京西二旗xx店”以及POS编号的取值“20xxx”。
作为示例,为了保证内存(例如,内存的数据表)中不会存储过多数据,可设置与第二级跳表对应的节点数量阈值。在此基础上,从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针的步骤包括:从查找到的节点中的指针或对象所指示的第二级跳表中,按照由近及远的顺序取出关键字在所述取值范围内的预定数量的节点中的每个节点中存储的指针,其中,所述预定数量不超过所述节点数量阈值。
作为示例,可设置与第二级跳表对应的节点数量阈值,并且根据设置的节点数量阈值进行定期删除,即:以预定周期分别遍历与每个分片组的对应的第一级跳表和第二级跳表;当遍历到的与所述每个分片组对应的第二级跳表中的节点数量超过节点数量阈值时,根据该第二级跳表中的节点的排列顺序,删除该第二级跳表中排列顺序在与节点数量阈值对应的节点(例如,当节点数量阈值为10时,根据第二级跳表中的节点的排列顺序,与该节点数量阈值对应的节点为第10个节点)之后的所有节点,并且删除被删除的节点所存储的指针所指示的存储空间,其中,所述排列顺序为时间由近及远的排列顺序。
作为示例,为了提高处理效率,可执行如下的过期数据删除操作:设置过期期限长度;以预定周期(例如,3个月)遍历与各个分片对应的第一级跳表和第二级跳表,通过定位第二级跳表中的时间戳的取值达到所述过期期限长度的节点来整体删除第二级跳表中的排列顺序在该节点之后的节点,其中,所述排列顺序为时间由近及远的排列顺序。例如,与设置的过期期限长度对应的时间戳的取值为2018060000000000,可通过上述过期数据删除操作将以上示例中添加到第二级跳表中的与表1中的3条数据对应的3个节点均删除。
图6示出根据本公开示例性实施例的管理内存数据的系统的框图。如图6中所示,根据本公开示例性实施例的管理内存数据的系统包括:分片管理装置410和跳表管理装置420。
分片管理装置410用于设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同。
跳表管理装置420用于为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
作为示例,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
图7示出根据本公开示例性实施例的在内存中维护数据的系统的框图。如图7中所示,根据本公开示例性实施例的在内存中维护数据的系统包括:分片确定装置510、节点查找装置520和节点管理装置530。
分片确定装置510用于针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点。
节点查找装置520用于从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点。
节点管理装置530用于在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
作为示例,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
作为示例,分片确定装置510计算与所述待插入的数据记录的关于所述每个分片组的索引字段的取值对应的哈希值,获得计算出的哈希值除以所述每个分片组的分片总数所得的余数,并且将与获得的余数对应的分片确定为对应的分片。
作为示例,每个分片中存储有指示对应的第一级跳表的指针或对象。
作为示例,根据本公开示例性实施例的在内存中维护数据的系统还包括:跳表管理装置,其中,在未能查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,跳表管理装置创建第二级跳表,节点管理装置530在第一级跳表中创建以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字且以指示创建的第二级跳表的指针或对象为与该关键字对应的值的节点,并在创建的第二级跳表中添加以与所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
作为示例,用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间中存储有通过以下方式之一获得的字符串:按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并,按照预定的JSON格式对所述至少一个属性字段的取值进行序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行序列化,以及按照预定的Schema格式对所述至少一个属性字段的取值进行序列化。
作为示例,根据本公开示例性实施例的在内存中维护数据的系统还包括:分片组确定装置(未示出)和数据获取装置(未示出),其中,分片组确定装置确定所述多个分片组中索引字段与待查询的数据记录的索引字段相同的分片组,分片确定装置510在确定的分片组中,根据所述待查询的数据记录的索引字段的取值来确定对应的分片,节点查找装置530从与确定的分片对应的第一级跳表中查找以所述待查询的数据记录的索引字段的取值为关键字的节点,数据获取装置从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针,并从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值。
作为示例,数据获取装置根据查询到的指针,通过以下方式之一来取出所述待查询的数据记录的所述至少一个属性字段的取值:按照预定的字符串拆分规则对所述至少一个属性字段的取值进行拆分,按照预定的JSON格式对所述至少一个属性字段的取值进行反序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行反序列化,以及按照预定义的Schema格式对所述至少一个属性字段的取值进行反序列化。
作为示例,分片确定装置510计算与所述待查询的数据记录的索引字段的取值对应的哈希值,获得计算出的哈希值除以所述确定的分片组的分片总数所得的余数,并将与获得的余数对应的分片确定为对应的分片。
作为示例,所述待插入的数据记录和/或所述待查询的数据记录是时序型数据记录,并且,排序字段均为时间戳。
作为示例,所述取值范围指定时间戳的起始值和终止值或者指定时间戳的终止值。
作为示例,节点管理装置530按照时间戳的取值指示的时间添加节点,使得第二级跳表中的节点按照时间由近及远的顺序排列。
作为示例,根据本公开示例性实施例的在内存中维护数据的系统还包括:节点数量阈值设置装置(未示出),用于设置与第二级跳表对应的节点数量阈值,其中,数据获取装置从查找到的节点中的指针或对象所指示的第二级跳表中,按照由近及远的顺序取出关键字在所述取值范围内的预定数量的节点中的每个节点中存储的指针,其中,所述预定数量不超过所述节点数量阈值。
作为示例,根据本公开示例性实施例的在内存中维护数据的系统还包括:节点数量阈值设置装置(未示出)、跳表遍历装置(未示出)和数据删除装置(未示出),其中,节点数量阈值设置装置设置与第二级跳表对应的节点数量阈值,跳表遍历装置以预定周期分别遍历与每个分片组的对应的第一级跳表和第二级跳表,当遍历到的与所述每个分片组对应的第二级跳表中的节点数量超过节点数量阈值时,节点删除装置根据该第二级跳表中的节点的排列顺序,删除该第二级跳表中排列顺序在与节点数量阈值对应的节点之后的所有节点,并且删除被删除的节点所存储的指针所指示的存储空间,其中,所述排列顺序为时间由近及远的排列顺序。
作为示例,根据本公开示例性实施例的在内存中维护数据的系统还包括:过期期限长度设置装置(未示出)、跳表遍历装置(未示出)和数据删除装置(未示出),其中,过期期限长度设置装置设置过期期限长度,跳表遍历装置以预定周期遍历与各个分片对应的第一级跳表和第二级跳表,数据删除装置整体删除排列顺序在第二级跳表中的时间戳的取值达到所述过期期限长度的节点之后的节点,其中,所述排列顺序为时间由近及远的排列顺序。
应该理解,根据本公开示例性实施例的管理内存数据的系统和在内存中维护数据的系统的具体实现方式可参照结合图1至图5以及表1描述的相关具体实现方式来实现,在此不再赘述。
图6和图7所示出的装置可被分别配置为执行特定功能的软件、硬件、固件或上述项的任意组合。例如,这些装置可对应于专用的集成电路,也可对应于纯粹的软件代码,还可对应于软件与硬件相结合的单元或模块。此外,这些装置所实现的一个或多个功能也可由物理实体设备(例如,处理器、客户端或服务器等)中的组件来统一执行。
以上参照图1到图5描述了根据本公开示例性实施例的管理内存数据及在内存中维护数据的方法和系统。应理解,上述方法可通过记录在计算可读介质上的程序来实现,例如,根据本公开的示例性实施例,可提供一种存储指令的计算机可读存储介质,其中,当所述指令被至少一个计算装置运行时,促使所述至少一个计算装置执行:设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同;为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
又如,根据本公开的示例性实施例,可提供一种存储指令的计算机可读存储介质,其中,当所述指令被至少一个计算装置运行时,促使所述至少一个计算装置执行:针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点;从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点;在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
上述计算机可读存储介质中的计算机程序可在诸如处理器、客户端、主机、代理装置、服务器等计算机设备中部署的环境中运行,例如,由位于单机环境或分布式集群环境的至少一个计算装置来运行,作为示例,这里的计算装置可作为计算机、处理器、计算单元(或模块)、客户端、主机、代理装置、服务器等。应注意,所述计算机程序还可用于执行除了上述步骤以外的附加步骤或者在执行上述步骤时执行更为具体的处理,这些附加步骤和进一步处理的内容已经参照图1到图5进行了描述,这里为了避免重复将不再进行赘述。
应注意,根据本公开示例性实施例的管理内存数据的系统及在内存中维护数据的系统可完全依赖计算机程序的运行来实现相应的功能,即,各个装置与计算机程序的功能架构中与各步骤相应,使得整个系统通过专门的软件包(例如,lib库)而被调用,以实现相应的功能。
另一方面,图6和图7所示的各个装置也可以通过硬件、软件、固件、中间件、微代码或其任意组合来实现。当以软件、固件、中间件或微代码实现时,用于执行相应操作的程序代码或者代码段可以存储在诸如存储介质的计算机可读介质中,使得处理器可通过读取并运行相应的程序代码或者代码段来执行相应的操作。
例如,根据本公开示例性实施例,可提供一种包括至少一个计算装置和至少一个存储指令的存储装置的系统,其中,所述指令在被所述至少一个计算装置运行时,促使所述至少一个计算装置执行管理内存数据的以下步骤:设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同;为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
又如,根据本公开示例性实施例,可提供一种包括至少一个计算装置和至少一个存储指令的存储装置的系统,其中,所述指令在被所述至少一个计算装置运行时,促使所述至少一个计算装置执行在内存中维护数据的以下步骤:针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点;从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点;在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
这里,所述系统可构成单机计算环境或分布式计算环境,其包括至少一个计算装置和至少一个存储装置,这里,作为示例,计算装置可以是通用或专用的计算机、处理器等,可以是单纯利用软件来执行处理的单元,还可以是软硬件相结合的实体。也就是说,计算装置可实现为计算机、处理器、计算单元(或模块)、客户端、主机、代理装置、服务器等。此外,存储装置可以是物理上的存储设备或逻辑上划分出的存储单元,其可与计算装置在操作上进行耦合,或者可例如通过I/O端口、网络连接等互相通信。
此外,例如,本公开的示例性实施例还可以实现为计算装置,该计算装置包括存储部件和处理器,存储部件中存储有计算机可执行指令集合,当所述计算机可执行指令集合被所述处理器执行时,执行管理内存数据的方法和/或在内存中维护数据的方法。
具体说来,所述计算装置可以部署在服务器或客户端中,也可以部署在分布式网络环境中的节点装置上。此外,所述计算装置可以是PC计算机、平板装置、个人数字助理、智能手机、web应用或其他能够执行上述指令集合的装置。
这里,所述计算装置并非必须是单个的计算装置,还可以是任何能够单独或联合执行上述指令(或指令集)的装置或电路的集合体。计算装置还可以是集成控制系统或系统管理器的一部分,或者可被配置为与本地或远程(例如,经由无线传输)以接口互联的便携式电子装置。
在所述计算装置中,处理器可包括中央处理器(CPU)、图形处理器(GPU)、可编程逻辑装置、专用处理器系统、微控制器或微处理器。作为示例而非限制,处理器还可包括模拟处理器、数字处理器、微处理器、多核处理器、处理器阵列、网络处理器等。
根据本公开示例性实施例的管理内存数据的方法和/或在内存中维护数据的方法中所描述的某些操作可通过软件方式来实现,某些操作可通过硬件方式来实现,此外,还可通过软硬件结合的方式来实现这些操作。
处理器可运行存储在存储部件之一中的指令或代码,其中,所述存储部件还可以存储数据。指令和数据还可经由网络接口装置而通过网络被发送和接收,其中,所述网络接口装置可采用任何已知的传输协议。
存储部件可与处理器集成为一体,例如,将RAM或闪存布置在集成电路微处理器等之内。此外,存储部件可包括独立的装置,诸如,外部盘驱动、存储阵列或任何数据库系统可使用的其他存储装置。存储部件和处理器可在操作上进行耦合,或者可例如通过I/O端口、网络连接等互相通信,使得处理器能够读取存储在存储部件中的文件。
此外,所述计算装置还可包括视频显示器(诸如,液晶显示器)和用户交互接口(诸如,键盘、鼠标、触摸输入装置等)。计算装置的所有组件可经由总线和/或网络而彼此连接。
根据本公开示例性实施例的管理内存数据的方法和/或在内存中维护数据的方法所涉及的操作可被描述为各种互联或耦合的功能块或功能示图。然而,这些功能块或功能示图可被均等地集成为单个的逻辑装置或按照非确切的边界进行操作。
以上描述了本公开的各示例性实施例,应理解,上述描述仅是示例性的,并非穷尽性的,本公开不限于所披露的各示例性实施例。在不偏离本公开的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。因此,本公开的保护范围应该以权利要求的范围为准。
Claims (36)
1.一种管理内存数据的方法,包括:
设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,其中,分片组的索引字段指的是数据记录的一个与所述分片组对应的属性字段;
为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
2.如权利要求1所述的方法,其中,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
3.一种在内存中维护数据的方法,包括:
针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,其中,分片组的索引字段指的是数据记录的一个与所述分片组对应的属性字段;
从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点;
在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
4.如权利要求3所述的方法,其中,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
5.如权利要求3所述的方法,其中,确定对应的分片的步骤包括:
计算与所述待插入的数据记录的关于所述每个分片组的索引字段的取值对应的哈希值;
获得计算出的哈希值除以所述每个分片组的分片总数所得的余数;
将与获得的余数对应的分片确定为对应的分片。
6.如权利要求3所述的方法,其中,每个分片中存储有指示对应的第一级跳表的指针或对象。
7.如权利要求3所述的方法,还包括:
在未能查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,创建第二级跳表,在第一级跳表中创建以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字且以指示创建的第二级跳表的指针或对象为与该关键字对应的值的节点,并在创建的第二级跳表中添加以与所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
8.如权利要求3或7所述的方法,其中,用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间中存储有通过以下方式之一获得的字符串:
按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并,按照预定的JSON格式对所述至少一个属性字段的取值进行序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行序列化,以及按照预定的Schema格式对所述至少一个属性字段的取值进行序列化。
9.如权利要求3所述的方法,其中,还包括:
确定所述多个分片组中索引字段与待查询的数据记录的索引字段相同的分片组;
在确定的分片组中,根据所述待查询的数据记录的索引字段的取值来确定对应的分片;
从与确定的分片对应的第一级跳表中查找以所述待查询的数据记录的索引字段的取值为关键字的节点;
从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针;
从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值。
10.如权利要求9所述的方法,其中,从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值的步骤包括:通过以下方式之一来取出所述待查询的数据记录的所述至少一个属性字段的取值:
按照预定的字符串拆分规则对所述至少一个属性字段的取值进行拆分,按照预定的JSON格式对所述至少一个属性字段的取值进行反序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行反序列化,以及按照预定义的Schema格式对所述至少一个属性字段的取值进行反序列化。
11.如权利要求9所述的方法,其中,确定对应的分片的步骤包括:
计算与所述待查询的数据记录的索引字段的取值对应的哈希值;
获得计算出的哈希值除以所述确定的分片组的分片总数所得的余数;
将与获得的余数对应的分片确定为对应的分片。
12.如权利要求9所述的方法,其中,所述待插入的数据记录和/或所述待查询的数据记录是时序型数据记录,并且,排序字段均为时间戳。
13.如权利要求12所述的方法,其中,所述取值范围指定时间戳的起始值和终止值或者指定时间戳的终止值。
14.如权利要求12所述的方法,其中,在第二级跳表中添加节点的步骤包括:按照时间戳的取值指示的时间添加节点,使得第二级跳表中的节点按照时间由近及远的顺序排列。
15.如权利要求14所述的方法,还包括:设置与第二级跳表对应的节点数量阈值,
其中,从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针的步骤包括:
从查找到的节点中的指针或对象所指示的第二级跳表中,按照由近及远的顺序取出关键字在所述取值范围内的预定数量的节点中的每个节点中存储的指针,其中,所述预定数量不超过所述节点数量阈值。
16.如权利要求12所述的方法,其中,还包括:
设置与第二级跳表对应的节点数量阈值;
以预定周期分别遍历与每个分片组的对应的第一级跳表和第二级跳表;
当遍历到的与所述每个分片组对应的第二级跳表中的节点数量超过节点数量阈值时,根据该第二级跳表中的节点的排列顺序,删除该第二级跳表中排列顺序在与节点数量阈值对应的节点之后的所有节点,并且删除被删除的节点所存储的指针所指示的存储空间,
其中,所述排列顺序为时间由近及远的排列顺序。
17.如权利要求12所述的方法,还包括:
设置过期期限长度;
以预定周期遍历与各个分片对应的第一级跳表和第二级跳表,通过定位第二级跳表中的时间戳的取值达到所述过期期限长度的节点来整体删除第二级跳表中的排列顺序在该节点之后的节点,
其中,所述排列顺序为时间由近及远的排列顺序。
18.一种管理内存数据的系统,包括:
分片管理装置,用于设置多个分片组,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,其中,分片组的索引字段指的是数据记录的一个与所述分片组对应的属性字段;
跳表管理装置,用于为每个分片分别构建对应的第一级跳表和第二级跳表,其中,与每个分片对应的第一级跳表被设置为用于存储以数据记录中关于所述每个分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,与所述每个分片对应的第二级跳表被设置为用于存储以所述数据记录中关于所述每个分片的排序字段的取值为关键字且以指示用于存储所述数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
19.如权利要求18所述的系统,其中,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者,与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
20.一种在内存中维护数据的系统,包括:
分片确定装置,用于针对多个分片组中的每个分片组,根据待插入的数据记录的关于所述每个分片组的索引字段的取值来确定对应的分片,其中,每个分片组包括至少一个分片,每个分片组中的所有分片对应统一的索引字段和排序字段,不同分片组的索引字段不同,并且,不同分片组的排序字段相同或不同,每个分片分别对应第一级跳表,第一级跳表用于存储以数据记录中关于对应分片的索引字段的取值为关键字且以指示第二级跳表的指针或对象为与该关键字对应的值的节点,其中,分片组的索引字段指的是数据记录的一个与所述分片组对应的属性字段;
节点查找装置,用于从与确定的分片对应的第一级跳表中查找以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点;
节点管理装置,用于在查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,在查找到的节点中的指针或对象所指示的第二级跳表中添加以所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
21.如权利要求20所述的系统,其中,与所有分片组对应的第二级跳表共享所述存储空间且所述存储空间存储所述数据记录的全部属性字段的取值,或者与同一分片组对应的第二级跳表共享同一存储空间且所述同一存储空间存储所述数据记录的除了与所述同一分片组对应的索引字段和排序字段之外的所有属性字段的取值。
22.如权利要求20所述的系统,其中,分片确定装置计算与所述待插入的数据记录的关于所述每个分片组的索引字段的取值对应的哈希值,获得计算出的哈希值除以所述每个分片组的分片总数所得的余数,并且将与获得的余数对应的分片确定为对应的分片。
23.如权利要求20所述的系统,其中,每个分片中存储有指示对应的第一级跳表的指针或对象。
24.如权利要求20所述的系统,还包括:跳表管理装置,其中,在未能查找到以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字的节点的情况下,跳表管理装置创建第二级跳表,节点管理装置在第一级跳表中创建以所述待插入的数据记录的关于所述每个分片组的索引字段的取值为关键字且以指示创建的第二级跳表的指针或对象为与该关键字对应的值的节点,并在创建的第二级跳表中添加以与所述待插入的数据记录的关于所述每个分片组的排序字段的取值为关键字且以指示用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间的指针为与该关键字对应的值的节点。
25.如权利要求20或24所述的系统,其中,用于存储所述待插入的数据记录的至少一个属性字段的取值的存储空间中存储有通过以下方式之一获得的字符串:
按照预定的字符串合并规则对所述至少一个属性字段的取值进行合并,按照预定的JSON格式对所述至少一个属性字段的取值进行序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行序列化,以及按照预定的Schema格式对所述至少一个属性字段的取值进行序列化。
26.如权利要求20所述的系统,还包括:分片组确定装置和数据获取装置,
其中,分片组确定装置确定所述多个分片组中索引字段与待查询的数据记录的索引字段相同的分片组,分片确定装置在确定的分片组中,根据所述待查询的数据记录的索引字段的取值来确定对应的分片,节点查找装置从与确定的分片对应的第一级跳表中查找以所述待查询的数据记录的索引字段的取值为关键字的节点,数据获取装置从查找到的节点中的指针或对象所指示的第二级跳表中查询关键字在所述待查询的数据记录的排序字段的取值范围内的节点中的指针,并从查询到的指针所指示的存储空间中取出待查询的数据记录的至少一个属性字段的取值。
27.如权利要求26所述的系统,其中,数据获取装置根据查询到的指针,通过以下方式之一来取出所述待查询的数据记录的所述至少一个属性字段的取值:
按照预定的字符串拆分规则对所述至少一个属性字段的取值进行拆分,按照预定的JSON格式对所述至少一个属性字段的取值进行反序列化,按照预定的ProtocolBuffer格式对所述至少一个属性字段的取值进行反序列化,以及按照预定义的Schema格式对所述至少一个属性字段的取值进行反序列化。
28.如权利要求26所述的系统,其中,分片确定装置计算与所述待查询的数据记录的索引字段的取值对应的哈希值,获得计算出的哈希值除以所述确定的分片组的分片总数所得的余数,并将与获得的余数对应的分片确定为对应的分片。
29.如权利要求26所述的系统,其中,所述待插入的数据记录和/或所述待查询的数据记录是时序型数据记录,并且,排序字段均为时间戳。
30.如权利要求29所述的系统,其中,所述取值范围指定时间戳的起始值和终止值或者指定时间戳的终止值。
31.如权利要求29所述的系统,其中,节点管理装置按照时间戳的取值指示的时间添加节点,使得第二级跳表中的节点按照时间由近及远的顺序排列。
32.如权利要求31所述的系统,其中,还包括:节点数量阈值设置装置,用于设置与第二级跳表对应的节点数量阈值,
其中,数据获取装置从查找到的节点中的指针或对象所指示的第二级跳表中,按照由近及远的顺序取出关键字在所述取值范围内的预定数量的节点中的每个节点中存储的指针,其中,所述预定数量不超过所述节点数量阈值。
33.如权利要求29所述的系统,其中,还包括:节点数量阈值设置装置、跳表遍历装置和数据删除装置,其中,
节点数量阈值设置装置设置与第二级跳表对应的节点数量阈值,跳表遍历装置以预定周期分别遍历与每个分片组的对应的第一级跳表和第二级跳表,当遍历到的与所述每个分片组对应的第二级跳表中的节点数量超过节点数量阈值时,节点删除装置根据该第二级跳表中的节点的排列顺序,删除该第二级跳表中排列顺序在与节点数量阈值对应的节点之后的所有节点,并且删除被删除的节点所存储的指针所指示的存储空间,其中,所述排列顺序为时间由近及远的排列顺序。
34.如权利要求29所述的系统,还包括:过期期限长度设置装置、跳表遍历装置和数据删除装置,其中,
过期期限长度设置装置设置过期期限长度,跳表遍历装置以预定周期遍历与各个分片对应的第一级跳表和第二级跳表,数据删除装置整体删除排列顺序在第二级跳表中的时间戳的取值达到所述过期期限长度的节点之后的节点,其中,所述排列顺序为时间由近及远的排列顺序。
35.一种存储指令的计算机可读存储介质,其中,当所述指令被至少一个计算装置运行时,促使所述至少一个计算装置执行如权利要求1到17中的任一权利要求所述的方法。
36.一种包括至少一个计算装置和至少一个存储指令的存储装置的系统,其中,所述指令在被所述至少一个计算装置运行时,促使所述至少一个计算装置执行如权利要求1到17中的任一权利要求所述的方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910972980.4A CN111046034B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
CN201811187043.XA CN109299100B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
PCT/CN2019/109144 WO2020073854A1 (zh) | 2018-10-12 | 2019-09-29 | 管理内存数据及在内存中维护数据的方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811187043.XA CN109299100B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910972980.4A Division CN111046034B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109299100A CN109299100A (zh) | 2019-02-01 |
CN109299100B true CN109299100B (zh) | 2019-08-30 |
Family
ID=65162271
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811187043.XA Active CN109299100B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
CN201910972980.4A Active CN111046034B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910972980.4A Active CN111046034B (zh) | 2018-10-12 | 2018-10-12 | 管理内存数据及在内存中维护数据的方法和系统 |
Country Status (2)
Country | Link |
---|---|
CN (2) | CN109299100B (zh) |
WO (1) | WO2020073854A1 (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109299100B (zh) * | 2018-10-12 | 2019-08-30 | 第四范式(北京)技术有限公司 | 管理内存数据及在内存中维护数据的方法和系统 |
CN110555000A (zh) * | 2019-09-05 | 2019-12-10 | 重庆紫光华山智安科技有限公司 | 一种卡口图片元数据并发写入、读取方法 |
CN111611245B (zh) * | 2020-05-21 | 2023-09-05 | 第四范式(北京)技术有限公司 | 处理数据表的方法和系统 |
CN111913801B (zh) * | 2020-07-15 | 2023-08-29 | 广州虎牙科技有限公司 | 数据处理方法和装置、代理服务器、存储系统及存储介质 |
CN112948466A (zh) * | 2021-03-15 | 2021-06-11 | 北京微纳星空科技有限公司 | 卫星数据的处理方法、装置、电子设备及存储介质 |
CN112925792B (zh) * | 2021-03-26 | 2024-01-05 | 北京中经惠众科技有限公司 | 数据存储控制方法、装置、计算设备及介质 |
JP7253172B2 (ja) * | 2021-04-30 | 2023-04-06 | 株式会社ソフトギア | シリアル化方法、逆シリアル化方法、情報処理プログラム、情報処理装置及び通信システム |
CN113253926A (zh) * | 2021-05-06 | 2021-08-13 | 天津大学深圳研究院 | 提升新型存储器的查询和存储性能的存储内索引构建方法 |
CN113377636B (zh) * | 2021-06-07 | 2022-08-26 | 上海微盟企业发展有限公司 | 一种页面浏览量计算的方法、系统、设备及可读存储介质 |
CN113434518B (zh) * | 2021-08-26 | 2021-12-03 | 西安热工研究院有限公司 | 时序数据库查询方法、系统、设备及存储介质 |
CN114020986B (zh) * | 2022-01-05 | 2022-04-26 | 深圳思谋信息科技有限公司 | 内容检索系统 |
CN114706836B (zh) * | 2022-03-29 | 2023-01-10 | 中国科学院软件研究所 | 一种基于机载嵌入式数据库的数据生命周期管理方法 |
CN115618050B (zh) * | 2022-12-06 | 2023-03-21 | 苏州浪潮智能科技有限公司 | 视频数据存储、分析方法、装置、系统、通信设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635494A (zh) * | 2003-12-27 | 2005-07-06 | 海信集团有限公司 | 实现类内存数据库存取和检索的方法 |
CN101464901A (zh) * | 2009-01-16 | 2009-06-24 | 华中科技大学 | 一种对象存储设备中的对象查找方法 |
CN106462575A (zh) * | 2013-12-02 | 2017-02-22 | 丘贝斯有限责任公司 | 群集内存数据库的设计及实现 |
CN105117417B (zh) * | 2015-07-30 | 2018-04-17 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN109086133A (zh) * | 2018-07-06 | 2018-12-25 | 第四范式(北京)技术有限公司 | 管理内存数据及在内存中维护数据的方法和系统 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8375062B2 (en) * | 2007-11-19 | 2013-02-12 | Oracle America, Inc. | Simple optimistic skiplist |
EP2290562A1 (en) * | 2009-08-24 | 2011-03-02 | Amadeus S.A.S. | Segmented main-memory stored relational database table system with improved collaborative scan algorithm |
CN103942289B (zh) * | 2014-04-12 | 2017-01-25 | 广西师范大学 | 一种Hadoop上面向范围查询的内存缓存方法 |
CN107679212A (zh) * | 2017-10-17 | 2018-02-09 | 安徽慧视金瞳科技有限公司 | 一种应用于跳跃表数据结构的数据查询优化方法 |
CN108228796A (zh) * | 2017-12-29 | 2018-06-29 | 百度在线网络技术(北京)有限公司 | Mpp数据库的管理方法、装置、系统、服务器及介质 |
CN109299100B (zh) * | 2018-10-12 | 2019-08-30 | 第四范式(北京)技术有限公司 | 管理内存数据及在内存中维护数据的方法和系统 |
CN109669929A (zh) * | 2018-12-14 | 2019-04-23 | 江苏瑞中数据股份有限公司 | 基于分布式并行数据库的实时数据存储方法和系统 |
-
2018
- 2018-10-12 CN CN201811187043.XA patent/CN109299100B/zh active Active
- 2018-10-12 CN CN201910972980.4A patent/CN111046034B/zh active Active
-
2019
- 2019-09-29 WO PCT/CN2019/109144 patent/WO2020073854A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635494A (zh) * | 2003-12-27 | 2005-07-06 | 海信集团有限公司 | 实现类内存数据库存取和检索的方法 |
CN101464901A (zh) * | 2009-01-16 | 2009-06-24 | 华中科技大学 | 一种对象存储设备中的对象查找方法 |
CN106462575A (zh) * | 2013-12-02 | 2017-02-22 | 丘贝斯有限责任公司 | 群集内存数据库的设计及实现 |
CN105117417B (zh) * | 2015-07-30 | 2018-04-17 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN109086133A (zh) * | 2018-07-06 | 2018-12-25 | 第四范式(北京)技术有限公司 | 管理内存数据及在内存中维护数据的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111046034A (zh) | 2020-04-21 |
WO2020073854A1 (zh) | 2020-04-16 |
CN111046034B (zh) | 2024-02-13 |
CN109299100A (zh) | 2019-02-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109299100B (zh) | 管理内存数据及在内存中维护数据的方法和系统 | |
US10180992B2 (en) | Atomic updating of graph database index structures | |
Hausenblas et al. | Apache drill: interactive ad-hoc analysis at scale | |
Parker et al. | Comparing nosql mongodb to an sql db | |
CN109086133B (zh) | 在内存中维护数据的方法和系统 | |
US9047330B2 (en) | Index compression in databases | |
US8924373B2 (en) | Query plans with parameter markers in place of object identifiers | |
US11216516B2 (en) | Method and system for scalable search using microservice and cloud based search with records indexes | |
US20170255708A1 (en) | Index structures for graph databases | |
CN108369587A (zh) | 创建用于交换的表 | |
US11100173B2 (en) | Autolayout of visualizations based on graph data | |
US10445370B2 (en) | Compound indexes for graph databases | |
Chouder et al. | EXODuS: exploratory OLAP over document stores | |
WO2018097846A1 (en) | Edge store designs for graph databases | |
US11741084B2 (en) | High frequency data management (HFDM) | |
CN109313640A (zh) | 用于数据库优化的方法和系统 | |
US9147040B2 (en) | Point-in-time query system | |
Vajk et al. | Automatic NoSQL schema development: A case study | |
CN107526746A (zh) | 管理文档索引的方法和设备 | |
CN113704248B (zh) | 一种基于外置索引的区块链查询优化方法 | |
US20180144060A1 (en) | Processing deleted edges in graph databases | |
CN115309789B (zh) | 一种基于业务对象智能动态化实时生成关联数据图的方法 | |
WO2023083237A1 (zh) | 图数据的管理 | |
CN102597969A (zh) | 带属性的键值存储的数据库管理装置及其键值存储结构的高速缓存装置 | |
CN115114297A (zh) | 数据轻量存储及查找方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |