CN111316255B - 数据存储***以及用于提供数据存储***的方法 - Google Patents
数据存储***以及用于提供数据存储***的方法 Download PDFInfo
- Publication number
- CN111316255B CN111316255B CN201780096673.3A CN201780096673A CN111316255B CN 111316255 B CN111316255 B CN 111316255B CN 201780096673 A CN201780096673 A CN 201780096673A CN 111316255 B CN111316255 B CN 111316255B
- Authority
- CN
- China
- Prior art keywords
- node
- prefix
- common
- write operation
- tree
- 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
- 238000013500 data storage Methods 0.000 title claims abstract description 36
- 238000000034 method Methods 0.000 title claims description 43
- 230000006835 compression Effects 0.000 claims description 16
- 238000007906 compression Methods 0.000 claims description 16
- 230000008859 change Effects 0.000 claims description 13
- 230000003044 adaptive effect Effects 0.000 claims description 7
- 230000000977 initiatory effect Effects 0.000 claims description 7
- 230000015654 memory Effects 0.000 abstract description 27
- 230000004048 modification Effects 0.000 description 24
- 238000012986 modification Methods 0.000 description 24
- 238000003860 storage Methods 0.000 description 11
- 238000013459 approach Methods 0.000 description 9
- 230000008901 benefit Effects 0.000 description 6
- 230000008878 coupling Effects 0.000 description 6
- 238000010168 coupling process Methods 0.000 description 6
- 238000005859 coupling reaction Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 230000001419 dependent effect Effects 0.000 description 5
- 230000007246 mechanism Effects 0.000 description 5
- 238000004590 computer program Methods 0.000 description 4
- 238000007726 management method Methods 0.000 description 4
- 101100508818 Mus musculus Inpp5k gene Proteins 0.000 description 3
- 101100366438 Rattus norvegicus Sphkap gene Proteins 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 3
- 230000008602 contraction Effects 0.000 description 3
- 230000008569 process Effects 0.000 description 3
- 230000002730 additional effect Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 239000004744 fabric Substances 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- NIXOWILDQLNWCW-UHFFFAOYSA-N Acrylic acid Chemical compound OC(=O)C=C NIXOWILDQLNWCW-UHFFFAOYSA-N 0.000 description 1
- 230000004888 barrier function Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000010076 replication Effects 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 238000010561 standard procedure 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
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种数据存储***(100),具有数据存储器(104)和数据控制器(101),用于实现具有多个节点(201、203、205)的前缀树(200),其中,所述数据控制器(101)用于为每个内部节点(203)提供共同节点前缀,所述共同节点前缀(300)包括共同前缀(301)、前缀长度(302)和节点深度(303);其中,所述节点深度(303)是从键起始到所述共同前缀(301)起始的绝对偏移量。
Description
技术领域
本发明涉及一种数据存储***、一种用于提供数据存储***的方法以及一种具有程序代码的计算机程序。具体地,本发明涉及用于数据查找的数据结构,更具体地,涉及一种前缀树数据结构,用于利用提供读取时的线性可扩展性的写入器与阅读器之间的新同步方法,定位存储在数据库中的数据。
背景技术
数十年来,人们已经了解不同的基于树的索引数据结构。尽管它们的设计不同,但其中许多都具有某些共同的特征,例如单个根节点、相互连接形成树的内部节点以及最后一层节点(称为叶)。
通常,有效负载数据保存在树叶内,内部节点存储一些在遍历查找期间进行选择的不同属性值。在输入键或搜索键后,遍历树。搜索根据存储在节点中的属性值与键之间的匹配遍历整个树。搜索从根节点(即,父节点)开始并分支遍及子节点,子节点各自从属一个父节点。
基数树是基于树的索引数据结构的特殊情况。并非将属性值保存在内部节点内部,而是将该信息保存在节点互连内。因此,在基数树遍历期间,不需要逐一查看子节点并比较搜索的属性值,只需在存在时选择与属性值索引对应的子节点即可。尽管这类基数树明显比较简单且遍历算法简洁,但由于内存开销很大,因此并没有广泛用于通用数据库或存储***索引结构。实际上,每个基数树节点都需要保存整个范围的可能属性值,即使实际上只有很少的这类子节点存在。上文暗示了内存消耗呈指数增长。
近年来,基数树准备用于一般用途。最重要的修改在于提供了可变大小的节点。这意味着,内部节点的容量不同。存在几种预先设定的容量,在树修改期间根据需要选择不同的容量。
这种方法通常称为水平压缩。另一个有价值的改进在于跳过了所有仅具有单个子节点的内部节点,从而需要将共同属性保存在中间节点内部,并将搜索属性存储在相应的叶子内。这种方法通常称为垂直压缩或键序跳过。这两种改进都直接带来了更精确、更适度的内存消耗。特别地,只有16个子节点的有限容量的内部节点具有共同前缀,可减少至少三个各自只有一个子节点的中间节点。另外,相应的叶子节点包含其余的搜索属性。
基数树的另一个已知问题在于并发访问或同步方法。传统上,同步技术利用锁使阅读器等待直到修改完成,或者检测是否有更改,然后重启阅读器。这类解决方案简单,但很难扩展。更先进的技术允许访问隐藏未决修改的节点并且无等待操作。然而,它们需要复杂的数据结构,而且通常更消耗内存且实现起来更复杂。可以考虑的另一种选择是使用硬件事务内存。然而,目前在适当的硬件支持方面仍然存在某些阻碍。
原始基数树设计意味着需要大量内存,因此这类树的使用非常有限。一种针对内存使用率优化的新方法称为自适应基数树(Adaptive Radix Tree,ART)。ART综合了已知的树压缩技术。内部节点上可以有多个称为共同节点前缀的符号,而不仅仅有一个符号,这种方法称为垂直压缩,用于减少树层次数量。除了这种垂直压缩之外,一种经过充分证明的附加方法是所谓的键序跳过,当存储在叶子节点键中的其余部分是唯一时,应用该键序跳过以减少内部节点的数量。
据观察,单次修改最多影响基数树的两个节点:修改的节点本身和其父节点。因此,有几种已知的并发访问同步机制,利用这种观察来有效应用于一般的基数树。
锁耦合是一种用于同步B树的标准方法,也可以轻易地应用于基数树。其思想是在树遍历期间每次最多保持两个锁。从根节点开始,每一步向下一层,都会对相应子节点获取锁且必须释放父锁。锁耦合算法的问题在于树的第一层上争用高。每个参与者从根节点开始获取锁。因此,争用一定高且下一层次上也有很大概率争用。
更先进的技术称为乐观锁耦合,它是前述方法的增强版本,性能更好。并非在每个步骤都获取锁来防止对节点的修改,而是参与者都假设在遍历树期间没有发生并发修改。使用版本计数器之后检测修改且如果需要重启操作。所述乐观锁耦合显示出更好的性能,因为锁是按需获取的,树节点中的总争用不高。然而,它的主要问题在于锁的粗粒度性质。几个树节点在其父锁期间被锁定,但没有针对它们的修改。例如,一个参与者获取树节点锁,这意味着其他参与者在释放该锁之前由于锁耦合不能锁定该节点的子节点。
读优化写入排除(Read-Optimized Write Exclusion,ROWEX)方法显示出甚至更好的性能。对内部节点扩展了层字段,该层字段只在创建节点时设置一次,指示在该节点层键序列的总长度。层字段在后续步骤中不会更改。假设对共同前缀进行原子修改,并且进行节点参照更新;则阅读器可以在无锁或重试的情况下无等待操作。然而,写入器需要执行额外的操作,使基数树对阅读器来说处于完整和正确的状态。对于写入器而言,ROWEX使用与乐观锁耦合类似的锁定方法。每个写入器保持两个排他锁:一个针对待修改的节点,另一个针对父节点。主要的区别在于,写入器执行额外的动作以使阅读器在没有锁的情况下工作。这些额外动作大多是对树节点字段的原子更新,这些原子更新对于阅读器正确读取树很重要。
写时复制(Copy on Write,COW)方法通常应用于无锁算法。主要思想是创建所修改节点的隐藏副本,然后对该副本引入所有更改,并使其可见。传统的锁定、比较和交换操作以及版本计数器都可以用于实现COW。COW方法对于面向读的工作负载是有益的,例如,工作负载中95%的读操作和5%的写操作。写入器在准备树节点复制期间检测更改,并重启操作,以重做副本。这些额外的内存复制和分配也会导致写性能不佳。另一方面,COW可以与锁一起使用,以避免重启。在这种情况下,写操作的可扩展性相当低。另外,对于写入速度较慢但读取速度接近DRAM的非易失性存储器,额外复制需要更多的时间。
硬件事务内存(Hardware Transactional Memory,HTM)是一种硬件机制,用于检测冲突并撤消对共享数据的任何更改。这种硬件的目标是通过强制实现原子性、一致性和隔离来透明地支持标记为事务的代码区域。在此场景中,所有参与者始终观察到树节点的一致状态,因为修改只在事务内执行,因此只有在成功提交之后,才对所有参与者可见。当提交操作失败时,由于节点已经被同时更改,因此需要重启修改。HTM是一种非常特殊的硬件,尚还没有得到很好的支持,如今在生产中使用它的机会不多。
软件事务内存(Software Transactional Memory,STM)是在没有HTM支持的情况下在机器上对HTM的模拟。然而,最佳地实现STM需要将比较和交换(DCAS)指令支持加倍,否则这种方法的实现是复杂且异常缓慢的。不幸的是,DCAS操作仅由最新型处理器支持,并不广泛可用。此外,在实践中,与基于细粒度锁的***相比,STM***的性能也受到了影响,这主要归因于与维护日志相关的开销和提交事务所花费的时间。
为了正确地遍历树,节点和互连的阅读器与写入器之间的同步是必不可少的。通常,阅读器在没有正在进行的修改对其可见时访问节点。因此,节点表示完整和正确的树状态。
传统上,前缀树或基数树的同步技术利用锁使阅读器等待直到完成修改,或者检测是否存在更改并重启。这类解决方案简单,但扩展效率较低。先进的技术允许读取隐藏未决修改的节点并且无等待操作。然而,它们需要复杂的数据结构,而且通常实现起来较复杂。
发明内容
鉴于上述问题和缺点,本发明旨在提高前缀树的性能。因此,本发明的目的是改进前缀树的写入器与阅读器之间的同步。
本发明的目的通过所附独立权利要求中提供的解决方案来实现。本发明的有利实施方式在从属权利要求中进一步定义。
具体地,本发明涉及计算机查找存储在信息数据库或存储***中的数据的方式,并提出了一种新颖的并发访问同步方法,以更快地定位数据。
快速数据查找对于包括信息数据库和存储***的所有计算机程序都是必不可少的。程序需要为随后的检索或计算定位数据。存储***和信息数据库通常具有大容量的存储介质来存储大量的数据。相比CPU主存储器,存储介质是一种慢速存储设备,因此,用于查找数据的穷举搜索是不可行的。
现代***广泛使用所谓的索引数据结构,这些索引数据结构优选地放置在快速主存储器中,表示数据搜索属性与存储介质上存储的数据位置之间的一组关联。因此,为了快速定位数据,不需要从存储介质中遍历整个存储数据集,而是在索引数据结构内查找与请求索引记录对应的数据集。
更具体地,本发明直接涉及基于前缀树(例如基数树)的索引数据结构,并公开了一种用于同步写入器与阅读器的独特并发控制方法,该方法提供了读操作时的线性可扩展性。
数据用户可以看作添加和修改数据的写入器,或查找和检索存储数据的阅读器。在并发存在的情况下,当若干参与者同时执行数据查找和修改时,总体操作效率很大程度上取决于并发同步的方法。通常,阅读器在没有正在进行的修改对其可见时访问索引结构的记录。因此,所述索引结构表示存储数据集的完整和正确状态。已知的实现方法通常假设有某种等待或额外的内存开销。因此,同步对***的整体性能有重要影响,并认为是基于树的数据结构的瓶颈。通常,在对某种数据结构进行并发操作期间,参与者可以或多或少地独立于同步模型执行操作。在最坏的情况下,它们将其操作串联化,从而按比例增加总执行时间。在最好的情况下,参与者并行完成其操作。线性可扩展性代表了上述最佳情况的这种理论上限,且关于查找操作,即意味着阅读器永远不会等待,即时存在由写入器并行进行的进行中的修改。
本发明针对具有基于前缀树(例如基数树)的索引数据结构的数据存储***和信息数据库,以及对读操作提供线性可扩展性的写入器与阅读器之间的同步方法。
本发明的第一方面提供一种数据存储***,具有数据存储器和数据控制器,用于实现具有多个节点的前缀树,其中,所述数据控制器用于为每个内部节点提供共同节点前缀,所述共同节点前缀包括共同前缀、前缀长度和节点深度;其中,所述节点深度是从键起始到所述共同前缀起始的绝对偏移量。
根据本发明,提供了一种在至少一个内部节点处具有共同节点前缀的前缀树。除了所述共同前缀和所述前缀长度外,还包括节点深度。所述节点深度是从键或搜索键的起始到所述共同前缀的起始的绝对偏移量,或者换句话说,是所述键内的有效偏移量。现在,所述阅读器可以依赖于所述节点处指定的节点深度,而不必在树遍历期间计算所述深度。所述前缀长度可以由专用数据字段提供,或者可以从所述共同前缀导出。
本发明提供了一种基于索引树的内存高效索引数据结构,以及一种写入器与阅读器之间的增强型并发控制机制,支持对阅读器进行的数据索引查找操作的线性扩展。所述阅读器可以无等待操作。
本发明提供了一种索引数据结构和并发控制,能够为信息数据库、存储***以及其他高度依赖高效数据查找和检索的应用提供多种优点。这些优点包括接近索引数据结构查找的线性可扩展性、查找和数据检索的高性能、应用垂直压缩时内存开销减少以及支持长节点共同前缀。
在所述第一方面的一种实现方式中,所述数据控制器用于在所述前缀树中发起写操作,从而为写操作下的内部节点设置节点深度;用于发起包括所述写操作下的内部节点的并发读操作,从而使用所述设置的节点深度、所述共同前缀和所述前缀长度进行树遍历。所述阅读器使用所述设置的节点深度、所述共同前缀和所述前缀长度进行树遍历允许与所述写操作并行进行无等待的读操作。所述设置的节点深度可以直接或原子设置,使所述阅读器即使在节点***或节点合并的情况下仍遍历到正确的节点。所述节点深度使所述阅读器在树遍历时独立于正在进行的节点计数。
在所述第一方面的另一种实现方式中,所述数据控制器用于:发起对内部节点的写操作,以为所述写操作下的内部节点提供辅助数据结构;并且为所述辅助数据结构提供共同节点前缀,其中,所述共同节点前缀反映所述写操作的变化。所述辅助数据结构至少包含所述共同节点前缀的三个字段。如果需要,它可以包括更多的字段。所述辅助数据结构使得能够轻易在现有的前缀树结构中实现所述共同节点前缀。所述写入器创建新的辅助数据结构,设置合适的深度和共同前缀字段,从而反映所述写操作的变化。然后,可以自动更新写入器操作下的相应节点内的引用或结构。遍历阅读器始终都获取正确的信息。在所述写操作之前,阅读器读取未更改的节点。在所述写操作期间,阅读器读取已经包括所述正确信息的所述辅助数据结构。在写入之后,所述阅读器读取经更新的节点。
在所述第一方面的另一种实现方式中,所述数据控制器用于发起读操作,其中,所述读操作与所述写操作并发且包括所述写操作下的内部节点,使得所述读操作读取所述写操作下的内部节点和所述辅助数据结构。如上所指出,所述辅助数据结构已经为并发阅读器提供了反映所述写操作变化的所述正确信息。通过使用所述节点深度,所述阅读器读取反映所述写操作之后状态的值。
在所述第一方面的另一种实现方式中,所述数据控制器用于在完成所述写操作之后,替换所述辅助数据结构,其中,所述共同节点前缀反映所述写操作下的内部节点的所述写操作的变化。所述内部结点的所述辅助数据结构被新辅助数据结构替换,其中,更新的共同节点前缀与所述树内所述内部节点进行的变化相对应。
在所述第一方面的另一种实现方式中,所述数据控制器用于设置所述辅助数据结构的所述节点深度和/或所述前缀长度,使得所述辅助数据结构的所述节点深度和所述前缀长度之和等于所述写操作下的内部节点的所述辅助数据结构的所述节点深度与所述前缀长度之和。由于在所述写操作之前和所述写操作期间和是相同的,因此这种规则实现了简单的计算,保持了所述阅读器的一致性。
在所述第一方面的另一种实现方式中,在所述内部节点内的所述辅助数据结构内提供所述共同节点前缀。该实现方式将所有数据都保留在所述节点内部。
在所述第一方面的另一种实现方式中,在所述辅助数据结构内的单独结构内提供所述共同节点前缀,其中,在所述内部节点处提供指向所述单独结构的至少一个指针。在修改一致性方面,通过指针访问所述共同前缀更加方便。此外,这种间接方法突破了原子操作的硬件限制以用于更长的共同前缀,这有利于通用索引数据结构,而内部节点仍然非常紧凑。
在所述第一方面的另一种实现方式中,在单独结构内提供所述共同节点前缀,其中,在所述内节点内提供所述辅助数据结构,其中,在所述辅助数据结构处提供指向所述单独结构的至少一个指针。在修改一致性方面,通过指针访问所述共同前缀更加方便。
在所述第一方面的另一种实现方式中,在单独结构内提供对内部节点的子节点和/或子节点计数器的引用,其中,在所述内部节点处提供指向所述单独结构的至少一个指针。这种方法可能意味着额外的内存管理开销,但减少了在子节点扩展和收缩期间父节点更新的数量,从而简化了节点容量管理。
在所述第一方面的另一种实现方式中,所述前缀树是基数树或自适应基数树。所述基数树和所述自适应基数树ART非常适合所提出的内部节点处节点深度的字段。
在所述第一方面的另一种实现方式中,所述前缀树包括水平压缩、垂直压缩和/或键序跳过。这类方法减少了节点数量,从而降低内存使用率。与子节点的真实数量对应,水平压缩可引入具有不同容量和可变大小的若干内部节点,从而降低内存成本。
本发明的第二方面提供了一种用于提供数据存储***的方法,所述数据存储***用于实现具有多个节点的前缀树,所述方法包括为每个内部节点提供所述共同节点前缀,其中,所述共同节点前缀包括共同前缀、前缀长度和节点深度。适用与上述相同的优点和修改。
在所述第二方面的一种实现方式中,所述方法包括:发起对内部节点的写操作;为所述写操作下的内部节点提供辅助数据结构,其中,所述辅助数据结构包括所述内部节点的共同节点前缀;其中,所述共同节点前缀反映所述写操作的变化。
本发明的第三方面提供了一种计算机程序,具有程序代码,用于在所述计算机程序在计算机或如上所述的数据存储***上运行时,执行如上所述的方法。适用与上述相同的优点和修改。
应注意,本申请中所描述的所有设备、元件、单元和构件都可以在软件或硬件元件或其任何种类的组合中实施。本申请中描述的各种实体执行的所有步骤和所描述的将由各种实体执行的功能旨在表明各个实体适于或用于执行各自的步骤和功能。虽然在以下具体实施例的描述中,由外部实体执行的特定功能或步骤没有在执行特定步骤或功能的该实体的具体元件的描述中反映,但是技术人员应该清楚的是这些方法和功能可以在各自的硬件或软件元件或其任意组合中实现。
附图说明
结合所附附图,下面具体实施例的描述将阐述上述本发明的各方面及其实现形式,其中:
图1示出了具有索引结构的数据存储***的***架构图。
图2示出了具有垂直压缩和水平压缩的基数树的示例。
图3示出了内部节点的共同节点前缀的结构。
图4示出了利用无等待阅读器进行并发操作的自适应基数树。
图5示出了一种提供数据存储***的方法,所述数据存储***用于实现前缀树,所述前缀树具有基数树中无等待阅读器操作的多个节点。
图6示出了在基数树中进行免等待阅读器操作的流程图。
具体实施方式
图1示出了包括数据控制器101的数据存储***100。数据控制器101包括用作索引数据结构103的具有垂直压缩和键序跳过的前缀树或基数树的并发控制机制102。数据存储***100还包括数据存储器104。数据控制器101可以使用动态随机存取存储器(DynamicRandom Access Memory,DRAM)等在主存储器中实现,数据存储器104通常包括大容量存储器,如硬盘、固态硬盘(Solid-State-Disk,SSD)等。
根据本发明的权利要求1,数据存储***100包括数据控制器101和数据存储器104。
因此,为了快速定位数据,不需要遍历数据存储104中全部存储的数据集。相反,只需要搜索索引数据结构103内与请求索引记录对应的索引。
数据用户111可以作用用于添加和修改数据的写入器112,或用于查找和检索存储数据104的阅读器113。在并发存在的情况下,当若干个参与者111同时执行数据查找和修改时,总体操作效率很大程度上取决于并发同步或控制的方法102。
数据存储***100可看作写入器112与阅读器113之间的先进同步的变型,所述先进同步适用作数据存储***100和信息数据库中用作索引数据结构103的具有垂直压缩和键序跳过的索引或基数树的并发控制机制102。这种基于基数树的索引数据结构103还可以配有水平压缩和写入器之间的先进同步。
图2示出了基数树200的示例。基数树200包括单个根节点201、相互连接形成树的内部节点203以及最后一层节点(称为叶205)。通常,有效负载数据保存在树叶内,内部节点存储一些在遍历查找期间进行选择的不同的属性值。
基数树200是基于树的索引数据结构的特殊情况。并非将属性值保存在内部节点内部,而是将该信息保存在节点互连内。因此,在基数树遍历期间,不需要逐一查看子节点并比较搜索的属性值,只需在有任何存在时选择与属性值索引对应的子节点即可。
如上所述的内部索引树节点203可以具有可变大小或自适应容量。存在四种仅容量不同的内部树节点,其容量相应为4、16、48和256个子节点。在该示例中,内部节点203包含与16个子节点容量相对应的子节点舱。根节点201的容量为256个子节点。
在该示例中,内部节点203是根节点201的子节点,通过符号“c”链接到根节点201。内布节点201中的共同前缀为“omp”。共同前缀意味着作为内部节点203的子节点的所有叶子节点205都包含前缀“omp”。
在更一般的方式中,树200可以以自下而上的方式描述,从字母表定义、键字符串编码和索引结构树节点互连开始。这种基于树的索引数据结构的字母表是单字节字符集。它意味着每个符号在8位内表示,且整个字母表基数,即元素的数量,是256个符号。所有符号都用于形成输入字符串,255个非零字节符号用于编码信息,零字节符号指示输入字符串的结束。该编码为C样式或以空值终止的字符串。
索引结构的树节点之间的互连可以用所谓的增强指针技术以及普通节点指针实现。当前指针大小为8字节或64位,现代MMU通常在48位地址空间内操作,其余的未使用。因此,可以复用最多16位普通64位指针,其中保存重要信息。用作节点互连的增强指针包含增强的单字节字母符号,表示特定互连所指向的符号。
图3详细示出了共同节点前缀300。共同节点前缀300是内部节点203内的数据舱。共同节点前缀300具有保存所有子节点共享的多个键符号的布局。这些符号称为共同前缀301,并布置在前缀符号的字节数组舱中。在另一字段中,提供前缀长度字段302,即共同前缀301的长度。本发明采用附加字段节点深度303对共同节点前缀300进行扩展,以指示从键起始的绝对偏移量。
主要的内部节点字段,如子节点舱和子节点计数器,也可以是单独的内存布局,通过内部节点结构的指针进行间接访问。这种方法意味着额外的内存管理开销,但减少了在子节点扩展和收缩期间父节点更新的数量,因此简化了节点容量管理。基数树叶子205或末端节点包括主要字段键和有效载荷,以及可选的字段锁和上行链路。在操作期间,写入器自动执行对普通指针和增强指针的所有更新。也应该自动更新共同节点前缀300。间接内存布局不会造成任何困难,指针更新由通用硬件的原子操作处理。当子节点计数器指示较高或较低的占用水平时,内部节点将经历扩展或收缩。分割或合并节点通常意味着***或提取其他节点,以及共同节点前缀发生变化。
根据此处呈现的共同节点前缀300,节点深度303和共同前缀301一起保存在单独的数据结构中。因此,通过引用所述特定的结构实例,即共同节点前缀300,对两者进行一致更新。然后,在树遍历期间,阅读器不会计算它的深度。相反,阅读器从共同节点前缀300的字段读取节点深度303。因此,阅读器总是比较搜索键内正确位置处的符号。此外,由于并发写操作,因此不需要读取锁。
共同节点前缀300可以通过以下例程创建:
struct node_prefix{
unsigned depth;
unsigned length;
char prefix[MAX_LEN];
};
这种共同节点前缀300可能会对为每个节点造成4字节恒定开销,其中,4字节开销实际上可能取决于键的最大可能长度。
图4示出了具有多个节点的基数树400的示例。在每个节点中,示出了节点深度和共同前缀。前缀长度可以从所述共同前缀导出。这些字段存储在每个内部节点处的共同节点前缀中。第一阅读器401解析树400。
在图4的左侧示出了第一阅读器401在整个树400中的进展。第一阅读器401查找搜索键或键“Aaronitic”。搜索从根节点402开始,并开始到内部节点403,因为它是根节点402的子节点,包括所述键的后续符号。内部节点403具有共同前缀“aron”和节点深度1。因此,第一阅读器401沿着树400进一步向下移动到内部节点404,内部节点404的节点深度为5且共同前缀为1。下一步与图4中所示的状态对应。第一阅读器401在具有共同前缀“t”和节点深度6的内部节点405处。左侧示出了偏移量为六个符号,前缀长度为1且共同前缀为“t”。叶子节点406匹配完整的键“Aaronitic”。因此,搜索成功。
第一阅读器401已经经过了内部节点403,所述内部节点403当前正在写入器407的写操作下。由于共同节点前缀中的新字段深度,因此允许数据结构阅读器仅通过要求写入器在内部节点***或合并(此处在内部节点403处)期间一致地更新共同节点前缀来消除等待。这里的一致字面上意味着写入器407立即或自动地将共同节点前缀符号与深度字段一起更新。对写入器操作的确定顺序或写入器同步之间的确定顺序没有其他要求。
因此,当共同节点前缀已经更新,但还没有***新的内部节点时,第二阅读器408正在访问可能正在进行修改的内部节点403。然后,阅读器使用共同节点前缀的新字段的深度值而不是在遍历树层次时计算的标称深度。然后,它们能够将共同节点前缀与搜索键的正确符号进行比较,而不考虑树内的实际节点层。由于并发,一些节点可能在阅读器操作期间经历***或合并。然而,阅读器随着树遍历继续根据所请求键的符号进行比较。有可能会出现误报匹配,然后从比较中意外地跳过几个符号。如果检测到这种不确定性,则在最后一步通过将定位的索引叶的存储键与请求键进行比较来很好地避免这种情况。
下文描述了写入器407实际如何执行这种操作以及第二阅读器408如何解析在写操作下的内部节点403。
写入器407在内部节点403处创建辅助数据结构409,所述辅助数据结构409包含具有节点深度的共同节点前缀和新修改节点的共同前缀。因此,所述共同节点前缀反映所述写操作的变化。换言之,写入器407创建新辅助结构409,设置适当的深度和共同前缀字段,且自动更新相应节点403内的指针或结构等引用。写入器自动执行所有更新,以维持数据结构一致性。还对所述共同节点前缀进行原子更新。
在图4的示例中,辅助数据结构409的节点深度等于2,辅助数据结构409的共同前缀是长度为3的“ron”。辅助数据结构409的这一新的共同节点前缀对应于在根节点402与写操作下的内部节点403之间***新节点的节点***。这种新节点具有节点深度1和共同前缀“a”。
可以看出,新辅助数据结构409的节点深度(即2)与前缀长度(即3)之和(即5)等于写操作下的内部节点403的辅助数据结构的共同节点前缀的节点深度(即1)与前缀长度(即4)之和(即5)。
辅助数据结构409和/或其共同节点前缀可以直接存储在内部节点中或存储在一个或多个指针所指向的独立结构中。所述指针可以存储在内部节点或辅助数据结构409中。
第二阅读器408在树遍历期间到达内部节点403时,读取辅助数据结构409的共同节点前缀。第二阅读器408依赖于节点深度字段而不是计算深度,它根据节点深度字段(即2)和前缀长度(即3)进行计算。因此,尽管有对内部节点403的写操作,第二阅读器408仍到达正确的内部节点404。
从广义上讲,阅读器可以操作从根节点到叶子节点的无等待前进,因为它们使用来自共同节点前缀的深度值(如果这种深度值已经存在)。由于并发,所述阅读器可能跳过比较一些符号,并且可能通过将搜索键与定位叶中的键进行比较来消除可能的误匹配。
图5示出了一种用于提供数据存储***的方法,所述数据存储***用于实现前缀树,所述前缀树具有基数树中无等待阅读器操作的多个节点。在步骤500中,提供一种数据存储***,用于实现具有多个节点的前缀树。在步骤501中,为每个内部节点提供共同节点前缀。所述共同节点前缀包括共同前缀、前缀长度和节点深度。
图6示出了无等待阅读器操作的操作流程图。所述流程图在针对每个节点层次重复的层次起点600处开始。
在步骤601中,确定节点是否为叶子。如果是,则程序转到步骤602。在步骤602中,确定是否已经跳过搜索键的一些符号,例如由于键序跳过或由于并发写入器修改,因节点***或合并而排除几个符号进行比较。如果是,则可能存在不确定性,在步骤603中设置不确定性标志等。然后,程序转到步骤604。当没有跳过所述搜索键的符号时,即在步骤602中为否时,情况也是如此。
在步骤604中,确定是否存在误报或不确定性。如果是,则在步骤605中匹配搜索键与叶子键。对于肯定结果,所述方法转到步骤606,确定是真,即已在所述叶子中正确找到所述键。当在步骤604中不存在误报或不确定性时,所述方法也执行步骤606。
针对所述节点不是叶子的情况,返回到步骤601。然后,所述操作转到步骤608,确定是否存在共同节点前缀。如果不存在,则所述方法转到步骤609。在步骤609中,确定是否存在下一层次子节点。如果不存在,则所述方法转到步骤607,为假,因为发现不存储键的叶子节点。如果存在,则在步骤610中,所述方法继续进行到下一层次,即,步骤600中的新起点。
当存在共同节点前缀时,即在步骤608中做出肯定决策时,所述操作转到步骤611。在步骤611中,确定前缀和节点位置处的键是否匹配。换句话说,是与共同前缀深度限定的位置处的搜索键比较的共同节点前缀的符号。如果否,则所述操作转到为假的步骤607并终止操作。如果是,则所述操作转到步骤612。
在步骤612中,确定是否已经跳过搜索键的一些符号,例如由于键序跳过或由于并发写入器修改,因节点***或合并而排除几个符号进行比较。如果是,则可能存在不确定性,在步骤613中设置不确定性标志等。然后,程序转到步骤609。当没有跳过所述搜索键的符号时,即在步骤612中为否,情况也是如此。
在步骤609中,确定是否存在下一层次子节点。如果不存在,则所述方法转到步骤607,为假,因为发现不存储键的叶子节点。如果存在,则在步骤610中,所述方法继续进行到下一层次,即,步骤600中的新起点。
在更广泛的背景下,所述操作可以描述如下。阅读器无等待操作,遍历树向下到不含锁的叶子,即使写入器可能引入并发修改。在从根节点开始的每个层次,阅读器将共同前缀的符号与相应位置处的搜索键进行比较。相应的位置通过从共同节点前缀中提取深度字段(如果存在)确定。如果匹配,则所述阅读器继续进行到下一个层次,否则返回假。在遍历期间,当并发写入器修改由于节点***或合并而排除一个或若干个符号进行比较时,阅读器可能会检测到键序跳过或不确定性的情况。此类情况通常在比较搜索键与从末端叶子节点提取的键的最后步骤中解决。如果没有检测到障碍,则当发现末端叶子节点时,所述阅读器返回真,否则返回假。
已经结合作为实例的不同实施例以及实施方案描述了本发明。然而,根据对附图、本发明和独立权利要求的研究,本领域技术人员在实践所要求保护的发明时,能够理解和实现其他变化。在权利要求书以及说明书中,词语“包括”不排除其他元件或步骤,且不定冠词“一”或者“一个”不排除多个。单个元件或其他单元可满足权利要求书中所叙述的若干实体或项目的功能。在仅凭某些措施被记载在相互不同的从属权利要求书中这个单纯的事实并不意味着这些措施的结合不能在有利的实现方式中使用。
Claims (13)
1.一种数据存储***(100),其特征在于,具有数据存储器(104)和数据控制器(101),用于实现具有多个节点(201、203、205)的前缀树(200),其中
所述数据控制器(101)用于为每个内部节点(203)提供共同节点前缀(300),其中,所述共同节点前缀(300)包括共同前缀(301)、前缀长度(302)和节点深度(303);其中,所述节点深度(303)为从键起始到所述共同前缀(301)起始的绝对偏移量;
所述数据控制器(101)用于在所述前缀树(200)中发起写操作,从而为写操作下的内部节点(203)设置节点深度(303);用于发起包括所述写操作下的内部节点(203)的并发读操作,从而使用所述设置的节点深度(303)、所述共同前缀(301)和所述前缀长度(302)进行树遍历。
2.根据权利要求1所述的数据存储***(100),其特征在于,
所述数据控制器(101)用于:发起对内部节点(203)的写操作,以为所述写操作下的内部节点(203)提供辅助数据结构(409);为所述辅助数据结构(409)提供共同节点前缀(300),其中,所述共同节点前缀(300)反映所述写操作的变化。
3.根据权利要求2所述的数据存储***(100),其特征在于,
所述数据控制器(101)用于发起读操作,其中,所述读操作与所述写操作并发且包括所述写操作下的内部节点(203),使得所述读操作读取所述写操作下的内部节点(203)和所述辅助数据结构(409)。
4.根据权利要求2或3所述的数据存储***(100),其特征在于,
所述数据控制器(101)用于在完成所述写操作之后,替换所述辅助数据结构(409),其中,所述共同节点前缀(300)反映所述写操作下的内部节点(203)的所述写操作的变化。
5.根据权利要求2至4中任一项所述的数据存储***(100),其特征在于,
所述数据控制器(101)用于设置所述辅助数据结构(409)的所述节点深度(303)和/或所述前缀长度(302),使得所述辅助数据结构(409)的所述节点深度(303)和所述前缀长度(302)之和等于所述写操作下的内部节点(203)的所述辅助数据结构(409)的所述节点深度(303)与所述前缀长度(302)之和。
6.根据权利要求2至5中任一项所述的数据存储***(100),其特征在于,
在所述内部节点(203)内的所述辅助数据结构(409)内提供所述共同节点前缀(300)。
7.根据权利要求2至6中任一项所述的数据存储***(100),其特征在于,
在所述辅助数据结构(409)内的单独结构内提供所述共同节点前缀(300),其中,在所述内部节点(203)处提供指向所述单独结构的至少一个指针。
8.根据权利要求2至7中任一项所述的数据存储***(100),其特征在于,
在单独结构内提供所述共同节点前缀(300),其中,在所述内部节点(203)内提供所述辅助数据结构(409),其中,在所述辅助数据结构(409)处提供指向所述单独结构的至少一个指针。
9.根据权利要求1至8中任一项所述的数据存储***(100),其特征在于,
在单独结构内提供对内部节点(203)的子节点和/或子节点计数器的引用,其中,在所述内部节点(203)处提供指向所述单独结构的至少一个指针。
10.根据权利要求1至9中任一项所述的数据存储***(100),其特征在于,
所述前缀树(200)是基数树或自适应基数树。
11.根据权利要求1至10中任一项所述的数据存储***(100),其特征在于,
所述前缀树(200)包括水平压缩、垂直压缩和/或键序跳过。
12.一种用于提供数据存储***(100)的方法,其特征在于,所述数据存储***(100)用于实现具有多个节点的前缀树(200),所述方法包括:
为每个内部节点(203)提供(501)共同节点前缀(300),其中,所述共同节点前缀(300)包括共同前缀(301)、前缀长度(302)和节点深度(303);
在所述前缀树(200)中发起写操作,从而为写操作下的内部节点(203)设置节点深度(303);
发起包括所述写操作下的内部节点(203)的并发读操作,从而使用所述设置的节点深度(303)、所述共同前缀(301)和所述前缀长度(302)进行树遍历。
13.根据权利要求12所述的方法,其特征在于,包括:
发起对内部节点(203)的写操作;
为所述写操作下的内部节点(203)提供辅助数据结构(409),其中,所述辅助数据结构(409)包括所述内部节点(203)的共同节点前缀(300);
其中,所述共同节点前缀(300)反映所述写操作的变化。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/RU2017/000857 WO2019098871A1 (en) | 2017-11-20 | 2017-11-20 | Data storage system and method of providing a data storage system |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111316255A CN111316255A (zh) | 2020-06-19 |
CN111316255B true CN111316255B (zh) | 2023-11-03 |
Family
ID=60766120
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780096673.3A Active CN111316255B (zh) | 2017-11-20 | 2017-11-20 | 数据存储***以及用于提供数据存储***的方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN111316255B (zh) |
WO (1) | WO2019098871A1 (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR102176715B1 (ko) * | 2020-03-03 | 2020-11-09 | 전운배 | 트라이 데이터 구조의 접근을 제어하는 방법 및 장치 |
CN112685404A (zh) * | 2020-12-18 | 2021-04-20 | 威盛电子股份有限公司 | 应用于键树的编码方法、应用于键树的解码方法与电子装置 |
CN112784117B (zh) * | 2021-01-06 | 2023-06-02 | 北京信息科技大学 | 一种用于海量数据的高级基数树构建方法和构建*** |
CN113626432B (zh) * | 2021-08-03 | 2023-10-13 | 上海沄熹科技有限公司 | 一种支持任意Key值的自适应基数树的改进方法 |
US11954345B2 (en) | 2021-12-03 | 2024-04-09 | Samsung Electronics Co., Ltd. | Two-level indexing for key-value persistent storage device |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1462004A (zh) * | 2002-05-31 | 2003-12-17 | 思科技术公司 | 用于产生和使用改进的树形位图数据结构的方法和装置 |
CN101577662A (zh) * | 2008-05-05 | 2009-11-11 | 华为技术有限公司 | 一种基于树形数据结构的最长前缀匹配方法和装置 |
WO2014090097A1 (zh) * | 2012-12-14 | 2014-06-19 | 腾讯科技(深圳)有限公司 | 一种数据存储方法和装置 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN105320775A (zh) * | 2015-11-11 | 2016-02-10 | 中科曙光信息技术无锡有限公司 | 数据的存取方法和装置 |
CN105814846A (zh) * | 2013-12-17 | 2016-07-27 | 华为技术有限公司 | 网络地址查询的前缀树阶段平衡 |
CN106126722A (zh) * | 2016-06-30 | 2016-11-16 | 中国科学院计算技术研究所 | 一种基于验证的前缀混合树及设计方法 |
CN106716412A (zh) * | 2014-09-25 | 2017-05-24 | 甲骨文国际公司 | 用于支持分布式计算环境中的零拷贝二进制基数树的***和方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8914415B2 (en) * | 2010-01-29 | 2014-12-16 | International Business Machines Corporation | Serial and parallel methods for I/O efficient suffix tree construction |
GB2495106B (en) * | 2011-09-28 | 2020-09-09 | Metaswitch Networks Ltd | Searching and storing data in a database |
-
2017
- 2017-11-20 WO PCT/RU2017/000857 patent/WO2019098871A1/en active Application Filing
- 2017-11-20 CN CN201780096673.3A patent/CN111316255B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1462004A (zh) * | 2002-05-31 | 2003-12-17 | 思科技术公司 | 用于产生和使用改进的树形位图数据结构的方法和装置 |
CN101577662A (zh) * | 2008-05-05 | 2009-11-11 | 华为技术有限公司 | 一种基于树形数据结构的最长前缀匹配方法和装置 |
WO2014090097A1 (zh) * | 2012-12-14 | 2014-06-19 | 腾讯科技(深圳)有限公司 | 一种数据存储方法和装置 |
CN105814846A (zh) * | 2013-12-17 | 2016-07-27 | 华为技术有限公司 | 网络地址查询的前缀树阶段平衡 |
CN106716412A (zh) * | 2014-09-25 | 2017-05-24 | 甲骨文国际公司 | 用于支持分布式计算环境中的零拷贝二进制基数树的***和方法 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN105320775A (zh) * | 2015-11-11 | 2016-02-10 | 中科曙光信息技术无锡有限公司 | 数据的存取方法和装置 |
CN106126722A (zh) * | 2016-06-30 | 2016-11-16 | 中国科学院计算技术研究所 | 一种基于验证的前缀混合树及设计方法 |
Non-Patent Citations (1)
Title |
---|
Viktor Leis,etc.The Adaptive Radix Tree:ARTful Indexing for Main-Memory Databases.《DATA ENGINEERING(ICDE),2013 IEEE 29TH INTERNATIONAL CONFERENCE ON,IEEE》.2013,38-49. * |
Also Published As
Publication number | Publication date |
---|---|
CN111316255A (zh) | 2020-06-19 |
WO2019098871A1 (en) | 2019-05-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111316255B (zh) | 数据存储***以及用于提供数据存储***的方法 | |
US10019382B2 (en) | Secondary data structures for storage class memory (scm) enables main-memory databases | |
US6457021B1 (en) | In-memory database system | |
US11023453B2 (en) | Hash index | |
CN105630863B (zh) | 用于多版本并发提交状态的事务控制块 | |
US9149054B2 (en) | Prefix-based leaf node storage for database system | |
US8909610B2 (en) | Shared log-structured multi-version transactional datastore with metadata to enable melding trees | |
US7805427B1 (en) | Integrated search engine devices that support multi-way search trees having multi-column nodes | |
US20180011892A1 (en) | Foster twin data structure | |
US20170371912A1 (en) | Transactional key-value store | |
US9053153B2 (en) | Inter-query parallelization of constraint checking | |
US11100083B2 (en) | Read only bufferpool | |
US10802890B2 (en) | System and method for multidimensional search with a resource pool in a computing environment | |
EP3570182B1 (en) | Sparse infrastructure for tracking ad-hoc operation timestamps | |
CN111373389B (zh) | 数据存储***以及用于提供数据存储***的方法 | |
US20240241873A1 (en) | Tree-based data structure | |
US9454556B2 (en) | Indexing using a lockless burst trie | |
US20210103584A1 (en) | Hash-based data structure | |
EP4113317A1 (en) | Versioning of items in a data structure | |
Forfang | Evaluation of High Performance Key-Value Stores | |
Huang et al. | Range Indexes on Non-Volatile Memory | |
CN115422182A (zh) | 一种基于持久性内存b+树索引的读写性能优化方法 |
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 |