CN116301597A - 数据存储方法、装置、设备和存储介质 - Google Patents

数据存储方法、装置、设备和存储介质 Download PDF

Info

Publication number
CN116301597A
CN116301597A CN202310111372.0A CN202310111372A CN116301597A CN 116301597 A CN116301597 A CN 116301597A CN 202310111372 A CN202310111372 A CN 202310111372A CN 116301597 A CN116301597 A CN 116301597A
Authority
CN
China
Prior art keywords
value
key
data
node
key value
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
CN202310111372.0A
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.)
Hangzhou Qulian Technology Co Ltd
Original Assignee
Hangzhou Qulian Technology Co Ltd
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 Hangzhou Qulian Technology Co Ltd filed Critical Hangzhou Qulian Technology Co Ltd
Priority to CN202310111372.0A priority Critical patent/CN116301597A/zh
Publication of CN116301597A publication Critical patent/CN116301597A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0608Saving storage space on storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24553Query execution of query operations
    • G06F16/24558Binary matching operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0643Management of files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/067Distributed or networked storage systems, e.g. storage area networks [SAN], network attached storage [NAS]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0673Single storage device
    • G06F3/0674Disk device
    • G06F3/0676Magnetic disk device
    • 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)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Human Computer Interaction (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Computational Linguistics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种数据存储方法、装置、设备和存储介质,属于计算机技术领域。该方法包括:将待存储的多个第一键值对中每个第一键值对的value值存储至预设文件;生成与多个第一键值对一一对应的多个第二键值对,第二键值对的key值为对应的第一键值对的key值,第二键值对的value值为对应的第一键值对的value值的存储位置信息;根据多个第二键值对构建默克尔B+树,默克尔B+树中的数据节点包含第二键值对;将默克尔B+树中每个节点的数据存储至磁盘页。本申请中默克尔B+树中的数据节点包含的value值非常小,因而磁盘页中的数据存储比较紧凑,从而不仅可以减少磁盘页的存储空间的浪费,而且可以减小写放大。

Description

数据存储方法、装置、设备和存储介质
技术领域
本申请涉及计算机技术领域,特别涉及一种数据存储方法、装置、设备和存储介质。
背景技术
默克尔B+树是以B+树为基础进行改进的树结构,其包含两种类型的节点:索引节点和处于最后一层的数据节点。相关技术中,索引节点存放其下属节点的最小键和哈希值,数据节点存放键值对(即key-value)。默克尔B+树中每个节点存放的数据存储在磁盘页中。
为了适应磁盘的读写策略,通常规定每个磁盘页的大小为4K(千字节)。然而,由于数据节点存放的键值对中的value值通常比较大,所以磁盘页中的数据存储是不紧凑的,例如,一个4K的磁盘页只能存储一个3K的value值。而数据读写只能以磁盘页为单位进行,因而对小于磁盘页大小的节点数据的读写会带来对整个磁盘页的读写,这就导致写放大会很大。
发明内容
本申请提供了一种数据存储方法、装置、设备和存储介质,可以减小写放大。所述技术方案如下:
第一方面,提供了一种数据存储方法,所述方法包括:
获取待存储的多个第一键值对;将所述多个第一键值对中每个第一键值对的value值存储至预设文件,得到所述每个第一键值对的value值的存储位置信息;生成与所述多个第一键值对一一对应的多个第二键值对,一个第二键值对的key值为对应的一个第一键值对的key值,一个第二键值对的value值为对应的一个第一键值对的value值的存储位置信息;根据所述多个第二键值对构建默克尔B+树,所述默克尔B+树中的数据节点包含所述第二键值对;将所述默克尔B+树中每个节点的数据存储至磁盘页。
在本申请中,将第一键值对的value值存储于预设文件,将第一键值对的value值的存储位置信息作为第二键值对的value值存放于数据节点。这种情况下,默克尔B+树中的数据节点包含的value值非常小,因而磁盘页中的数据存储比较紧凑,如此一个磁盘页能存储很多个value值,从而不仅可以减少磁盘页的存储空间的浪费,而且可以减小写放大。
可选地,所述第一键值对的value值的存储位置信息包括存储所述第一键值对的value值的所述预设文件的文件标识、所述第一键值对的value值在所述预设文件中的偏移量、所述第一键值对的value值的字节长度。
可选地,所述将所述默克尔B+树中每个节点的数据存储至磁盘页之后,还包括:
接收查询指令,所述查询指令携带目标key值;根据所述目标key值获取所述磁盘页中存储的指定键值对,所述指定键值对是所述默克尔B+树中的数据节点包含的key值为所述目标key值的键值对;将所述预设文件中位于所述指定键值对的value值指示的存储位置处的value值确定为目标value值。
可选地,所述根据所述多个第二键值对构建默克尔B+树之前,还包括:
获取所述多个第一键值对中每个第一键值对的value值的哈希值;
所述根据所述多个第二键值对构建默克尔B+树,包括:
根据所述多个第二键值对和所述多个第二键值对中每个第二键值对对应的第一键值对的value值的哈希值,构建所述默克尔B+树;其中,所述默克尔B+树中的每个数据节点包含至少一个指定数据,所述指定数据包括一个第二键值对和对应的一个第一键值对的value值的哈希值;所述默克尔B+树中的每个索引节点包含下属的每个节点的最小键和哈希值,所述节点的最小键为所述节点包含的所有key值中最小的key值,所述节点的哈希值为所述节点包含的所有哈希值拼接得到的数据的哈希值。
可选地,所述将所述默克尔B+树中每个节点的数据存储至磁盘页之后,还包括:
接收添加指令,所述添加指令携带第一目标键值对;获取所述第一目标键值对的value值的哈希值;将所述第一目标键值对的value值存储至所述预设文件,得到所述第一目标键值对的value值的存储位置信息;生成与所述第一目标键值对对应的第二目标键值对,所述第二目标键值对的key值为所述第一目标键值对的key值,所述第二目标键值对的value值为所述第一目标键值对的value值的存储位置信息;根据所述第二目标键值对的key值,获取所述磁盘页中存储的目标数据节点的数据,所述目标数据节点为所述第二目标键值对在所述默克尔B+树中所需插入的数据节点;在所述目标数据节点的数据中添加指定目标数据,以更新所述目标数据节点,所述指定目标数据包括所述第二目标键值对和所述第一目标键值对的value值的哈希值;若更新后的所述目标数据节点的数据量小于或等于预设数据量,则将更新后的所述目标数据节点包含的所有key值中最小的key值确定为更新后的所述目标数据节点的最小键,将更新后的所述目标数据节点包含的所有哈希值拼接得到的数据的哈希值确定为更新后的所述目标数据节点的哈希值;根据更新后的所述目标数据节点的最小键和哈希值更新所述默克尔B+树中的索引节点;将更新后的所述目标数据节点的数据和更新后的所述索引节点的数据存储至所述磁盘页。
可选地,所述在所述目标数据节点的数据中添加指定目标数据,以更新所述目标数据节点之后,还包括:
若更新后的所述目标数据节点的数据量大于所述预设数据量,则将更新后的所述目标数据节点分裂为至少两个数据节点,所述至少两个数据节点中每个数据节点的数据量小于或等于所述预设数据量;对于所述至少两个数据节点中任意的一个数据节点,将所述一个数据节点包含的所有key值中最小的key值确定为所述一个数据节点的最小键,将所述一个数据节点包含的所有哈希值拼接得到的数据的哈希值确定为所述一个数据节点的哈希值;根据所述至少两个数据节点中每个数据节点的最小键和哈希值更新所述默克尔B+树中的索引节点;将所述至少两个数据节点中每个数据节点的数据和更新后的所述索引节点的数据存储至所述磁盘页。
可选地,所述预设文件的数量为一个或多个,一个或多个预设文件的存储空间大小相同,且所述一个或多个预设文件是顺序创建的,所述方法还包括:
若存在一个键值对的value值需要存储至所述预设文件,则在已创建的所有所述预设文件中最后一个预设文件的剩余存储空间足以存储所述一个键值对的value值的情况下,将所述一个键值对的value值存储至所述最后一个预设文件;在所述最后一个预设文件的剩余存储空间不足以存储所述一个键值对的value值的情况下,创建一个新的所述预设文件,将所述一个键值对的value值存储至最新创建的所述预设文件。
可选地,所述第一键值对的value值的存储位置信息包括存储所述第一键值对的value值的所述预设文件的文件标识、所述第一键值对的value值在所述预设文件中的偏移量、所述第一键值对的value值的字节长度;
所述方法还包括:
创建记录表,所述记录表包括已创建的所有预设文件中每个预设文件的文件标识、文件大小、文件废弃大小和事务标识,其中,所述记录表中对应的文件大小与文件废弃大小相同的文件标识所标识的预设文件为历史预设文件;
所述方法还包括:
若在执行一个事务后更新了所述默克尔B+树,则确定在执行所述一个事务的过程中所述默克尔B+树中的数据节点中被更新或被删除的历史键值对;将所述历史键值对的value值中的文件标识在所述记录表中对应的文件废弃大小增加所述历史键值对的value值中的字节长度,并将所述历史键值对的value值中的文件标识在所述记录表中对应的事务标识更新为所述一个事务的标识;
所述方法还包括:
若当前待执行的事务的标识为一个历史预设文件的文件标识在所述记录表中对应的事务标识与预设版本数量之和,则删除所述一个历史预设文件,所述预设版本数量为所述默克尔B+树支持的回滚版本的数量。
第二方面,提供了一种数据存储装置,所述装置包括:
第一获取模块,用于获取待存储的多个第一键值对;
第一存储模块,用于将所述多个第一键值对中每个第一键值对的value值存储至预设文件,得到所述每个第一键值对的value值的存储位置信息;
生成模块,用于生成与所述多个第一键值对一一对应的多个第二键值对,一个第二键值对的key值为对应的一个第一键值对的key值,一个第二键值对的value值为对应的一个第一键值对的value值的存储位置信息;
构建模块,用于根据所述多个第二键值对构建默克尔B+树,所述默克尔B+树中的数据节点包含所述第二键值对;
第二存储模块,用于将所述默克尔B+树中每个节点的数据存储至磁盘页。
第三方面,提供了一种计算机设备,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述第一方面所述的数据存储方法。
第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的数据存储方法。
第五方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面所述的数据存储方法的步骤。
可以理解的是,上述第二方面、第三方面、第四方面、第五方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的第一种默克尔B+树的示意图;
图2是本申请实施例提供的第二种默克尔B+树的示意图;
图3是本申请实施例提供的一种数据存储方法的流程图;
图4是本申请实施例提供的第三种默克尔B+树的示意图;
图5是本申请实施例提供的一种默克尔B+树的键值对分发和合并操作的示意图;
图6是本申请实施例提供的一种默克尔B+树的节点分裂操作的示意图;
图7是本申请实施例提供的一种事务更新默克尔B+树的示意图;
图8是本申请实施例提供的一种数据存储装置的结构示意图;
图9是本申请实施例提供的一种计算机设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请的实施方式作进一步地详细描述。
应当理解的是,本申请提及的“多个”是指两个或两个以上。在本申请的描述中,除非另有说明,“/”表示或的意思,比如,A/B可以表示A或B;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,比如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,为了便于清楚描述本申请的技术方案,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
在本申请中描述的“一个实施例”或“一些实施例”等语句意味着在本申请的一个或多个实施例中包括该实施例描述的特定特征、结构或特点。由此,在本申请中的不同之处出现的“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等语句不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。此外,术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
在对本申请实施例进行详细地解释说明之前,先对本申请实施例的应用场景予以说明。
本申请实施例应用于基于默克尔B+树进行数据存储的场景中。比如,区块链系统在执行完一个区块中所有的交易后,会产生一系列的账本修改集。这种情况下,可以通过本申请实施例提供的数据存储方法来基于默克尔B+树对这些账本修改集进行存储。
接下来对默克尔B+树的结构进行介绍。
默克尔B+树是一种树数据结构,默克尔B+树包含两种类型的节点:索引节点(indexNode)和处于最下层的数据节点(dataNode)。索引节点和数据节点均为逻辑节点。
数据节点中存放有多个键值对,每个键值对包括一个key值和一个value值。数据节点具有最小键和哈希值。数据节点的最小键是其存放的所有键值对的key值中最小的key值。数据节点的哈希值是其存放的所有键值对拼接得到的数据的哈希值。
索引节点中存放有其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其存放的所有节点的最小键中最小的key值,索引节点的哈希值是其存放的所有节点的哈希值拼接得到的数据的哈希值。
示例地,图1是本申请实施例提供的一种默克尔B+树的示意图。参见图1,该默克尔B+树包括多个数据节点(图1中以节点n4、节点n5、节点n6为例)和多个索引节点(图1中以节点n1、节点n2、节点n3为例)。其中,节点n1的下属节点包括节点n2和节点n3,节点n2的下属节点包括节点n4和节点n5,节点n3的下属节点包括节点n6。在本申请实施例中,处于最上层的索引节点可以称为根节点,比如,图1中的节点n1为根节点。
图1中的数据节点n4存放有键值对key:a-value:1和键值对key:b-value:2。数据节点n5存放有键值对key:c-value:3和键值对key:d-value:4。数据节点n6存放有键值对key:e-value:5和键值对key:f-value:6。这种情况下,数据节点n4的最小键为key:a与key:b中的较小值key:a,数据节点n4的哈希值为key:a-value:1与key:b-value:2拼接得到的数据的哈希值hash:H(n4)。数据节点n5的最小键为key:c与key:d中的较小值key:c,数据节点n5的哈希值为key:c-value:3与key:d-value:4拼接得到的数据的哈希值hash:H(n5)。数据节点n6的最小键为key:e与key:f中的较小值key:e,数据节点n6的哈希值为key:e-value:5与key:f-value:6拼接得到的数据的哈希值hash:H(n6)。
图1中的索引节点n2存放有其下属的数据节点n4的最小键key:a、哈希值hash:H(n4)和其下属的数据节点n5的最小键key:c、哈希值hash:H(n5)。索引节点n3存放有其下属的数据节点n6的最小键key:e、哈希值hash:H(n6)。并且,索引节点n2的最小键为key:a与key:c中的较小值key:a,索引节点n2的哈希值为hash:H(n4)与hash:H(n5)拼接得到的数据的哈希值hash:H(n2)。索引节点n3的最小键为key:e,索引节点n3的哈希值为hash:H(n6)的哈希值hash:H(n3)。
图1中的索引节点n1(即根节点n1)存放有其下属的索引节点n2的最小键key:a、哈希值hash:H(n2)和其下属的索引节点n3的最小键key:e、哈希值hash:H(n3)。
默克尔B+树中的每个节点(包括索引节点和数据节点)存放的数据可存储在磁盘中,具体可以存储于磁盘的磁盘页中。在一些实施例中,为了适应磁盘的读写策略,通常规定每个磁盘页的大小为4K。这种情况下,任意一个索引节点的数据中除了包含这个索引节点下属的每个节点的最小键和哈希值之外,还可以包含这个索引节点的页标识(identity,ID)和这个索引节点下属的每个节点的页标识。某个节点的页标识用于标识存储有这个节点的数据的磁盘页。也即,这个索引节点的页标识用于标识存储有这个索引节点的数据的磁盘页,这个索引节点下属的某个节点的页标识用于标识存储有这个索引节点下属的这个节点的数据的磁盘页。
这种情况下,若需要基于默克尔B+树进行数据处理,则需要先根据页标识将磁盘页中存储的节点数据读取到内存,在内存中对读取出的节点数据进行处理,再将处理后的节点数据存储至磁盘页,以完成对默克尔B+树的更新。
其中,在根据页标识将磁盘页中存储的节点数据读取到内存时,通常是根据页标识调用操作系统接口,由操作系统根据该页标识返回对应的磁盘页中存储的节点数据。具体来讲,操作系统在获得页标识后,是先从内核的页缓存(PageCache)中查找该页标识对应的节点数据,若查找到则直接返回查找到的节点数据,若未查找到则从该页标识对应的磁盘页中读取节点数据并返回。
上述默克尔B+树存在以下两个缺点:
1.存储压力大。
由于数据节点存放的键值对中的value值通常比较大,而每个磁盘页的大小通常为4K,所以磁盘页中的数据存储是不紧凑的,这将会带来对磁盘页的存储空间的浪费。例如,一个4K的磁盘页只能存储一个3K的value值,或者2个4K的磁盘页只能存储一个5K的value值。并且,由于数据读写只能以磁盘页为单位进行,所以对小于磁盘页大小的节点数据的读写会带来对整个磁盘页的读写,这就导致写放大会很大。
2.写树流程慢。
由于数据节点存放的键值对中的value值通常比较大,所以磁盘中存储的数据节点的数据比较大,这会导致内核的PageCache很早就到达存储瓶颈。而当内核的PageCache满了之后,后续操作系统都需要实际地去磁盘上读取节点数据,从而导致读耗时比较大,如对于HDD(Hard Disk Drive,硬盘驱动器)磁盘,一次读耗时要10ms(毫秒)左右。读耗时的增加会导致在对默克尔B+树进行更新时的耗时增加,即导致写树流程慢。
为此,本申请实施例基于键值分离的思想提出了一种新的默克尔B+树模型,可以解决上述存储压力大和写树流程慢的问题。
下面对本申请实施例提供的默克尔B+树予以说明。
图2是本申请实施例提供的一种默克尔B+树的示意图。如图2中的(a)图所示,本申请实施例中的默克尔B+树整体上采用了传统的架构,但是底层的数据节点中存放的键值对的value值不是真实的value值,而是用于指示真实的value值在预设文件中的存储位置的存储位置信息,相比于真实的value值,该存储位置信息非常小。在一些实施例中,默克尔B+树中的数据节点中不仅可以存放键值对,还可以存放真实的value值的哈希值。
如图2中的(b)图所示,真实的value值存储在预设文件中,并且,真实的value值在预设文件中可以是顺序存储的。预设文件的数量可以为一个或多个,每个预设文件的存储空间大小相同,比如,每个预设文件的存储空间大小可以大于或等于4K。在一些实施例中,可将预设文件称为valueLog文件。
具体来讲,本申请实施例提供的默克尔B+树是树数据结构,该默克尔B+树包含两种类型的节点:索引节点和处于最下层的数据节点。索引节点和数据节点均为逻辑节点。
数据节点中存放有多个键值对,每个键值对包括一个key值和一个value值,键值对中的value值不是真实的value值,而是用于指示真实的value值在预设文件中的存储位置的存储位置信息。比如,如图2中的(a)图所示,数据节点中存放有键值对“key:k1-value:存储位置信息1”和键值对“key:k2-value:存储位置信息2”。
数据节点具有最小键和哈希值。数据节点的最小键是其存放的所有键值对的key值中最小的key值。数据节点的哈希值是其存放的所有键值对对应的真实的value值的哈希值拼接得到的数据的哈希值。在一些实施例中,默克尔B+树中的数据节点中不仅可以存放键值对,还可以存放真实的value值的哈希值。比如,如图2中的(a)图所示,数据节点中存放有键值对“key:k1-value:存储位置信息1”对应的真实的value值的哈希值“hash:h1”、键值对“key:k2-value:存储位置信息2”对应的真实的value值的哈希值“hash:h2”。这种情况下,数据节点的哈希值是其存放的所有哈希值拼接得到的数据的哈希值。
索引节点中存放有其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其存放的所有节点的最小键中最小的key值,索引节点的哈希值是其存放的所有节点的哈希值拼接得到的数据的哈希值。
默克尔B+树中除根节点之外的其他节点均具有键范围。具体来讲,对于默克尔B+树中任意一层的所有节点中的任意一个节点,若这个节点是这一层的第一个节点(一般为这一层中处于最左端的节点),则这个节点的键范围为小于这一层中位于这个节点后的下一个节点的最小键的范围。若这个节点是这一层的最后一个节点(一般为这一层中处于最右端的节点),则这个节点的键范围为大于或等于这个节点的最小键的范围。若这个节点是这一层中除第一个节点和最后一个节点之外的节点,则这个节点的键范围为大于或等于这个节点的最小键且小于这一层中位于这个节点后的下一个节点的最小键的范围。
比如,默克尔B+树中某一层包括索引节点n2和索引节点n3。其中,索引节点n2存放有其下属的数据节点n4的最小键key:a、哈希值hash:H(n4)和其下属的数据节点n5的最小键key:c、哈希值hash:H(n5)。索引节点n3存放有其下属的数据节点n6的最小键key:e、哈希值hash:H(n6)。并且,索引节点n2的最小键为key:a与key:c中的较小值key:a,索引节点n2的哈希值为hash:H(n4)与hash:H(n5)拼接得到的数据的哈希值hash:H(n2)。索引节点n3的最小键为key:e,索引节点n3的哈希值为hash:H(n6)的哈希值hash:H(n3)。
这种情况下,索引节点n2为这一层的第一个节点,索引节点n2的键范围为小于索引节点n3的最小键key:e的范围,即索引节点n2的键范围为小于key:e的范围。索引节点n3为这一层的最后一个节点,索引节点n3的键范围为大于或等于索引节点n3的最小键key:e的范围,即索引节点n3的键范围为大于或等于key:e的范围。
本申请实施例提供的默克尔B+树可以达到如下效果:
1.减小存储压力。
本申请实施例提供的新型默克尔B+树中的数据节点中存放的value值极小,通常只有几个Byte(字节),如此磁盘页中的数据存储比较紧凑,这种情况下,一个磁盘页能存储很多个value值,从而可以减少磁盘页的存储空间的浪费,且可以减小写放大。另外,由于真实的value值在预设文件中是顺序存储的,因此预设文件中的数据存储也比较紧凑,从而可以节省存储空间。
2.写树流程快。
由于数据节点的数据比之前缩减很多,所以磁盘中存储的数据节点的数据相比之前也减少很多。这种情况下,内核的PageCache可以存储较多的节点数据,如此操作系统往往可以在PageCache里命中节点数据,这会比去磁盘上读取数据快几十倍。并且,由于在更新默克尔B+树时可以直接根据数据节点中存放的哈希值进行更新,无需从预设文件中读取真实的value值,所以在操作系统的读耗时减少的情况下,对默克尔B+树进行更新时的耗时也会减少,即可以加快写树流程。
下面对基于上述图2实施例所述的默克尔B+树实现的数据存储方法进行详细地解释说明。
图3是本申请实施例提供的一种数据存储方法的流程图。该方法可以应用于计算机设备,可选地,该计算机设备可以为基于默克尔B+树实现的数据库系统。参见图3,该方法包括以下步骤:
步骤301:计算机设备获取待存储的多个第一键值对。
第一键值对是需要基于默克尔B+树进行存储的键值对。该多个第一键值对是用于构建初始默克尔B+树的键值对。
该多个第一键值对可以由其他系统发送给该计算机设备。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后,会产生一系列的账本修改集,这些账本修改集可以包括需要存储的多个第一键值对。这种情况下,区块链系统中的执行模块可以将该多个第一键值对发送给该计算机设备,以指示该计算机设备基于默克尔B+树对该多个第一键值对进行存储,此时该计算机设备即可根据该多个第一键值对构建初始默克尔B+树。
步骤302:该计算机设备将该多个第一键值对中每个第一键值对的value值存储至预设文件,得到每个第一键值对的value值的存储位置信息。
预设文件是用于存储真实的value值的文件。可选地,预设文件的数量为一个或多个,一个或多个预设文件中每个预设文件的存储空间大小相同,如每个预设文件的存储空间大小均可以大于或等于4K。可选地,一个或多个预设文件是顺序创建的。一个或多个预设文件是顺序创建的体现在:在创建一个预设文件后会向这个预设文件中存储value值,直至这个预设文件的剩余存储空间不足以存储新的value值后,会再创建一个新的预设文件来存储这个新的value值,并且,新创建的预设文件的文件标识与前一个预设文件的文件标识是连续的,换句话说,可以在前一个预设文件的文件标识的基础上递增得到新创建的预设文件的文件标识。比如,前一个预设文件的文件标识为文件号1,则可以在文件号1的基础上加1,得到文件号2,将文件号2作为新创建的预设文件的文件标识。
该计算机设备获得待存储的多个第一键值对后,可以先将该多个第一键值对中每个第一键值对的value值顺序存储至预设文件,得到每个第一键值对的value值的存储位置信息。由于是将该多个第一键值对中每个第一键值对的value值顺序存储至预设文件,所以预设文件中的数据存储比较紧凑,因而可以节省存储空间。
某个value值的存储位置信息用于指示这个value值在预设文件中的存储位置,因而根据该存储位置信息可以从预设文件中获取到对应的value值。比如,某个第一键值对的value值的存储位置信息用于指示这个第一键值对的value值在预设文件中的存储位置,因而根据这个第一键值对的value值的存储位置信息可以从预设文件中获取到这个第一键值对的value值。
示例地,某个value值的存储位置信息可以包括存储这个value值的预设文件的文件标识(可称为fid)、这个value值在该预设文件中的偏移量(可称为offset)、这个value值的字节长度(可称为valueSize)。也即,某个第一键值对的value值的存储位置信息可以包括存储这个第一键值对的value值的预设文件的文件标识、这个第一键值对的value值在该预设文件中的偏移量、这个第一键值对的value值的字节长度。
其中,该存储位置信息中的fid用于指示该存储位置信息对应的value值存储在哪个预设文件中。该存储位置信息中的offset是该存储位置信息对应的value值的起始地址与这个预设文件的首地址之间的偏移量,因而该存储位置信息中的offset可以用于确定该存储位置信息对应的value值在这个预设文件中的起始地址。根据该起始地址和该存储位置信息中的valueSize可以确定该存储位置信息对应的value值在这个预设文件中的结束地址。根据该起始地址和该结束地址就可以从这个预设文件中获取到该存储位置信息对应的value值,所获取的value值即是这个预设文件中从该起始地址至该结束地址的存储位置上存储的数据。
在一些实施例中,若存在一个键值对的value值需要存储至预设文件,则在已创建的所有预设文件中最后一个预设文件的剩余存储空间足以存储这个键值对的value值的情况下,该计算机设备将这个键值对的value值存储至该最后一个预设文件;而在该最后一个预设文件的剩余存储空间不足以存储这个键值对的value值的情况下,该计算机设备创建一个新的预设文件,将这个键值对的value值存储至最新创建的预设文件。
这种情况下,在步骤302之前,该计算机设备先创建初始的一个预设文件,之后,该计算机设备在步骤302中将该多个第一键值对中每个第一键值对的value值顺序存储至预设文件。具体来讲,对于该多个第一键值对中任意的一个第一键值对,若按序需要将这个第一键值对的value值存储至预设文件,则在已创建的所有预设文件中最后一个预设文件的剩余存储空间足以存储这个第一键值对的value值的情况下,该计算机设备将这个第一键值对的value值存储至该最后一个预设文件;而在该最后一个预设文件的剩余存储空间不足以存储这个第一键值对的value值的情况下,该计算机设备创建一个新的预设文件,将这个第一键值对的value值存储至最新创建的预设文件。
步骤303:该计算机设备生成与该多个第一键值对一一对应的多个第二键值对。
一个第二键值对的key值为对应的一个第一键值对的key值,一个第二键值对的value值为对应的一个第一键值对的value值的存储位置信息。如此,根据一个第二键值对的value值就可以获知这个第二键值对对应的第一键值对的value值在预设文件中的存储位置,据此就可以从预设文件中获取到这个第二键值对应的第一键值对的value值。
值得注意的是,相比于第一键值对的value值,第二键值对的value值(即第一键值对的value值的存储位置信息)非常小。
进一步地,该计算机设备还可以获取该多个第一键值对中每个第一键值对的value值的哈希值。
步骤304:该计算机设备根据该多个第二键值对构建默克尔B+树,默克尔B+树中的数据节点包含第二键值对。
根据该多个第二键值对构建默克尔B+树,即是将该多个第二键值对存放至默克尔B+树中的数据节点。这种情况下,默克尔B+树中的数据节点中存放的value值非常小。
默克尔B+树中的数据节点包含第二键值对。数据节点具有最小键和哈希值。数据节点的最小键是其包含的所有键值对的key值中最小的key值。数据节点的哈希值是其包含的所有键值对的value值在预设文件中对应的value值的哈希值拼接得到的数据的哈希值。默克尔B+树中的索引节点包含其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其包含的所有节点的最小键中最小的key值,索引节点的哈希值是其包含的所有节点的哈希值拼接得到的数据的哈希值。
其中,该计算机设备根据该多个第二键值对构建默克尔B+树的操作与相关技术中根据多个键值对构建默克尔B+树的操作类似,本申请实施例对此不进行详细阐述。
在一些实施例中,该计算机设备可以根据该多个第二键值对和该多个第二键值对中每个第二键值对对应的第一键值对的value值的哈希值,构建默克尔B+树。
这种情况下,默克尔B+树中的数据节点不仅包含第二键值对,还包含第二键值对应的第一键值对的value值的哈希值。具体来讲,默克尔B+树中的每个数据节点包含至少一个指定数据,指定数据包括一个第二键值对和对应的一个第一键值对的value值的哈希值。默克尔B+树中的每个索引节点包含下属的每个节点的最小键和哈希值。在此情况下,不论是数据节点还是索引节点,节点的最小键为节点包含的所有key值中最小的key值,节点的哈希值为节点包含的所有哈希值拼接得到的数据的哈希值。
步骤305:该计算机设备将默克尔B+树中每个节点的数据存储至磁盘页。
需注意的一点是,在步骤304中构建默克尔B+树后,该计算机设备还可以为默克尔B+树中新生成的每个节点分配页标识,任意一个节点的页标识是后续用来存储这个节点的数据的磁盘页的页标识。这种情况下,对于任意一个索引节点,该计算机设备还可以在这个索引节点的数据中添加这个索引节点的页标识以及这个索引节点下属的每个节点的页标识。
需注意的另一点是,默克尔B+树中每个节点的数据量均小于或等于预设数据量。其中,预设数据量可以预先进行设置,如预设数据量可以与磁盘页的存储空间大小相同。
该计算机设备将默克尔B+树中每个节点的数据存储至磁盘页时,可以根据默克尔B+树中每个节点的页标识将每个节点的数据存储至对应的磁盘页中。由于默克尔B+树中的数据节点包含的value值非常小,所以磁盘页中的数据存储比较紧凑,这种情况下,一个磁盘页能存储很多个value值,从而可以减少磁盘页的存储空间的浪费,且可以减小写放大。
需要说明的是,该计算机设备将默克尔B+树中每个节点的数据存储至磁盘页后,相当于在磁盘中保存了默克尔B+树的逻辑树。这种情况下,该计算机设备还可以记录默克尔B+树中根节点的页标识,根据默克尔B+树中根节点的页标识可以从磁盘中获取到默克尔B+树中所有的节点数据,因而默克尔B+树中根节点的页标识可以与磁盘中保存的默克尔B+树的逻辑树对应。当该计算机设备后续对默克尔B+树进行更新时,每更新一次,就会在磁盘中保存默克尔B+树的一个新版本的逻辑树,且会记录与这一版本的逻辑树对应的根节点的页标识(即更新后的默克尔B+树中根节点的页标识)。这种情况下,磁盘中不仅保存有最新版本的逻辑树,还保存有至少一个历史版本的逻辑树。该计算机设备可以记录与最新版本的逻辑树对应的根节点的页标识,还可以记录与该至少一个历史版本中每个历史版本的逻辑树对应的根节点的页标识。
通过上述步骤301至步骤305,该计算机设备构建了初始的默克尔B+树,并在磁盘中保存了默克尔B+树中所有的节点数据。后续该计算机设备可以基于默克尔B+树进行数据处理,如进行数据查询、数据添加、数据更新、数据删除等操作,下面对此进行详细说明。
接下来对上述默克尔B+树的数据查询过程进行说明,此数据查询过程可以包括如下步骤(1)至步骤(3):
(1)该计算机设备接收查询指令。
该查询指令携带目标key值。该查询指令用于指示对该查询指令携带的目标key值对应的目标value值进行查询。该查询指令可以由其他系统发送给该计算机设备。比如,区块链系统中的执行模块在执行一个区块中的交易的过程中会产生一些需要查询的键,该执行模块可以将这些键作为待查询的目标key值携带于查询指令中发送给该计算机设备。
(2)该计算机设备根据目标key值获取磁盘页中存储的指定键值对。
指定键值对是默克尔B+树中的数据节点包含的key值为目标key值的键值对。指定键值对的value值是目标value值的存储位置信息,用于指示目标value值在预设文件中的存储位置。
该计算机设备记录有最新版本的逻辑树对应的根节点的页标识。该计算机设备可以先根据根节点的页标识获取对应的磁盘页中存储的根节点的数据,然后根据目标key值和根节点的数据获取磁盘页中存储的目标数据节点的数据,之后,从目标数据节点的数据中获取指定键值对。
根节点的数据包含根节点的页标识,以及包含根节点下属的每个节点的最小键和哈希值,以及包含根节点下属的每个节点的页标识。根据根节点下属的每个节点的最小键可以确定每个节点的键范围。
这种情况下,该计算机设备可以将目标key值和根节点下属的每个节点的键范围进行比对,以确定目标key值处于根节点下属的哪个节点的键范围。之后,根据根节点的数据中包含的这个节点的页标识获取对应的磁盘页中存储的这个节点的数据。
该计算机设备在通过上述方式获取到根节点下属的一个节点的数据后,若这个节点为数据节点,则该计算机设备可以确定这个数据节点为目标数据节点,此时就获取到了目标数据节点的数据,可以从目标数据节点的数据中获取key值为目标key值的键值对作为指定键值对。
而若这个节点为索引节点,则该计算机设备可以根据这个索引节点的数据,继续将目标key值与这个索引节点下属的每个节点的键范围进行比对,以确定目标key值处于这个索引节点下属的哪个节点的键范围。之后,根据这个索引节点的数据中包含的这个节点的页标识获取对应的磁盘页中存储的这个节点的数据。这种情况下,若这个节点为索引节点,则继续重复上述过程,直至确定目标key值处于某个数据节点的键范围,并获取到这个数据节点的数据为止,这个数据节点即为目标数据节点,可以从目标数据节点的数据中获取key值为目标key值的键值对作为指定键值对。
需说明的是,上述根据目标key值获取目标数据节点的数据的过程可以称为是将目标key值在默克尔B+树中从根节点分发至目标数据节点的过程。目标key值处于目标数据节点的键范围。
在一些实施例中,该计算机设备根据某个页标识获取对应的磁盘页中存储的节点数据时,是根据这个页标识将磁盘页中存储的节点数据读取到内存。可选地,该计算机设备可以根据这个页标识调用操作系统接口,由操作系统根据这个页标识返回对应的磁盘页中存储的节点数据至内存。具体来讲,操作系统在获得这个页标识后,可以先从内核的PageCache中查找这个页标识对应的节点数据,若查找到则直接返回查找到的节点数据至内存,若未查找到则从这个页标识对应的磁盘页中读取节点数据并返回至内存。
(3)该计算机设备将预设文件中位于指定键值对的value值指示的存储位置处的value值确定为目标value值。
由于指定键值对的value值用于指示目标value值在预设文件中的存储位置,所以该计算机设备可以根据指定键值对的value值从预设文件中获取对应的存储位置处的value值作为目标value值。之后,该计算机设备可以将目标value值返回给该查询指令的发送者。
接下来对上述默克尔B+树的数据删除过程进行说明,此数据删除过程可以包括如下步骤A至步骤E:
步骤A:该计算机设备接收删除指令。
该删除指令携带目标key值。该删除指令用于指示对该删除指令携带的目标key值所属的键值对进行删除。该删除指令可以由其他系统发送给该计算机设备。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后会产生一些需要删除的键,该执行模块可以将这些键作为待删除的目标key值携带于删除指令中发送给该计算机设备。
步骤B:该计算机设备根据目标key值获取磁盘页中存储的目标数据节点的数据。
目标数据节点是包含有指定键值对的数据节点,指定键值对的key值与目标key值相同。目标key值处于目标数据节点的键范围。
其中,步骤B与上述步骤(2)中该计算机设备根据目标key值获取磁盘页中存储的目标数据节点的数据的操作类似,本申请实施例对此不再赘述。
步骤C:该计算机设备从目标数据节点的数据中删除指定键值对,以更新目标数据节点。
在一些实施例中,数据节点包含指定数据,指定数据包含键值对和哈希值,该哈希值为该键值对在预设文件中对应的value值的哈希值。这种情况下,该计算机设备可以从目标数据节点的数据中删除指定目标数据,指定目标数据为指定键值对所属的指定数据,指定目标数据包含指定键值对和指定键值对在预设文件中对应的value值的哈希值。
步骤D:该计算机设备根据更新后的目标数据节点更新默克尔B+树中的索引节点。
若更新后的目标数据节点为空,即更新后的目标数据节点不包含数据,则将目标数据节点上属的索引节点的数据中指向目标数据节点的索引项(包括目标数据节点的最小键、哈希值、页标识)删除,且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点为空,则继续向上回溯更新上属的索引节点,直至更新至根节点。
若更新后的目标数据节点不为空,即更新后的目标数据节点中包含数据,则为更新后的目标数据节点分配页标识,且将更新后的目标数据节点包含的所有key值中最小的key值确定为更新后的目标数据节点的最小键,将更新后的目标数据节点包含的所有哈希值拼接得到的数据的哈希值确定为更新后的目标数据节点的哈希值。根据更新后的目标数据节点的最小键、哈希值和页标识更新默克尔B+树中的索引节点。具体来讲,根据更新后的目标数据节点的最小键、哈希值和页标识,更新目标数据节点上属的索引节点的数据中指向目标数据节点的索引项,且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。之后,为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。
步骤E:该计算机设备将更新后的目标数据节点的数据和更新后的索引节点的数据存储至磁盘页,以更新默克尔B+树。
该计算机设备可以根据更新后的目标数据节点的页标识将更新后的目标数据节点的数据存储至对应的磁盘页,且根据更新后的索引节点的页标识将更新后的索引节点的数据存储至对应的磁盘页。如此,是将默克尔B+树的最新版本的逻辑树保存在了磁盘中,这种情况下,该计算设备可以将更新后的索引节点中根节点的页标识作为与最新版本的逻辑树对应的根节点的页标识进行记录。
接下来对上述默克尔B+树的数据更新过程进行说明,此数据更新过程可以包括如下步骤a至步骤g:
步骤a:该计算机设备接收更新指令。
该更新指令携带第一目标键值对。该更新指令用于指示将第一目标键值对的key值在默克尔B+树中所属的键值对更新为第一目标键值对。该更新指令可以由其他系统发送给该计算机设备。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后会产生一些需要更新的键值对,该执行模块可以将这些键值对作为待更新的第一目标键值对携带于更新指令中发送给该计算机设备。
步骤b:该计算机设备获取第一目标键值对的value值的哈希值。
步骤c:该计算机设备将第一目标键值对的value值存储至预设文件,得到第一目标键值对的value值的存储位置信息。
其中,步骤c与上述步骤302中该计算机设备将该多个第一键值对中每个第一键值对的value值存储至预设文件,得到每个第一键值对的value值的存储位置信息的操作类似,本申请实施例对此不再赘述。
步骤d:该计算机设备生成与第一目标键值对对应的第二目标键值对。
第二目标键值对的key值为第一目标键值对的key值,第二目标键值对的value值为第一目标键值对的value值的存储位置信息。
其中,步骤d与上述步骤303中该计算机设备生成与该多个第一键值对一一对应的多个第二键值对的操作类似,本申请实施例对此不再赘述。
步骤e:该计算机设备根据第二目标键值对的key值,获取磁盘页中存储的目标数据节点的数据。
目标数据节点为包含指定键值对的数据节点,指定键值对的key值与第二目标键值对的key值相同。第二目标键值对的key值处于目标数据节点的键范围。
其中,步骤e与上述步骤(2)中该计算机设备根据目标key值获取磁盘页中存储的目标数据节点的数据的操作类似,本申请实施例对此不再赘述。
步骤f:该计算机设备将目标数据节点的数据中的指定键值对更新为第二目标键值对,以更新目标数据节点。
在一些实施例中,数据节点包含指定数据,指定数据包含键值对和哈希值,该哈希值为该键值对在预设文件中对应的value值的哈希值。这种情况下,该计算机设备可以先确定目标数据节点的数据中的指定目标数据,指定目标数据为指定键值对所属的指定数据,指定目标数据包含指定键值对和指定键值对在预设文件中对应的value值的哈希值。之后,该计算机设备将目标数据节点的数据中的指定目标数据中的指定键值对更新为第二目标键值对,将指定目标数据中的哈希值更新为第一目标键值对的value值的哈希值,以更新目标数据节点。
步骤g:该计算机设备根据更新后的目标数据节点更新默克尔B+树。
若更新后的目标数据节点的数据量小于或等于预设数据量,则无需执行数据节点分裂操作;若更新后的目标数据节点的数据量大于预设数据量,则需要执行数据节点分裂操作。其中,预设数据量可以预先进行设置,示例地,预设数据量可以为磁盘页的存储空间大小,如预设数据量可以为4K。并且,在根据更新后的目标数据节点更新了默克尔B+树中的索引节点后,若更新后的索引节点的数据量小于或等于预设数据量,则无需执行索引节点分裂操作;若更新后的索引节点的数据量大于预设数据量,则需要执行索引节点分裂操作。下面对此进行详细说明:
在一些实施例中,若更新后的目标数据节点的数据量小于或等于预设数据量,则为更新后的目标数据节点分配页标识,且将更新后的目标数据节点包含的所有key值中最小的key值确定为更新后的目标数据节点的最小键,将更新后的目标数据节点包含的所有哈希值拼接得到的数据的哈希值确定为更新后的目标数据节点的哈希值。根据更新后的目标数据节点的最小键、哈希值和页标识更新默克尔B+树中的索引节点。具体来讲,根据更新后的目标数据节点的最小键、哈希值和页标识,更新目标数据节点上属的索引节点的数据中指向目标数据节点的索引项(即目标数据节点的最小键、哈希值和页标识),且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。之后,为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。
之后,该计算机设备将更新后的目标数据节点的数据和更新后的索引节点的数据存储至磁盘页,以更新默克尔B+树。可选地,该计算机设备可以根据更新后的目标数据节点的页标识将更新后的目标数据节点的数据存储至对应的磁盘页,且根据更新后的索引节点的页标识将更新后的索引节点的数据存储至对应的磁盘页。如此,是将默克尔B+树的最新版本的逻辑树保存在了磁盘中,这种情况下,该计算设备可以将更新后的索引节点中根节点的页标识作为与最新版本的逻辑树对应的根节点的页标识进行记录。
在另一些实施例中,若更新后的目标数据节点的数据量大于预设数据量,则将更新后的目标数据节点分裂为至少两个数据节点,该至少两个数据节点中每个数据节点的数据量小于或等于预设数据量,该至少两个数据节点中每个数据节点包含至少一个指定数据,该指定数据包括键值对和该键值对在预设文件中对应的value值的哈希值。对于该至少两个数据节点中任意的一个数据节点,将这个数据节点包含的所有key值中最小的key值确定为这个数据节点的最小键,将这个数据节点包含的所有哈希值拼接得到的数据的哈希值确定为这个数据节点的哈希值,且为这个数据节点分配页标识。之后,根据该至少两个数据节点中每个数据节点的最小键、哈希值和页标识更新默克尔B+树中的索引节点。具体来讲,将目标数据节点上属的索引节点的数据中目标数据节点的索引项更新为该至少两个数据节点中每个数据节点的索引项(包括数据节点的最小键、哈希值和页标识),且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点的数据量小于或等于预设数据量,则为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。若更新后的索引节点的数据量大于预设数据量,则将更新后的索引节点分裂为至少两个索引节点,该至少两个索引节点中每个索引节点的数据量小于或等于预设数据量,该至少两个索引节点中每个索引节点包含至少一个数据节点的索引项;为该至少两个索引节点中每个索引节点分配页标识,然后根据该至少两个索引节点中每个索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。
之后,该计算机设备将该至少两个数据节点中每个数据节点的数据和更新后的索引节点的数据存储至磁盘页,以更新默克尔B+树。可选地,该计算机设备可以根据该至少两个数据节点中每个数据节点的页标识将每个数据节点的数据存储至对应的磁盘页,且根据更新后的索引节点的页标识将更新后的索引节点的数据存储至对应的磁盘页。如此,是将默克尔B+树的最新版本的逻辑树保存在了磁盘中,这种情况下,该计算设备可以将更新后的索引节点中根节点的页标识作为与最新版本的逻辑树对应的根节点的页标识进行记录。
接下来对上述默克尔B+树的数据添加过程进行说明,此数据添加过程可以包括如下步骤一至步骤七:
步骤一:该计算机设备接收添加指令。
该添加指令携带第一目标键值对。该添加指令用于指示将该添加指令携带的第一目标键值对插入默克尔B+树中。该添加指令可以由其他系统发送给该计算机设备。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后会产生一些需要添加的键值对,该执行模块可以将这些键值对作为待添加的第一目标键值对携带于添加指令中发送给该计算机设备。
步骤二:该计算机设备获取第一目标键值对的value值的哈希值。
步骤三:该计算机设备将第一目标键值对的value值存储至预设文件,得到第一目标键值对的value值的存储位置信息。
其中,步骤三与上述步骤302中该计算机设备将该多个第一键值对中每个第一键值对的value值存储至预设文件,得到每个第一键值对的value值的存储位置信息的操作类似,本申请实施例对此不再赘述。
步骤四:该计算机设备生成与第一目标键值对对应的第二目标键值对。
第二目标键值对的key值为第一目标键值对的key值,第二目标键值对的value值为第一目标键值对的value值的存储位置信息。
其中,步骤四与上述步骤303中该计算机设备生成与该多个第一键值对一一对应的多个第二键值对的操作类似,本申请实施例对此不再赘述。
步骤五:该计算机设备根据第二目标键值对的key值,获取磁盘页中存储的目标数据节点的数据。
目标数据节点为第二目标键值对在默克尔B+树中所需插入的数据节点。第二目标键值对的key值处于目标数据节点的键范围。
其中,步骤五与上述步骤(2)中该计算机设备根据目标key值获取磁盘页中存储的目标数据节点的数据的操作类似,本申请实施例对此不再赘述。
步骤六:该计算机设备在目标数据节点的数据中添加第二目标键值对,以更新目标数据节点。
在一些实施例中,数据节点包含指定数据,指定数据包含键值对和哈希值,该哈希值为该键值对在预设文件中对应的value值的哈希值。这种情况下,该计算机设备可以在目标数据节点的数据中添加指定目标数据,以更新目标数据节点,指定目标数据包括第二目标键值对和第一目标键值对的value值的哈希值。
步骤七:该计算机设备根据更新后的目标数据节点更新默克尔B+树。
其中,步骤七的操作与上述步骤g中该计算机设备根据更新后的目标数据节点更新默克尔B+树的操作类似,本申请实施例对此不再赘述。
需要说明的是,在上述基于默克尔B+树的数据修改(包括数据删除、数据更新、数据添加)过程中,该计算机设备均是根据页标识调用操作系统接口,由操作系统根据页标识返回对应的磁盘页中存储的节点数据至内存,然后该计算机设备在内存中对这些节点数据进行处理,再将处理后的节点数据存储至磁盘页,以此完成对默克尔B+树的更新。
这种情况下,由于数据节点中的value值比较小,所以减少了磁盘中存储的数据节点的数据量,因而内核的PageCache可以存储较多的节点数据,如此操作系统往往可以在PageCache里命中节点数据,这会比去磁盘上读取数据快几十倍。并且,上述在更新默克尔B+树时可以直接根据数据节点中存放的哈希值进行更新,无需从预设文件中读取value值,所以在操作系统的读耗时减少的情况下,对默克尔B+树进行更新时的耗时也会减少,即可以加快写树流程。
可选地,上述删除指令、更新指令、添加指令可以携带于一条消息中发送给该计算机设备,当然也可以分别发送给该计算机设备,本申请实施例对此不作限定。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后会产生一系列的账本修改集,这些账本修改集中可以包括需要删除的键、需要更新的键值对、需要添加的键值对中的一个或多个。执行模块可以将这些账本修改集携带于一条消息中发送给该计算机设备,也可以将按照修改类型的不同,将这些账本修改集分别携带于多条消息中发送给该计算机设备。
可选地,本申请实施例中的默克尔B+树可支持批量修改。也即,上述删除指令中可以携带待删除的多个key值,上述更新指令可以携带待更新的多个键值对,上述添加指令可以携带待添加的多个键值对。这种情况下,可以实现对默克尔B+树中节点的并发更新,下面对此进行举例说明:
示例地,在如图4所示的默克尔B+树中,包括根节点[a1,b1,c2]、索引节点[a1]、索引节点[b1]、索引节点[c2]、数据节点[a1,a2]、数据节点[b1]和数据节点[c2]。
若需要向图4所示的默克尔B+树中添加[a3]、[b2]和[c1]共3个键值对,则如图5所示,首先执行键值对的分发和合并操作。在图5中,从根节点[a1,b1,c2]出发,依次往下面的节点分发键值对,若分发到的是索引节点则继续往下分发,若分发到的是数据节点则执行键值对的合并操作。如图5所示,插入的[a3]合并入数据节点[a1,a2],将数据节点[a1,a2]更新为[a1,a2,a3]。插入的[b2]合并入数据节点[b1],将数据节点[b1]更新为[b1,b2]。插入的[c1]合并入数据节点[c2],将数据节点[c2]更新为[c1,c2]。
在完成键值对的分发和合并操作之后,接下来执行如图6所示的节点分裂操作(包括数据节点分裂操作和索引节点分裂操作)。在图6中,从底层的数据节点出发,依次往上进行分裂。如果数据节点的数据量大于预设数据量,则进行数据节点的分裂,保证分裂出的每个节点的数据量小于或等于预设数据量。可以看到,图6中的数据节点[a1,a2,a3]被分裂成[a1,a2]和[a3]两个数据节点,而数据节点[b1,b2]和数据节点[c1,c2]未分裂。接下来继续向上回溯更新,直至更新至根节点,根节点由[a1,b1,c2]更新为[a1,b1,c1]。
下面对上述默克尔B+树的数据回滚过程进行说明,此数据回滚过程可以为:该计算机设备接收回滚指令,该回滚指令携带目标根节点的页标识,该回滚指令用于指示将默克尔B+树的节点数据回滚至目标根节点的页标识对应的节点数据。该计算机设备根据目标根节点的页标识对默克尔B+树进行回滚。
该计算机设备中记录有与最新版本的逻辑树对应的根节点的页标识,还记录有与至少一个历史版本中每个历史版本的逻辑树对应的根节点的页标识。
这种情况下,该计算机设备根据目标根节点的页标识对默克尔B+树进行回滚的操作可以为:确定目标根节点的页标识对应的版本作为目标版本,然后删除记录的所有根节点的页标识中对应的版本大于目标版本的根节点的页标识,以将目标根节点的页标识对应的逻辑树作为最新版本的逻辑树。
需说明的是,在多版本控制和数据回滚方面,由于默克尔B+树相当于在磁盘中保存了多个逻辑树,当默克尔B+树需要回滚到某个版本时,只需要将当前根节点指向这个版本的逻辑树的根节点即可。
在一些实施例中,如果想要保存多个逻辑树,需要设置空闲页ID列表、待释放列表以及最大页id。假设只支持两个版本的数据回滚,当完成事务3时,最多只能回滚到事务2的状态,这相当于磁盘中只需要保存事务2和事务3对应的两个逻辑树。
如图7所示,事务1执行完后得到的默克尔B+树中的3个节点的页ID分别为1、2和3,此时事务1的最大页id为4,事务1的空闲页ID列表和待释放列表都为空。
之后,执行事务2。事务2更新完键值对后,页ID为2和3的数据节点变脏,且页ID为2的数据节点分裂成两个数据节点,由于空闲页ID列表和待释放列表都为空,所以只能用递增最大页id的方式为每个数据节点分配页ID,分配的页ID为4、5、6。数据节点更新完成后,向上回溯更新根节点,页ID为1的根节点变脏,由于空闲页ID列表和待释放列表都为空,所以只能用递增最大页id的方式为根节点分配页ID,分配的页ID为7。在事务2执行完成后,最大页id变成8,1、2、3这三个页ID被回收,回收的这三个页ID不会马上释放,即回收的这三个页ID暂时不会进入空闲页ID列表,而是先放入待释放列表。此时事务2的最大页id为8,事务2的空闲页ID列表为空,事务2的待释放列表存放有事务1的待释放页ID{1、2、3}。
当事务3开始时,由于只支持两个版本的数据回滚,所以待释放列表中的事务1的待释放页ID需要被释放,此时把1、2、3这三个页ID放到空闲页ID列表。事务3更新完键值对后,页ID为6的数据节点变脏,相应的,页ID为7的根节点也会变脏,此时可以从空闲页ID列表中取1、2这两个页ID来分配,并把6、7这两个页ID放入待释放列表中。此时事务3的最大页id为8,事务3的空闲页ID列表存放的页ID为3,事务3的待释放列表存放有事务2的待释放页ID{6、7}。
这种情况下,如果需要回滚到事务2,由于已记录事务2对应的逻辑树的根节点的页ID为7,事务2的空闲页ID列表以及待释放列表,因此只要把当前根节点指向页ID为7的根节点,并用事务2的空闲页ID列表替换当前的空闲页ID列表,用事务2的待释放列表替换当前的待释放列表即可。通过这种方式,理论上可以支持无数个版本的数据回滚。
需要说明的是,预设文件是不断顺序写的,但有个问题,当同个key值所属的键值对被更新多次,或者被删除,那么对应的value值就被废弃了,那存储这些value值的存储空间理应得到释放,因而本申请实施例提供了预设文件的GC(Garbage Collection,垃圾回收)机制,下面对此进行具体说明:
该计算机设备创建记录表,该记录表包括已创建的所有预设文件中每个预设文件的文件标识、文件大小、文件废弃大小和事务标识。需注意的是,预设文件的文件大小为预设文件中存储的value值的总大小。该记录表中对应的文件大小与文件废弃大小相同的文件标识所标识的预设文件为历史预设文件。
示例地,如下表1所示,该计算机设备可以创建一个DISCARD文件(即上文所述的记录表),里面包含多条记录,每条记录对应着一个预设文件。
表1
FID TotalSize DiscardSize Seq
文件标识 文件大小 文件废弃大小 事务标识
本申请实施例仅以上表1为例来对该记录表进行示例性说明,上表1并不对本申请实施例构成限定。
在一些实施例中,默克尔B+树中的数据节点的键值对的value值为存储位置信息,且该存储位置信息包括存储该存储位置信息对应的value值的预设文件的文件标识、该存储位置信息对应的value值在该预设文件中的偏移量、该存储位置信息对应的value值的字节长度。
这种情况下,若该计算机设备在执行一个事务后更新了默克尔B+树,则确定在执行这个事务的过程中默克尔B+树中的数据节点中被更新或被删除的键值对作为历史键值对;将该历史键值对的value值中的文件标识在该记录表中对应的文件废弃大小增加该历史键值对的value值中的字节长度,并将该历史键值对的value值中的文件标识在该记录表中对应的事务标识更新为这个事务的标识。
可以理解的,在该记录表中,某个预设文件的文件标识对应的文件废弃大小为这个预设文件存储的value值中已经基于默克尔B+树被更新或被删除的value值的大小。这个预设文件的文件标识对应的事务标识用于标识最新对这个预设文件存储的value值进行基于默克尔B+树的更新或删除的事务。
这种情况下,若该记录表中某个文件标识对应的文件大小与文件废弃大小相同,说明这个文件标识所标识的预设文件(即上文所述的历史预设文件)存储的value值均已基于默克尔B+树被更新或被删除。此时本应把该历史预设文件删除,来释放对应的存储空间,但是因为支持了多版本数据,所以不能直接删除该历史预设文件。假设在事务3开始执行时发现某个预设文件的文件标识对应的文件大小与文件废弃大小相同,但是由于支持了两个版本的数据回滚,所以此时如果把预设文件删掉,那么事务2里将无法读到这个预设文件存储的value值,也就无法正常回滚到事务2。
为此,本申请实施例中,该计算机设备在开始准备执行某个事务时,在当前待执行的这个事务的标识为一个历史预设文件的文件标识在该记录表中对应的事务标识与预设版本数量之和的情况下,再删除这个历史预设文件。其中,预设版本数量为默克尔B+树支持的回滚版本的数量。
若当前待执行的这个事务的标识为一个历史预设文件的文件标识在该记录表中对应的事务标识与预设版本数量之和,说明在开始执行这个事务后,已经不会回滚到这个历史预设文件的文件标识对应的事务标识所标识的事务了。由于这个历史预设文件的文件标识对应的事务标识用于标识最新对这个历史预设文件存储的value值进行基于默克尔B+树的更新或删除的事务,所以这个历史预设文件存储的所有value值均是不会被回滚到的历史版本的value值,因而此时可以删除这个历史预设文件,来释放对应的存储空间。
图8是本申请实施例提供的一种数据存储装置的结构示意图。该装置可以由软件、硬件或者两者的结合实现成为计算机设备的部分或者全部,该计算机设备可以为下文图9所示的计算机设备。参见图8,该装置包括:第一获取模块801、第一存储模块802、生成模块803、构建模块804、第二存储模块805。
第一获取模块801,用于获取待存储的多个第一键值对;
第一存储模块802,用于将多个第一键值对中每个第一键值对的value值存储至预设文件,得到每个第一键值对的value值的存储位置信息;
生成模块803,用于生成与多个第一键值对一一对应的多个第二键值对,一个第二键值对的key值为对应的一个第一键值对的key值,一个第二键值对的value值为对应的一个第一键值对的value值的存储位置信息;
构建模块804,用于根据多个第二键值对构建默克尔B+树,默克尔B+树中的数据节点包含第二键值对;
第二存储模块805,用于将默克尔B+树中每个节点的数据存储至磁盘页。
可选地,第一键值对的value值的存储位置信息包括存储第一键值对的value值的预设文件的文件标识、第一键值对的value值在预设文件中的偏移量、第一键值对的value值的字节长度。
可选地,该装置还包括:
接收模块,用于接收查询指令,查询指令携带目标key值;
第二获取模块,用于根据目标key值获取磁盘页中存储的指定键值对,指定键值对是默克尔B+树中的数据节点包含的key值为目标key值的键值对;
第一确定模块,用于将预设文件中位于指定键值对的value值指示的存储位置处的value值确定为目标value值。
可选地,该装置还包括:
第三获取模块,用于获取多个第一键值对中每个第一键值对的value值的哈希值;
构建模块804用于:
根据多个第二键值对和多个第二键值对中每个第二键值对对应的第一键值对的value值的哈希值,构建默克尔B+树;
其中,默克尔B+树中的每个数据节点包含至少一个指定数据,指定数据包括一个第二键值对和对应的一个第一键值对的value值的哈希值;默克尔B+树中的每个索引节点包含下属的至少一个节点中每个节点的最小键和哈希值,节点的最小键为节点包含的所有key值中最小的key值,节点的哈希值为节点包含的所有哈希值拼接得到的数据的哈希值。
可选地,该装置还包括:
接收模块,用于接收添加指令,添加指令携带第一目标键值对;
第三获取模块,用于获取第一目标键值对的value值的哈希值;
第一存储模块802,还用于将第一目标键值对的value值存储至预设文件,得到第一目标键值对的value值的存储位置信息;
生成模块803,还用于生成与第一目标键值对对应的第二目标键值对,第二目标键值对的key值为第一目标键值对的key值,第二目标键值对的value值为第一目标键值对的value值的存储位置信息;
第四获取模块,用于根据第二目标键值对的key值,获取磁盘页中存储的目标数据节点的数据,目标数据节点为第二目标键值对在默克尔B+树中所需插入的数据节点;
添加模块,用于在目标数据节点的数据中添加指定目标数据,以更新目标数据节点,指定目标数据包括第二目标键值对和第一目标键值对的value值的哈希值;
第二确定模块,用于若更新后的目标数据节点的数据量小于或等于预设数据量,则将更新后的目标数据节点包含的所有key值中最小的key值确定为更新后的目标数据节点的最小键,将更新后的目标数据节点包含的所有哈希值拼接得到的数据的哈希值确定为更新后的目标数据节点的哈希值;
第一更新模块,用于根据更新后的目标数据节点的最小键和哈希值更新默克尔B+树中的索引节点;
第二存储模块805,还用于将更新后的目标数据节点的数据和更新后的索引节点的数据存储至磁盘页。
可选地,该装置还包括:
分裂模块,用于若更新后的目标数据节点的数据量大于预设数据量,则将更新后的目标数据节点分裂为至少两个数据节点,至少两个数据节点中每个数据节点的数据量小于或等于预设数据量;
第三确定模块,用于对于至少两个数据节点中任意的一个数据节点,将一个数据节点包含的所有key值中最小的key值确定为一个数据节点的最小键,将一个数据节点包含的所有哈希值拼接得到的数据的哈希值确定为一个数据节点的哈希值;
第一更新模块,用于根据至少两个数据节点中每个数据节点的最小键和哈希值更新默克尔B+树中的索引节点;
第二存储模块805,还用于将至少两个数据节点中每个数据节点的数据和更新后的索引节点的数据存储至磁盘页。
可选地,预设文件的数量为一个或多个,一个或多个预设文件的存储空间大小相同,且一个或多个预设文件是顺序创建的;
第一存储模块802,还用于若存在一个键值对需要存储至预设文件,则在已创建的所有预设文件中最后一个预设文件的剩余存储空间足以存储一个键值对的value值的情况下,将一个键值对的value值存储至最后一个预设文件;在最后一个预设文件的剩余存储空间不足以存储一个键值对的value值的情况下,创建一个新的预设文件,将一个键值对的value值存储至最新创建的预设文件。
可选地,第一键值对的value值的存储位置信息包括存储第一键值对的value值的预设文件的文件标识、第一键值对的value值在预设文件中的偏移量、第一键值对的value值的字节长度;
该装置还包括:
创建模块,用于创建记录表,记录表包括已创建的所有预设文件中每个预设文件的文件标识、文件大小、文件废弃大小和事务标识,其中,记录表中对应的文件大小与文件废弃大小相同的文件标识所标识的预设文件为历史预设文件;
该装置还包括:
第四确定模块,用于若在执行一个事务后更新了默克尔B+树,则确定在执行一个事务的过程中默克尔B+树中的数据节点中被更新或被删除的历史键值对;
第二更新模块,用于将历史键值对的value值中的文件标识在记录表中对应的文件废弃大小增加历史键值对的value值中的字节长度,并将历史键值对的value值中的文件标识在记录表中对应的事务标识更新为一个事务的标识;
该装置还包括:
删除模块,用于若当前待执行的事务的标识为一个历史预设文件的文件标识在记录表中对应的事务标识与预设版本数量之和,则删除一个历史预设文件,预设版本数量为默克尔B+树支持的回滚版本的数量。
在本申请实施例中,将第一键值对的value值存储于预设文件,将第一键值对的value值的存储位置信息作为第二键值对的value值存放于数据节点。这种情况下,默克尔B+树中的数据节点包含的value值非常小,因而磁盘页中的数据存储比较紧凑,如此一个磁盘页能存储很多个value值,从而不仅可以减少磁盘页的存储空间的浪费,而且可以减小写放大。
需要说明的是:上述实施例提供的数据存储装置在数据存储时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
上述实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请实施例的保护范围。
上述实施例提供的数据存储装置与数据存储方法实施例属于同一构思,上述实施例中单元、模块的具体工作过程及带来的技术效果,可参见方法实施例部分,此处不再赘述。
图9为本申请实施例提供的一种计算机设备的结构示意图。如图9所示,计算机设备9包括:处理器90、存储器91以及存储在存储器91中并可在处理器90上运行的计算机程序92,处理器90执行计算机程序92时实现上述实施例中的数据存储方法中的步骤。
计算机设备9可以是一个通用计算机设备或一个专用计算机设备。在具体实现中,计算机设备9可以是台式机、便携式电脑、网络服务器、掌上电脑、移动手机、平板电脑、无线终端设备、通信设备或嵌入式设备,本申请实施例不限定计算机设备9的类型。本领域技术人员可以理解,图9仅仅是计算机设备9的举例,并不构成对计算机设备9的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,比如还可以包括输入输出设备、网络接入设备等。
处理器90可以是CPU(Central Processing Unit,中央处理单元),处理器90还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、ASIC(Application Specific Integrated Circuit,专用集成电路)、FPGA(Field-Programmable Gate Array,现成可编程门阵列)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者也可以是任何常规的处理器。
存储器91在一些实施例中可以是计算机设备9的内部存储单元,比如计算机设备9的硬盘或内存。存储器91在另一些实施例中也可以是计算机设备9的外部存储设备,比如计算机设备9上配备的插接式硬盘、SMC(Smart Media Card,智能存储卡)、SD(SecureDigital,安全数字)卡、闪存卡(Flash Card)等。进一步地,存储器91还可以既包括计算机设备9的内部存储单元也包括外部存储设备。存储器91用于存储操作系统、应用程序、引导装载程序(Boot Loader)、数据以及其他程序等。存储器91还可以用于暂时地存储已经输出或者将要输出的数据。
本申请实施例还提供了一种计算机设备,该计算机设备包括:至少一个处理器、存储器以及存储在该存储器中并可在该至少一个处理器上运行的计算机程序,该处理器执行该计算机程序时实现上述任意各个方法实施例中的步骤。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时可实现上述各个方法实施例中的步骤。
本申请实施例提供了一种计算机程序产品,当其在计算机上运行时,使得计算机执行上述各个方法实施例中的步骤。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实现上述方法实施例中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,该计算机程序包括计算机程序代码,该计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。该计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/终端设备的任何实体或装置、记录介质、计算机存储器、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、CD-ROM(Compact Disc Read-Only Memory,只读光盘)、磁带、软盘和光数据存储设备等。本申请提到的计算机可读存储介质可以为非易失性存储介质,换句话说,可以是非瞬时性存储介质。
应当理解的是,实现上述实施例的全部或部分步骤可以通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。该计算机指令可以存储在上述计算机可读存储介质中。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在本申请所提供的实施例中,应该理解到,所揭露的装置/计算机设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算机设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。

Claims (11)

1.一种数据存储方法,其特征在于,所述方法包括:
获取待存储的多个第一键值对;
将所述多个第一键值对中每个第一键值对的value值存储至预设文件,得到所述每个第一键值对的value值的存储位置信息;
生成与所述多个第一键值对一一对应的多个第二键值对,一个第二键值对的key值为对应的一个第一键值对的key值,一个第二键值对的value值为对应的一个第一键值对的value值的存储位置信息;
根据所述多个第二键值对构建默克尔B+树,所述默克尔B+树中的数据节点包含所述第二键值对;
将所述默克尔B+树中每个节点的数据存储至磁盘页。
2.如权利要求1所述的方法,其特征在于,所述第一键值对的value值的存储位置信息包括存储所述第一键值对的value值的所述预设文件的文件标识、所述第一键值对的value值在所述预设文件中的偏移量、所述第一键值对的value值的字节长度。
3.如权利要求1所述的方法,其特征在于,所述将所述默克尔B+树中每个节点的数据存储至磁盘页之后,还包括:
接收查询指令,所述查询指令携带目标key值;
根据所述目标key值获取所述磁盘页中存储的指定键值对,所述指定键值对是所述默克尔B+树中的数据节点包含的key值为所述目标key值的键值对;
将所述预设文件中位于所述指定键值对的value值指示的存储位置处的value值确定为目标value值。
4.如权利要求1所述的方法,其特征在于,所述根据所述多个第二键值对构建默克尔B+树之前,还包括:
获取所述多个第一键值对中每个第一键值对的value值的哈希值;
所述根据所述多个第二键值对构建默克尔B+树,包括:
根据所述多个第二键值对和所述多个第二键值对中每个第二键值对对应的第一键值对的value值的哈希值,构建所述默克尔B+树;
其中,所述默克尔B+树中的每个数据节点包含至少一个指定数据,所述指定数据包括一个第二键值对和对应的一个第一键值对的value值的哈希值;所述默克尔B+树中的每个索引节点包含下属的每个节点的最小键和哈希值,所述节点的最小键为所述节点包含的所有key值中最小的key值,所述节点的哈希值为所述节点包含的所有哈希值拼接得到的数据的哈希值。
5.如权利要求4所述的方法,其特征在于,所述将所述默克尔B+树中每个节点的数据存储至磁盘页之后,还包括:
接收添加指令,所述添加指令携带第一目标键值对;
获取所述第一目标键值对的value值的哈希值;
将所述第一目标键值对的value值存储至所述预设文件,得到所述第一目标键值对的value值的存储位置信息;
生成与所述第一目标键值对对应的第二目标键值对,所述第二目标键值对的key值为所述第一目标键值对的key值,所述第二目标键值对的value值为所述第一目标键值对的value值的存储位置信息;
根据所述第二目标键值对的key值,获取所述磁盘页中存储的目标数据节点的数据,所述目标数据节点为所述第二目标键值对在所述默克尔B+树中所需插入的数据节点;
在所述目标数据节点的数据中添加指定目标数据,以更新所述目标数据节点,所述指定目标数据包括所述第二目标键值对和所述第一目标键值对的value值的哈希值;
若更新后的所述目标数据节点的数据量小于或等于预设数据量,则将更新后的所述目标数据节点包含的所有key值中最小的key值确定为更新后的所述目标数据节点的最小键,将更新后的所述目标数据节点包含的所有哈希值拼接得到的数据的哈希值确定为更新后的所述目标数据节点的哈希值;
根据更新后的所述目标数据节点的最小键和哈希值更新所述默克尔B+树中的索引节点;
将更新后的所述目标数据节点的数据和更新后的所述索引节点的数据存储至所述磁盘页。
6.如权利要求5所述的方法,其特征在于,所述在所述目标数据节点的数据中添加指定目标数据,以更新所述目标数据节点之后,还包括:
若更新后的所述目标数据节点的数据量大于所述预设数据量,则将更新后的所述目标数据节点分裂为至少两个数据节点,所述至少两个数据节点中每个数据节点的数据量小于或等于所述预设数据量;
对于所述至少两个数据节点中任意的一个数据节点,将所述一个数据节点包含的所有key值中最小的key值确定为所述一个数据节点的最小键,将所述一个数据节点包含的所有哈希值拼接得到的数据的哈希值确定为所述一个数据节点的哈希值;
根据所述至少两个数据节点中每个数据节点的最小键和哈希值更新所述默克尔B+树中的索引节点;
将所述至少两个数据节点中每个数据节点的数据和更新后的所述索引节点的数据存储至所述磁盘页。
7.如权利要求1至6任意一项所述的方法,其特征在于,所述预设文件的数量为一个或多个,一个或多个预设文件的存储空间大小相同,且所述一个或多个预设文件是顺序创建的,所述方法还包括:
若存在一个键值对的value值需要存储至所述预设文件,则在已创建的所有所述预设文件中最后一个预设文件的剩余存储空间足以存储所述一个键值对的value值的情况下,将所述一个键值对的value值存储至所述最后一个预设文件;在所述最后一个预设文件的剩余存储空间不足以存储所述一个键值对的value值的情况下,创建一个新的所述预设文件,将所述一个键值对的value值存储至最新创建的所述预设文件。
8.如权利要求7所述的方法,其特征在于,所述第一键值对的value值的存储位置信息包括存储所述第一键值对的value值的所述预设文件的文件标识、所述第一键值对的value值在所述预设文件中的偏移量、所述第一键值对的value值的字节长度;
所述方法还包括:
创建记录表,所述记录表包括已创建的所有预设文件中每个预设文件的文件标识、文件大小、文件废弃大小和事务标识,其中,所述记录表中对应的文件大小与文件废弃大小相同的文件标识所标识的预设文件为历史预设文件;
所述方法还包括:
若在执行一个事务后更新了所述默克尔B+树,则确定在执行所述一个事务的过程中所述默克尔B+树中的数据节点中被更新或被删除的历史键值对;
将所述历史键值对的value值中的文件标识在所述记录表中对应的文件废弃大小增加所述历史键值对的value值中的字节长度,并将所述历史键值对的value值中的文件标识在所述记录表中对应的事务标识更新为所述一个事务的标识;
所述方法还包括:
若当前待执行的事务的标识为一个历史预设文件的文件标识在所述记录表中对应的事务标识与预设版本数量之和,则删除所述一个历史预设文件,所述预设版本数量为所述默克尔B+树支持的回滚版本的数量。
9.一种数据存储装置,其特征在于,所述装置包括:
第一获取模块,用于获取待存储的多个第一键值对;
第一存储模块,用于将所述多个第一键值对中每个第一键值对的value值存储至预设文件,得到所述每个第一键值对的value值的存储位置信息;
生成模块,用于生成与所述多个第一键值对一一对应的多个第二键值对,一个第二键值对的key值为对应的一个第一键值对的key值,一个第二键值对的value值为对应的一个第一键值对的value值的存储位置信息;
构建模块,用于根据所述多个第二键值对构建默克尔B+树,所述默克尔B+树中的数据节点包含所述第二键值对;
第二存储模块,用于将所述默克尔B+树中每个节点的数据存储至磁盘页。
10.一种计算机设备,其特征在于,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至8任意一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至8任意一项所述的方法。
CN202310111372.0A 2023-01-16 2023-01-16 数据存储方法、装置、设备和存储介质 Pending CN116301597A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310111372.0A CN116301597A (zh) 2023-01-16 2023-01-16 数据存储方法、装置、设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310111372.0A CN116301597A (zh) 2023-01-16 2023-01-16 数据存储方法、装置、设备和存储介质

Publications (1)

Publication Number Publication Date
CN116301597A true CN116301597A (zh) 2023-06-23

Family

ID=86821409

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310111372.0A Pending CN116301597A (zh) 2023-01-16 2023-01-16 数据存储方法、装置、设备和存储介质

Country Status (1)

Country Link
CN (1) CN116301597A (zh)

Similar Documents

Publication Publication Date Title
CN110321344B (zh) 关联数据的信息查询方法、装置、计算机设备及存储介质
US20170109378A1 (en) Distributed pipeline optimization for data preparation
US20200210399A1 (en) Signature-based cache optimization for data preparation
CN105320775A (zh) 数据的存取方法和装置
CN100440221C (zh) 管理文件系统的设备和方法
CN108875077B (zh) 数据库的列存储方法、装置、服务器及存储介质
CN109726177A (zh) 一种基于HBase的海量文件分区索引方法
CN102629247A (zh) 一种数据处理方法、装置和系统
CN111061752B (zh) 数据处理方法、装置及电子设备
CN111400334B (zh) 数据处理方法、装置、存储介质及电子装置
CN115840731A (zh) 文件处理方法、计算设备及计算机存储介质
CN110377276B (zh) 源代码文件管理方法及设备
CN115878027A (zh) 一种存储对象的处理方法、装置、终端及存储介质
CN112965939A (zh) 一种文件合并方法、装置和设备
CN115964002A (zh) 一种电能表终端档案管理方法、装置、设备及介质
CN103177026A (zh) 数据管理方法和数据管理系统
CN116301597A (zh) 数据存储方法、装置、设备和存储介质
CN112698866B (zh) 一种基于Git的代码行生命周期追溯方法及电子装置
CN112632266B (zh) 数据写入方法、装置、计算机设备及可读存储介质
CN112052234A (zh) 业务数据的处理方法和装置、存储介质、电子装置
CN108614838B (zh) 一种用户群索引处理方法、装置及系统
CN110888863A (zh) 一种状态字段优化方法、装置、电子设备及存储介质
CN116069788B (zh) 数据处理方法、数据库系统、计算机设备和存储介质
CN111782588A (zh) 一种文件读取方法、装置、设备和介质
CN112380174B (zh) 含删除文件的xfs文件系统解析方法、终端设备及存储介质

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