CN116401416A - 支持无锁化并发访问的持久可变基数树访问系统 - Google Patents

支持无锁化并发访问的持久可变基数树访问系统 Download PDF

Info

Publication number
CN116401416A
CN116401416A CN202310411617.1A CN202310411617A CN116401416A CN 116401416 A CN116401416 A CN 116401416A CN 202310411617 A CN202310411617 A CN 202310411617A CN 116401416 A CN116401416 A CN 116401416A
Authority
CN
China
Prior art keywords
node
prefix
module
sub
radix 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.)
Pending
Application number
CN202310411617.1A
Other languages
English (en)
Inventor
郑圣安
聂良旭
黄林鹏
张博文
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Jiaotong University
Original Assignee
Shanghai Jiaotong University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Jiaotong University filed Critical Shanghai Jiaotong University
Priority to CN202310411617.1A priority Critical patent/CN116401416A/zh
Publication of CN116401416A publication Critical patent/CN116401416A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9014Indexing; Data structures therefor; Storage structures hash tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/0727Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a storage system, e.g. in a DASD or network based storage system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9027Trees
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Quality & Reliability (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种支持无锁化并发访问的持久可变基数树访问系统,包括:数据存储模块:组织和管理可变基数树的前缀节点、叶子节点以及数据的持久存储,并支持通用可变基数树读写访问接口;本地访问模块:接收本地应用对可变基数树的读写请求并放入处理队列等待后台处理模块进行处理;后台处理模块:对处理队列中的读写请求进行处理,更新可变基数树的前缀节点和叶子节点,并保证可变基数树的元数据和数据处于一致状态;数据恢复模块:在持久可变基数树访问系统重启后检测故障一致性,当数据不一致时恢复可变基数树中的所有数据到一致状态。

Description

支持无锁化并发访问的持久可变基数树访问系统
技术领域
本发明涉及计算机存储系统领域,具体地,涉及支持无锁化并发访问的持久可变基数树访问系统。
背景技术
新型持久内存PM(Persistent Memory,又作非易失内存NVM)技术综合了DRAM内存与磁盘/固态硬盘(SSD)/闪存(Flash)两者的特性,由于其字节寻址能力、低延迟和数据持久性的特性而受到广泛的关注和研究。一方面,它与磁盘/固态硬盘(SSD)/闪存(Flash)相似,具有大容量、非易失、低功耗等特点;另一方面,它与DRAM内存相似,具有低延迟、高带宽、可字节寻址等特点。与传统DRAM内存相比,基于PM构建存储系统可直接持久存储数据,省去刷新到下一级持久存储器的开销;与磁盘相比,基于PM构建持久存储系统可通过load/store方式直接访问PM中存储的数据,省去了加载到内存缓冲区的开销。因此,PM为构建新型高效持久存储系统提供了机遇,基于非易失性内存访存特性设计高性能持久化数据结构的研究成果也被不断提出。此外,具有字节寻址能力的持久内存比如Intel Optane DCpersistent memory module(DCPMM)等商业化产品目前也已经面世。
基数树(Radix Trie,也叫基数特里树或压缩前缀树)是一种数据结构,是一种更节省空间的前缀树,其中作为唯一子节点的每个节点都与其父节点合并,边既可以表示为元素序列又可以表示为单个元素。因此每个内部节点的子节点数最多为基数树的基数r,其中r为正整数,x为2的幂,x≥1,这使得基数树更适用于对于较小的集合(尤其是字符串很长的情况下)和有很长相同前缀的字符串集合。基数树的查找方式也与常规树不同(常规的树查找一开始就对整个键进行比较,直到不相同为止),基数树查找时节点时,对于节点上的键都按块进行逐块比较,其中该节点中块的长度是基数r;当r为2时,基数树为二进制的(即该节点的键的长度为1比特位),能最大程度地减小树的深度来最小化稀疏性(最大限度地合并键中没有分叉的节点)。当r≥4且为2的整数次幂时,基数树是r元基数树,能以潜在的稀疏性为代价降低基数树的深度。基数树作为一种重要的基于树的数据索引结构,相较于B+树而言,其整体结构由插入的Key值决定且插入无需执行任何针对Key值的比较,有效减少了缓存行的刷入和必要的日志记录,因此更适应于非易失性内存下的数据索引。
可变基数树(Adaptive Radix Tree)相较于传统基数树,其最大区别在于每个节点可以容纳的前缀字节是动态变化的,节点大小可以通过节点升级/降级动态调整,从而提升空间利用率以及缓存局部性。可变基数树的节点包括用于前缀索引的前缀节点和用于存储Key-Value键值对的叶子结点。
专利文献CN1613073A(申请号:03802024.6)公开了一种改进型多路基数树方法和装置,用于向包括一串符号的关键字中的符号指派逻辑层号,并且至少部分基于所述逻辑层号,而不是基于代表所述关键字中每个符号的节点之间的路径,在多路基数树的一个节点层中存储所述关键字的条目。该专利未对基数树的并发控制进行改进,不能较好地在高并发场景中适用。且现有可变基数树存储系统以DRAM内存存储设备为主,对非易失性内存设备的适应和支持十分有限。
发明内容
针对现有技术中的缺陷,本发明的目的是提供一种支持无锁化并发访问的持久可变基数树访问系统。
根据本发明提供的一种支持无锁化并发访问的持久可变基数树访问系统,包括:
数据存储模块:组织和管理可变基数树的前缀结点、叶子结点以及数据的持久存储,并支持通用可变基数树读写访问接口;
本地访问模块:接收本地应用对可变基数树的读写请求并放入处理队列等待后台处理模块进行处理;
后台处理模块:对处理队列中的读写请求进行处理,更新可变基数树的前缀结点和叶子结点,并保证可变基数树的元数据和数据处于一致状态;
数据恢复模块:在持久可变基数树访问系统重启后检测故障一致性,当数据不一致时恢复可变基数树中的所有数据到一致状态。
优选地,所述前缀结点根据负载大小不同有不同的结点大小和容量,存储数据key值的前缀信息,用于对数据key值进行索引;
所述前缀结点包括:N8前缀结点、N32前缀结点、N64前缀结点、N128前缀结点以及N256前缀结点,分别包含8个,32个、64个、128个、256个子结点的信息,对对应数量的子结点前缀值进行索引;
所述叶子结点用于存储数据Key-Value值的完整信息。
优选地,所述前缀结点采用哈希式划分的方法将可变基数树中不同大小的前缀结点划分为N个持久内存访问粒度为XPLine大小的Bucket,Bucket内存储该区域对应的前缀字节值在本前缀结点进行访问所需要的全部信息;其中,N32前缀结点、N64前缀结点、N128前缀结点分别包含1个、2个、4个Bucket,N8前缀结点和N256前缀结点采用子结点信息列表存储子结点前缀字节的索引信息;
前缀结点采用哈希散列的方法对本结点存储的前缀字节值以及其对应的子结点信息进行散列划分,使不同前缀字节值均匀分布在前缀结点的不同Bucket中。
优选地,所述Bucket包括32个子结点上下文字段,每一个子结点上下文字段与当前前缀结点的一个子结点一一对应,并包含该子结点的全部元数据;每个子结点上下文字段为8字节,支持原子更新;
所述子结点上下文字段包括:子结点类型、子结点版本号、前缀字节、子结点指针以及子结点前缀长度。
优选地,在所述数据存储模块中,将整个持久可变基数树存储在持久内存中,允许后台处理模块的不同线程发起并发的无阻塞的读写请求,实现对本地访问模块接收到的请求的处理。
优选地,在所述后台处理模块中,
模块M3.1:后台处理线程从请求队列中获取待处理请求,解析获得对应的key与请求类型;
模块M3.2:后台处理线程根据解析到的key,将key划分为前缀字节序列;
模块M3.3:使用当前前缀字节序列从可变基数树根前缀结点开始执行层序索引,直到索引至叶子结点或最下层前缀结点或前缀不匹配处;
模块M3.4:前缀索引过程执行结束后,根据当前请求类型,执行相应动作完成当前请求的主体动作;
模块M3.5:请求的主体动作完成后,检查索引终点对应的前缀结点的子结点上下文字段中的版本是否发生变化来判断该前缀结点是否发生过或正在发生结点升级/降级;如果已经发生过结点升级/降级,则重新触发执行最后一级层序索引,并在新的索引终点上重新触发执行模块M3.4至模块M3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果;如果正在发生结点升级/降级,则循环读取该子结点上下文字段的版本号,直到该前缀结点完成结点升级/降级,再重新触发执行最后一级层序索引,并在新的索引终点上重新触发执行模块M3.4至模块M3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果。
优选地,在所述模块M3.3中,
模块M3.3.1:对当前前缀字节进行哈希,确定该前缀字节在本前缀结点中所属的Bucket;
模块M3.3.2:在确定的Bucket中,对该Bucket包含的子结点上下文字段执行遍历搜索,对比子结点上下文字段中的前缀字节与当前前缀字节是否相同,确定当前处理的key在可变基数树中对应的下一层前缀结点;
模块M3.3.3:根据找到的子结点上下文字段,读取并记录子结点的版本号,保证数据并发一致性;
模块M3.3.4:根据找到的子结点上下文字段,读取子结点的前缀长度,并在当前处理的key对应的前缀字节序列跳过对应长度的前缀字节,确定用于在下一层前缀结点中进行索引的前缀字节;
模块M3.3.5:根据找到的子结点上下文字段,读取子结点的指针,确定下一层子结点的地址;
模块M3.3.6:根据找到的子结点上下文字段,读取子结点的结点类型,确定下一层子结点的大小以及Bucket数量,并对确定的下一位前缀字节进行哈希,确定在下一层子结点该前缀字节所属的Bucket,并根据确定的子结点地址对该子结点Bucket进行读取,重复触发模块M3.3.1至模块M3.3.6,执行下一层的前缀索引过程,直到到达索引终点;
所述索引终点包括:当前请求的Key所对应的叶子结点、前缀结点且在该前缀结点中未找到对应的叶子结点、前缀结点且其前缀与本次请求的Key不匹配。
优选地,所述结点升级/降级是使用子结点上下文字段中的版本号标识结点升级/降级的发起和完成情况,避免在该类过程中出现更新丢失、读不一致等并发异常;
模块M3.5.1:对本次执行结点升级/降级的前缀结点在父结点中对应的子结点上下文字段进行原子更新,将其版本号加1;
模块M3.5.2:根据升级或降级需求,新建一个与原前缀结点不同大小的新前缀结点;
模块M3.5.3:开始将原前缀结点内各Bucket的子结点上下文字段序列拷贝到新前缀结点的对应Bucket中;
模块M3.5.4:对原前缀结点在父结点中对应的子结点上下文字段进行原子更新,将其版本号加1,并同时更新结点类型。
优选地,所述结点升级/降级过程对子结点上下文字段的版本号的更新,将作为其他并发线程检查当前前缀结点是否发生过或正在发生结点升级/降级的依据;
前缀结点版本号被初始化为0;
如果某次检查中发现前缀结点版本号为奇数,说明该前缀结点正在发生结点升级/降级,则此时并发的后台处理线程将循环读取该子结点上下文字段,直至某次读取时前缀结点版本号变为偶数,说明该前缀结点的结点升级/降级已经完成;后台处理线程可以重新读取新前缀结点的地址,开始执行目标操作;
如果某次检查中发现前缀结点版本号为偶数,但与初次读取时已经发生变化,说明该前缀结点在后台处理线程执行目标操作的过程中已经发生过完整的结点升级/降级过程,则此时并发的后台处理线程将重新读取子结点上下文字段,获取新前缀结点的地址,重新开始执行目标操作。
优选地,在所述数据恢复模块中,从根前缀结点开始层序遍历可变基数树,依次检查所有前缀结点中所有Bucket内的所有子结点上下文字段,核对子结点版本号,若版本号为奇数,则说明持久可变基数树访问系统断电前该结点处于未完成的结点升级/降级状态,需要将版本号加一,恢复为偶数;
对所有前缀结点执行完上述过程后,持久可变基数树访问系统可开始正常接收以及并发处理读写请求。
与现有技术相比,本发明具有如下的有益效果:本发明通过对可变基数树的前缀结点进行哈希式改造,降低了单次请求处理过程的内存访问量,降低了持久可变基数树访问系统的读写延迟;此外还通过对可变基数树并发控制机制进行无锁化改造,提高了高并发场景下系统请求处理的吞吐量,保障了数据一致性与掉电可恢复性。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1是本发明实施例的支持无锁化并发访问的持久可变基数树访问系统的模块组成图。
图2是本发明一个实施例的可变基数树的数据布局图。
图3是本发明一个实施例的可变基数树的核心数据结构。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
实施例1
针对现有技术中的缺陷,本发明的目的是提供一种支持无锁化并发访问的持久可变基数树访问系统。
根据本发明提供的一种支持无锁化并发访问的持久可变基数树访问系统,包括:
数据存储模块:组织和管理可变基数树的前缀节点、叶子节点以及数据的持久存储,并支持通用可变基数树读写访问接口;
本地访问模块:接收本地应用对可变基数树的读写请求并放入处理队列等待后台处理模块进行处理;
后台处理模块:对处理队列中的读写请求(增加、删除、查询、修改请求)进行处理,更新可变基数树的前缀节点和叶子结点,并保证可变基数树的元数据和数据处于一致状态;
数据恢复模块:在持久可变基数树访问系统重启后检测故障一致性,当数据不一致时恢复可变基数树中的所有数据到一致状态。
具体地,组织和管理可变基数树的数据包括:前缀节点数据和叶子结点数据;
前缀节点根据负载大小不同可以有不同的节点大小和容量,存储数据Key值的前缀信息,用于对数据Key值进行索引。其中,前缀节点类型包括N8前缀节点、N32前缀节点、N64前缀节点、N128前缀节点、N256前缀节点,分别包含8个,32个、64个、128个、256个子节点的信息,可以对对应数量的子节点前缀值进行索引。
叶子结点存储数据Key-Value值的完整信息。
具体地,所述前缀节点采用哈希式划分方案降低单次节点访问带来的持久内存读写数量。可变基数树中不同大小的前缀节点由N个持久内存访问粒度XPLine(256字节)大小的Bucket组成,Bucket内存储该区域对应的前缀字节值在本前缀节点进行访问所需要的全部信息。其中,N32前缀节点、N64前缀节点、N128前缀节点分别包含1个、2个、4个Bucket,N8前缀节点和N256前缀节点采用子节点信息列表才存储子节点前缀字节的索引信息。N8和N256情况比较特殊,不需要采用Bucket划分方式进行存储,而可以直接使用效率更高列表方式进行存储。具体来说,进行Bucket划分存储的目的是对于不同大小的前缀结点,只访问256byte的空间就可以完成对某一个子结点的定位。256byte对应一个Bucket,对应32个子结点信息,所以N32是最小的能以Bucket为基本粒度的前缀结点。N8本身整个结点的大小就只有64byte,因此对N8所有内容的访问都不会超过256byte,自然也就不需要采用Bucket存储方式,直接用一个列表存储这八个子结点信息就可以了。而对于N256,可变基数树中,每一层前缀结点其实是在对一个1byte的子结点前缀值进行索引,这个1byte的子结点前缀值,由8比特组成,如果把这8比特看成一个整数的话,所能表示的最大范围就是0-255,也就是256个可能值。所以,在N256中,我们可以直接构造一个长度为256的子结点信息数组,把子结点信息直接存在它的前缀字节对应的整数所对应的位置上。比如某个结点的前缀字节翻译成整数是15,那么就把这个子结点信息存储在N256的列表的第15个位置。这样一来,我们如果要在N256中找某一个子结点前缀值对应的子结点信息,根本不需要像在其他结点(或者在其他Bucket)中挨个比较查找,而是可以直接去对应位置查找,这样一来,N256也不需要Bucket方式存储就可以达到访问不超过256Byte范围的效果。
前缀节点采用哈希散列方案对本节点存储的前缀字节值以及其对应的子节点信息进行散列划分,使不同前缀字节值均匀分布在前缀节点的不同Bucket中。
具体地,所述Bucket由32个子节点上下文字段组成。每一个子节点上下文字段与当前前缀节点的一个子节点一一对应,并包含该子节点的全部元数据。每个子节点上下文字段为8字节,支持原子更新。
具体地,所述子节点上下文字段括五个部分:
子节点类型NodeType:表示该子节点上下文字段对应的子节点类型,大小为3比特。其中,1表示N8前缀节点,2表示N32前缀节点,3表示N64前缀节点,4表示N128前缀节点,5表示N256前缀节点,6表示叶子结点;
子节点版本号NodeVersion:表示该子节点上下文字段对应的子节点版本代号,大小为5比特。该版本代号记录该子节点升降级信息,在节点每次进行升级和降级的开始和结束时分别加1,用于辅助执行可变基数树并发访问;
前缀字节KeyByte:表示该子节点上下文字段对应的子节点在可变基数树中代表的前缀字节值,大小为8比特,用于辅助执行可变基数树的层序索引过程;
子节点指针Pointer:表示该子节点上下文字段对应的子节点在可变基数树系统中的地址,大小为48比特,用于辅助执行可变基数树的层序索引过程。
子节点前缀长度PrefixLength:表示该子节点上下文字段对应的子节点在可变基数树系统中执行了路径压缩后被压缩掉的前缀字节的数量,大小为6比特,实际为子节点指针段的最后6比特,用于在执行可变基数树的层序索引过程中跳过在路径压缩过程被压缩的前缀字节。
具体地,所述数据存储模块将整个持久可变基数树存储在持久内存中,允许后台处理模块的不同线程发起并发的无阻塞的数据读写请求,从而实现对本地访问模块接受到的请求的处理。
具体地,所述后台处理模块使用请求队列来接受多个本地上层应用发起的读写请求,后台处理模块具体执行以下动作完成对请求队列中读写请求的处理:
更为具体地,所述后台处理模块包括:
模块M3.1:后台处理线程从请求队列中取出下一个待处理请求,解析对应的Key与请求类型。
模块M3.2:后台处理线程根据解析到的Key,将Key划分为前缀字节序列。
模块M3.3:使用该前缀字节序列从可变基数树根前缀节点开始执行层序索引,直到索引至叶子结点或最下层前缀节点或前缀不匹配处。
其中,在每一层前缀节点根据当前前缀字节和当前前缀节点内容执行前缀索引包括:
模块M3.3.1:对当前前缀字节进行哈希,确定该前缀字节在本前缀节点中所属的Bucket。
模块M3.3.2:在上述确定的Bucket中,对该Bucket包含的子节点上下文字段执行遍历搜索,比对子节点上下文字段中的前缀字节KeyByte与当前前缀字节是否相同,以此来确定本次处理的Key在可变基数树中对应的下一层前缀节点。
模块M3.3.3:根据找到的子节点上下文字段,读取并记录子节点的版本号NodeVersion,用于辅助后续处理过程,保证数据并发一致性。
模块M3.3.4:根据找到的子节点上下文字段,读取子节点的前缀长度PrefixLength,并在本次处理的Key对应的前缀字节序列中跳过对应长度的前缀字节,确定用于在下一层前缀节点中进行索引的前缀字节。
模块M3.3.5:根据找到的子节点上下文字段,读取子节点的指针Pointer,确定下一层子节点的地址。
模块M3.3.6:根据找到的子节点上下文字段,读取子节点的节点类型NodeType,确定下一层子节点的大小以及Bucket数量,并对S3.4中确定的下一位前缀字节进行哈希,确定在下一层子节点该前缀字节所属的Bucket,并根据S3.5中确定的子节点地址对该子节点Bucket进行读取,重复上述过程,执行下一层的前缀索引过程,直到到达索引终点。可能的索引终点包括:本次请求的Key所对应的叶子结点、前缀节点且在该前缀节点中未找到对应的叶子结点、前缀节点且其前缀与本次请求的Key不匹配。
模块M3.4:前缀索引过程执行结束后,根据本次请求类型,执行相应动作完成本次请求的主体动作;
其中,模块M3.4包括:
模块M3.4.1:对于查询、修改、删除请求,根据索引终点类型,有如下情况:
如果索引终点为本次请求的Key所对应的叶子结点,则直接对该叶子结点执行相应的查询、修改、删除动作。
如果索引终点为前缀节点,且没有在该前缀节点中找到目标叶子结点,或该前缀节点的前缀与本次请求的Key不匹配,则本次请求的结果为目标Key不存在。
模块M3.4.2:对于插入请求,根据索引终点类型,有如下情况:
如果索引终点为本次请求的Key所对应的叶子结点,则本次请求的结果为目标Key已存在。
如果索引终点为前缀节点,且没有在该前缀节点中找到目标叶子结点,则构造目标Key与Value构成的叶子结点与其对应的子节点上下文字段,并将子节点上下文字段插入到该前缀节点内对应的Bucket中。如果Bucket已满,还将触发节点升级操作。
如果索引终点为前缀节点,且其前缀与本次请求的Key不匹配,则将触发节点分裂操作。具体动作包括创建新的前缀节点,设置其前缀为原前缀节点与本次请求的Key的公共前缀,将新前缀节点作为原前缀节点的父节点,插入到原前缀节点的原父节点中,并更新原前缀节点的前缀。
模块M3.5:上述请求的主体动作完成后,检查索引终点对应的前缀节点的子节点上下文字段中的版本号NodeVersion是否发生变化来判断该前缀节点是否发生过或正在发生节点升级/降级。如果已经发生过节点升级/降级,则重新触发模块M3.3过程的最后一级层序索引,并在新的索引终点上重新触发模块M3.4、M3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果;如果正在发生节点升级/降级,则循环读取该子节点上下文字段的版本号NodeVersion,直到该前缀节点完成节点升级/降级,再重新执行S3过程的最后一级层序索引,并在新的索引终点上重新触发模块M3.4、M3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果。
具体地,所述的节点升级/降级过程,使用子节点上下文字段中的版本号标识节点升级/降级的发起和完成情况,避免在该类过程中出现更新丢失、读不一致等并发异常。在执行节点升级/降级时,后台处理线程执行以下动作:
模块M3.5.1:对本次执行节点升级/降级的前缀节点在父节点中对应的子节点上下文字段进行原子更新,将其版本号NodeVersion加1。
模块M3.5.2:根据升级或降级需求,新建一个与原前缀节点不同大小的新前缀节点。
模块M3.5.3:开始将原前缀节点内各Bucket的子节点上下文字段序列拷贝到新前缀节点的对应Bucket中。
模块M3.5.4:对原前缀节点在父节点中对应的子节点上下文字段进行原子更新,将其版本号NodeVersion加1,并同时更新节点类型NodeType。
具体地,所述节点升级/降级过程对子节点上下文字段的版本号NodeVersion的更新,将作为其他并发线程检查当前前缀节点是否发生过或正在发生节点升级/降级的依据。
具体来说,前缀节点版本号NodeVersion被初始化为0。
如果某次检查中发现前缀节点版本号NodeVersion为奇数,说明该前缀节点正在发生节点升级/降级,则此时并发的后台处理线程将循环读取该子节点上下文字段,直至某次读取时前缀节点版本号NodeVersion变为偶数,说明该前缀节点的节点升级/降级已经完成。后台处理线程可以重新读取新前缀节点的地址,开始执行目标操作。
如果某次检查中发现前缀节点版本号NodeVersion为偶数,但与初次读取时已经发生变化,说明该前缀节点在后台处理线程执行目标操作的过程中已经发生过完整的节点升级/降级过程,则此时并发的后台处理线程将重新读取子节点上下文字段,获取新前缀节点的地址,重新开始执行目标操作。
具体地,所述数据恢复模块包括:
从根前缀节点开始层序遍历可变基数树,依次检查所有前缀节点中所有Bucket内的所有子节点上下文字段,核对子节点版本号NodeVersion,若版本号为奇数,则说明系统断电前该节点处于未完成的节点升级/降级状态,需要将版本号加一,恢复为偶数。
对所有前缀节点执行完上述过程后,持久可变基数树访问系统可开始正常接收一级并发处理读写请求。
本发明提供的支持无锁化并发访问的持久可变基数树访问系统,可以通过本发明提供的支持无锁化并发访问的持久可变基数树访问方法中的步骤流程实现。本领域技术人员,可以将所述支持无锁化并发访问的持久可变基数树访问方法理解为支持无锁化并发访问的持久可变基数树访问系统的一个优选例。
实施例2
实施例2是实施例1的优选例
在介绍本发明的实施例之前,先对本发明中出现的术语进行说明。
新型持久内存PM(Pers istent Memory,又作非易失内存NVM)技术综合了DRAM内存与磁盘/固态硬盘(SSD)/闪存(Flash)两者的特性,由于其字节寻址能力、低延迟和数据持久性的特性而受到广泛的关注和研究。一方面,它与磁盘/固态硬盘(SSD)/闪存(Flash)相似,具有大容量、非易失、低功耗等特点;另一方面,它与DRAM内存相似,具有低延迟、高带宽、可字节寻址等特点。与传统DRAM内存相比,基于PM构建存储系统可直接持久存储数据,省去刷新到下一级持久存储器的开销;与磁盘相比,基于PM构建持久存储系统可通过load/store方式直接访问PM中存储的数据,省去了加载到内存缓冲区的开销。因此,PM为构建新型高效持久存储系统提供了机遇,基于非易失性内存访存特性设计高性能持久化数据结构的研究成果也被不断提出。此外,具有字节寻址能力的持久内存比如Intel Optane DCpersistent memory module(DCPMM)等商业化产品目前也已经面世。
基数树(Radix Trie,也叫基数特里树或压缩前缀树)是一种数据结构,是一种更节省空间的前缀树,其中作为唯一子节点的每个节点都与其父节点合并,边既可以表示为元素序列又可以表示为单个元素。因此每个内部节点的子节点数最多为基数树的基数r,其中r为正整数,x为2的幂,x≥1,这使得基数树更适用于对于较小的集合(尤其是字符串很长的情况下)和有很长相同前缀的字符串集合。基数树的查找方式也与常规树不同(常规的树查找一开始就对整个键进行比较,直到不相同为止),基数树查找时节点时,对于节点上的键都按块进行逐块比较,其中该节点中块的长度是基数r;当r为2时,基数树为二进制的(即该节点的键的长度为1比特位),能最大程度地减小树的深度来最小化稀疏性(最大限度地合并键中没有分叉的节点)。当r≥4且为2的整数次幂时,基数树是r元基数树,能以潜在的稀疏性为代价降低基数树的深度。基数树作为一种重要的基于树的数据索引结构,相较于B+树而言,其整体结构由插入的Key值决定且插入无需执行任何针对Key值的比较,有效减少了缓存行的刷入和必要的日志记录,因此更适应于非易失性内存下的数据索引。
可变基数树(Adapt ive Radix Tree)相较于传统基数树,其最大区别在于每个节点可以容纳的前缀字节是动态变化的,节点大小可以通过节点升级/降级动态调整,从而提升空间利用率以及缓存局部性。
图1是本发明实施例的一种支持无锁化并发访问的持久可变基数树访问系统的模块组成图。根据图1所示的支持无锁化并发访问的持久可变基数树访问系统,由四个主要模块构成,即本地访问模块、后台处理模块、数据存储模块和数据恢复模块。
其中,数据存储模块组织和管理可变基数树的前缀节点、叶子节点以及数据的持久存储,并支持通用可变基数树读写访问接口;本地访问模块接收本地应用对可变基数树的读写请求并放入处理队列等待后台处理模块进行处理;后台处理模块对处理队列中的增加、删除、查询、修改请求进行处理,更新可变基数树的前缀节点和叶子结点,并保证可变基数树的元数据和数据处于一致状态;数据恢复模块在持久可变基数树访问系统重启后检测故障一致性,当数据不一致时恢复可变基数树中的所有数据到一致状态。
持久可变基数树的数据存储模块将可变基数树数据分为前缀节点数据和叶子结点数据两个部分。前缀节点根据负载大小不同可以有不同的节点大小和容量,存储数据Key值的前缀信息,用于对数据Key值进行索引。其中,前缀节点类型包括N8前缀节点、N32前缀节点、N64前缀节点、N128前缀节点、N256前缀节点,分别包含8个,32个、64个、128个、256个子节点的信息,可以对对应数量的子节点前缀值进行索引。叶子结点存储数据Key-Value值的完整信息。
如图2所示,前缀节点采用哈希式划分方案降低单次节点访问带来的持久内存读写数量。可变基数树中不同大小的前缀节点由N个持久内存访问粒度XPLine(256字节)大小的Bucket组成,Bucket内存储该区域对应的前缀字节值在本前缀节点进行访问所需要的全部信息。其中,N32前缀节点、N64前缀节点、N128前缀节点分别包含1个、2个、4个Bucket,N8前缀节点和N256前缀节点采用子节点信息列表才存储子节点前缀字节的索引信息。前缀节点采用哈希散列方案对本节点存储的前缀字节值以及其对应的子节点信息进行散列划分,使不同前缀字节值均匀分布在前缀节点的不同Bucket中。
此外,持久可变基数树以图3所示数据结构,即子节点上下文字段组织前缀节点内容。Bucket由32个子节点上下文字段组成。每一个子节点上下文字段与当前前缀节点的一个子节点一一对应,并包含该子节点的全部元数据。每个子节点上下文字段为8字节,支持原子更新。子节点上下文字段括五个部分:子节点类型NodeType,表示该子节点上下文字段对应的子节点类型,大小为3比特。其中,1表示N8前缀节点,2表示N32前缀节点,3表示N64前缀节点,4表示N128前缀节点,5表示N256前缀节点,6表示叶子结点;子节点版本号NodeVersion,表示该子节点上下文字段对应的子节点版本代号,大小为5比特。该版本代号记录该子节点升降级信息,在节点每次进行升级和降级的开始和结束时分别加1,用于辅助执行可变基数树并发访问;前缀字节KeyByte,表示该子节点上下文字段对应的子节点在可变基数树中代表的前缀字节值,大小为8比特,用于辅助执行可变基数树的层序索引过程;子节点指针Pointer,表示该子节点上下文字段对应的子节点在可变基数树系统中的地址,大小为48比特,用于辅助执行可变基数树的层序索引过程;子节点前缀长度PrefixLength,表示该子节点上下文字段对应的子节点在可变基数树系统中执行了路径压缩后被压缩掉的前缀字节的数量,大小为6比特,实际为子节点指针段的最后6比特,用于在执行可变基数树的层序索引过程中跳过在路径压缩过程被压缩的前缀字节。
数据存储模块将整个持久可变基数树存储在持久内存中,允许后台处理模块的不同线程发起并发的无阻塞的数据读取和数据修改请求,从而实现对本地访问模块接受到的请求的处理。
后台处理模块使用请求队列来接受多个本地上层应用发起的读写请求,后台处理模块具体执行以下动作完成对请求队列中读写请求的处理:
模块S3.1:后台处理线程从请求队列中取出下一个待处理请求,解析对应的Key与请求类型。
模块S3.2:后台处理线程根据解析到的Key,将Key划分为前缀字节序列。
模块S3.3:使用该前缀字节序列从可变基数树根前缀节点开始执行层序索引,直到索引至叶子结点或最下层前缀节点或前缀不匹配处。在每一层前缀节点根据当前前缀字节和当前前缀节点内容执行前缀索引的过程如下:
模块S3.3.1:对当前前缀字节进行哈希,确定该前缀字节在本前缀节点中所属的Bucket。
模块S3.3.2:在上述确定的Bucket中,对该Bucket包含的子节点上下文字段执行遍历搜索,比对子节点上下文字段中的前缀字节KeyByte与当前前缀字节是否相同,以此来确定本次处理的Key在可变基数树中对应的下一层前缀节点。
模块S3.3.3:根据找到的子节点上下文字段,读取并记录子节点的版本号NodeVersion,用于辅助后续处理过程,保证数据并发一致性。
模块S3.3.4:根据找到的子节点上下文字段,读取子节点的前缀长度PrefixLength,并在本次处理的Key对应的前缀字节序列中跳过对应长度的前缀字节,确定用于在下一层前缀节点中进行索引的前缀字节。
模块S3.3.5:根据找到的子节点上下文字段,读取子节点的指针Pointer,确定下一层子节点的地址。
模块S3.3.6:根据找到的子节点上下文字段,读取子节点的节点类型NodeType,确定下一层子节点的大小以及Bucket数量,并对S3.4中确定的下一位前缀字节进行哈希,确定在下一层子节点该前缀字节所属的Bucket,并根据S3.5中确定的子节点地址对该子节点Bucket进行读取,重复上述过程,执行下一层的前缀索引过程,直到到达索引终点。可能的索引终点包括:本次请求的Key所对应的叶子结点、前缀节点且在该前缀节点中未找到对应的叶子结点、前缀节点且其前缀与本次请求的Key不匹配。
模块S3.4:前缀索引过程执行结束后,根据本次请求类型,执行相应动作完成本次请求的主体动作,具体有如下情况:
模块S3.4.1:对于查询、修改、删除请求,根据索引终点类型,有如下情况:
模块S3.4.1.1:如果索引终点为本次请求的Key所对应的叶子结点,则直接对该叶子结点执行相应的查询、修改、删除动作。
模块S3.4.1.2:如果索引终点为前缀节点,且没有在该前缀节点中找到目标叶子结点,或该前缀节点的前缀与本次请求的Key不匹配,则本次请求的结果为目标Key不存在。
模块S3.4.2:对于插入请求,根据索引终点类型,有如下情况:
模块S3.4.2.1:如果索引终点为本次请求的Key所对应的叶子结点,则本次请求的结果为目标Key已存在。
模块S3.4.2.2:如果索引终点为前缀节点,且没有在该前缀节点中找到目标叶子结点,则构造目标Key与Value构成的叶子结点与其对应的子节点上下文字段,并将子节点上下文字段插入到该前缀节点内对应的Bucket中。如果Bucket已满,还将触发节点升级操作。
模块S3.4.2.3:如果索引终点为前缀节点,且其前缀与本次请求的Key不匹配,则将触发节点分裂操作。具体动作包括创建新的前缀节点,设置其前缀为原前缀节点与本次请求的Key的公共前缀,将新前缀节点作为原前缀节点的父节点,插入到原前缀节点的原父节点中,并更新原前缀节点的前缀。
模块S3.5:上述请求的主体动作完成后,检查索引终点对应的前缀节点的子节点上下文字段中的版本号NodeVersion是否发生变化来判断该前缀节点是否发生过或正在发生节点升级/降级。如果已经发生过节点升级/降级,则重新执行S3.3过程的最后一级层序索引,并在新的索引终点上重新执行S3.4、S3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果;如果正在发生节点升级/降级,则循环读取该子节点上下文字段的版本号NodeVersion,直到该前缀节点完成节点升级/降级,再重新执行S3.3过程的最后一级层序索引,并在新的索引终点上重新执行S3.4、S3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果。
节点升级/降级过程,使用子节点上下文字段中的版本号标识节点升级/降级的发起和完成情况,避免在该类过程中出现更新丢失、读不一致等并发异常。在执行节点升级/降级时,后台处理线程执行以下动作:
模块S3.5.1:对本次执行节点升级/降级的前缀节点在父节点中对应的子节点上下文字段进行原子更新,将其版本号NodeVersion加1。
模块S3.5.2:根据升级或降级需求,新建一个与原前缀节点不同大小的新前缀节点。
模块S3.5.3:开始将原前缀节点内各Bucket的子节点上下文字段序列拷贝到新前缀节点的对应Bucket中。
模块S3.5.4:对原前缀节点在父节点中对应的子节点上下文字段进行原子更新,将其版本号NodeVersion加1,并同时更新节点类型NodeType。
节点升级/降级过程对子节点上下文字段的版本号NodeVersion的更新,将作为其他并发线程检查当前前缀节点是否发生过或正在发生节点升级/降级的依据。
具体来说,前缀节点版本号NodeVersion被初始化为0。
如果某次检查中发现前缀节点版本号NodeVersion为奇数,说明该前缀节点正在发生节点升级/降级,则此时并发的后台处理线程将循环读取该子节点上下文字段,直至某次读取时前缀节点版本号NodeVersion变为偶数,说明该前缀节点的节点升级/降级已经完成。后台处理线程可以重新读取新前缀节点的地址,开始执行目标操作。
如果某次检查中发现前缀节点版本号NodeVersion为偶数,但与初次读取时已经发生变化,说明该前缀节点在后台处理线程执行目标操作的过程中已经发生过完整的节点升级/降级过程,则此时并发的后台处理线程将重新读取子节点上下文字段,获取新前缀节点的地址,重新开始执行目标操作。
数据恢复模块执行的动作为:从根前缀节点开始层序遍历可变基数树,依次检查所有前缀节点中所有Bucket内的所有子节点上下文字段,核对子节点版本号NodeVersion,若版本号为奇数,则说明系统断电前该节点处于未完成的节点升级/降级状态,需要将版本号加一,恢复为偶数。对所有前缀节点执行完上述过程后,持久可变基数树访问系统可开始正常接收一级并发处理读写请求。
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

Claims (10)

1.一种支持无锁化并发访问的持久可变基数树访问系统,其特征在于,包括:
数据存储模块:组织和管理可变基数树的前缀结点、叶子结点以及数据的持久存储,并支持通用可变基数树读写访问接口;
本地访问模块:接收本地应用对可变基数树的读写请求并放入处理队列等待后台处理模块进行处理;
后台处理模块:对处理队列中的读写请求进行处理,更新可变基数树的前缀结点和叶子结点,并保证可变基数树的元数据和数据处于一致状态;
数据恢复模块:在持久可变基数树访问系统重启后检测故障一致性,当数据不一致时恢复可变基数树中的所有数据到一致状态。
2.根据权利要求1所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,所述前缀结点根据负载大小不同有不同的结点大小和容量,存储数据key值的前缀信息,用于对数据key值进行索引;
所述前缀结点包括:N8前缀结点、N32前缀结点、N64前缀结点、N128前缀结点以及N256前缀结点,分别包含8个,32个、64个、128个、256个子结点的信息,对对应数量的子结点前缀值进行索引;
所述叶子结点用于存储数据Key-Value值的完整信息。
3.根据权利要求2所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,所述前缀结点采用哈希式划分的方法将可变基数树中不同大小的前缀结点划分为N个持久内存访问粒度为XPLine大小的Bucket,Bucket内存储该区域对应的前缀字节值在本前缀结点进行访问所需要的全部信息;其中,N32前缀结点、N64前缀结点、N128前缀结点分别包含1个、2个、4个Bucket,N8前缀结点和N256前缀结点采用子结点信息列表存储子结点前缀字节的索引信息;
前缀结点采用哈希散列的方法对本结点存储的前缀字节值以及其对应的子结点信息进行散列划分,使不同前缀字节值均匀分布在前缀结点的不同Bucket中。
4.根据权利要求3所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,所述Bucket包括32个子结点上下文字段,每一个子结点上下文字段与当前前缀结点的一个子结点一一对应,并包含该子结点的全部元数据;每个子结点上下文字段为8字节,支持原子更新;
所述子结点上下文字段包括:子结点类型、子结点版本号、前缀字节、子结点指针以及子结点前缀长度。
5.根据权利要求1所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,在所述数据存储模块中,将整个持久可变基数树存储在持久内存中,允许后台处理模块的不同线程发起并发的无阻塞的读写请求,实现对本地访问模块接收到的请求的处理。
6.根据权利要求1所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,在所述后台处理模块中,
模块M3.1:后台处理线程从请求队列中获取待处理请求,解析获得对应的key与请求类型;
模块M3.2:后台处理线程根据解析到的key,将key划分为前缀字节序列;
模块M3.3:使用当前前缀字节序列从可变基数树根前缀结点开始执行层序索引,直到索引至叶子结点或最下层前缀结点或前缀不匹配处;
模块M3.4:前缀索引过程执行结束后,根据当前请求类型,执行相应动作完成当前请求的主体动作;
模块M3.5:请求的主体动作完成后,检查索引终点对应的前缀结点的子结点上下文字段中的版本是否发生变化来判断该前缀结点是否发生过或正在发生结点升级/降级;如果已经发生过结点升级/降级,则重新触发执行最后一级层序索引,并在新的索引终点上重新触发执行模块M3.4至模块M3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果;如果正在发生结点升级/降级,则循环读取该子结点上下文字段的版本号,直到该前缀结点完成结点升级/降级,再重新触发执行最后一级层序索引,并在新的索引终点上重新触发执行模块M3.4至模块M3.5操作,直至某一次检查版本号无变化,本次读写请求处理过程结束,返回结果。
7.根据权利要求1所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,在所述模块M3.3中,
模块M3.3.1:对当前前缀字节进行哈希,确定该前缀字节在本前缀结点中所属的Bucket;
模块M3.3.2:在确定的Bucket中,对该Bucket包含的子结点上下文字段执行遍历搜索,对比子结点上下文字段中的前缀字节与当前前缀字节是否相同,确定当前处理的key在可变基数树中对应的下一层前缀结点;
模块M3.3.3:根据找到的子结点上下文字段,读取并记录子结点的版本号,保证数据并发一致性;
模块M3.3.4:根据找到的子结点上下文字段,读取子结点的前缀长度,并在当前处理的key对应的前缀字节序列跳过对应长度的前缀字节,确定用于在下一层前缀结点中进行索引的前缀字节;
模块M3.3.5:根据找到的子结点上下文字段,读取子结点的指针,确定下一层子结点的地址;
模块M3.3.6:根据找到的子结点上下文字段,读取子结点的结点类型,确定下一层子结点的大小以及Bucket数量,并对确定的下一位前缀字节进行哈希,确定在下一层子结点该前缀字节所属的Bucket,并根据确定的子结点地址对该子结点Bucket进行读取,重复触发模块M3.3.1至模块M3.3.6,执行下一层的前缀索引过程,直到到达索引终点;
所述索引终点包括:当前请求的Key所对应的叶子结点、前缀结点且在该前缀结点中未找到对应的叶子结点、前缀结点且其前缀与本次请求的Key不匹配。
8.根据权利要求6所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,所述结点升级/降级是使用子结点上下文字段中的版本号标识结点升级/降级的发起和完成情况,避免在该类过程中出现更新丢失、读不一致等并发异常;
模块M3.5.1:对本次执行结点升级/降级的前缀结点在父结点中对应的子结点上下文字段进行原子更新,将其版本号加1;
模块M3.5.2:根据升级或降级需求,新建一个与原前缀结点不同大小的新前缀结点;
模块M3.5.3:开始将原前缀结点内各Bucket的子结点上下文字段序列拷贝到新前缀结点的对应Bucket中;
模块M3.5.4:对原前缀结点在父结点中对应的子结点上下文字段进行原子更新,将其版本号加1,并同时更新结点类型。
9.根据权利要求8所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,所述结点升级/降级过程对子结点上下文字段的版本号的更新,将作为其他并发线程检查当前前缀结点是否发生过或正在发生结点升级/降级的依据;
前缀结点版本号被初始化为0;
如果某次检查中发现前缀结点版本号为奇数,说明该前缀结点正在发生结点升级/降级,则此时并发的后台处理线程将循环读取该子结点上下文字段,直至某次读取时前缀结点版本号变为偶数,说明该前缀结点的结点升级/降级已经完成;后台处理线程可以重新读取新前缀结点的地址,开始执行目标操作;
如果某次检查中发现前缀结点版本号为偶数,但与初次读取时已经发生变化,说明该前缀结点在后台处理线程执行目标操作的过程中已经发生过完整的结点升级/降级过程,则此时并发的后台处理线程将重新读取子结点上下文字段,获取新前缀结点的地址,重新开始执行目标操作。
10.根据权利要求1所述的支持无锁化并发访问的持久可变基数树访问系统,其特征在于,在所述数据恢复模块中,从根前缀结点开始层序遍历可变基数树,依次检查所有前缀结点中所有Bucket内的所有子结点上下文字段,核对子结点版本号,若版本号为奇数,则说明持久可变基数树访问系统断电前该结点处于未完成的结点升级/降级状态,需要将版本号加一,恢复为偶数;
对所有前缀结点执行完上述过程后,持久可变基数树访问系统可开始正常接收以及并发处理读写请求。
CN202310411617.1A 2023-04-17 2023-04-17 支持无锁化并发访问的持久可变基数树访问系统 Pending CN116401416A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310411617.1A CN116401416A (zh) 2023-04-17 2023-04-17 支持无锁化并发访问的持久可变基数树访问系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310411617.1A CN116401416A (zh) 2023-04-17 2023-04-17 支持无锁化并发访问的持久可变基数树访问系统

Publications (1)

Publication Number Publication Date
CN116401416A true CN116401416A (zh) 2023-07-07

Family

ID=87010291

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310411617.1A Pending CN116401416A (zh) 2023-04-17 2023-04-17 支持无锁化并发访问的持久可变基数树访问系统

Country Status (1)

Country Link
CN (1) CN116401416A (zh)

Similar Documents

Publication Publication Date Title
CN113168408B (zh) 利用压缩的键值存储树数据块溢出
US10496283B2 (en) Adaptive prefix tree based order partitioned data storage system
US8868926B2 (en) Cryptographic hash database
EP3159810B1 (en) Improved secondary data structures for storage class memory (scm) enabled main-memory databases
EP2270684B1 (en) Dictionary-based order-preserving string compression for main-memory column stores
CN105117415B (zh) 一种优化的ssd数据更新方法
US10719450B2 (en) Storage of run-length encoded database column data in non-volatile memory
US10521117B2 (en) Unified table delta dictionary memory size and load time optimization
US11449430B2 (en) Key-value store architecture for key-value devices
US20220027349A1 (en) Efficient indexed data structures for persistent memory
CN103577513A (zh) 藉延迟节点实例化以缓存xml信息集的系统和/或方法
CN111832065A (zh) 使用电路实现的软件和用于密钥-值存储的方法
US10289709B2 (en) Interleaved storage of dictionary blocks in a page chain
CN112732725B (zh) 基于nvm混合内存的自适应前缀树构建方法及其系统、介质
CN111414134B (zh) 面向持久内存文件系统的事务写优化框架的方法及系统
CN111400306B (zh) 基于rdma与非易失性内存的基数树访问系统
US20160357673A1 (en) Method of maintaining data consistency
CN110795042A (zh) 一种全闪存储系统元数据写缓存刷盘方法及相关组件
CN117908755A (zh) 一种基于非易失性内存的键值存储写优化方法
Liu et al. Pea hash: a performant extendible adaptive hashing index
CN110515897B (zh) Lsm存储系统读性能的优化方法及系统
CN111198660A (zh) 一种b+树遍历的方法及装置
CN116401416A (zh) 支持无锁化并发访问的持久可变基数树访问系统
CN111274456B (zh) 基于nvm主存的数据索引方法及数据处理系统
US20200272424A1 (en) Methods and apparatuses for cacheline conscious extendible hashing

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