数据存储方法及节点
技术领域
本说明书一个或多个实施例涉及终端技术领域,尤其涉及一种数据存储方法及节点。
背景技术
区块链技术(也被称之为,分布式账本技术)是一种去中性化的分布式数据库技术,具有去中心化、公开透明、不可篡改、可信任等多种特点,适用于诸多对数据可靠性具有高需求的应用场景中。
发明内容
有鉴于此,本说明书一个或多个实施例提供一种数据存储方法及装置。
为实现上述目的,本说明书一个或多个实施例提供技术方案如下:
根据本说明书一个或多个实施例的第一方面,提出了一种数据存储方法,包括:
区块链节点获取待存储数据对应的第一键值对,所述第一键值对包含所述待存储数据的值和第一键;
所述区块链节点根据所述第一键在树状数据组织结构中确定出对应的叶子节点,其中所述树状数据组织结构中的非叶子节点的取值为根据下一级子节点的取值计算得到的哈希值;
所述区块链节点在确定出的叶子节点不存在关联的历史取值时,将所述待存储数据的值关联至确定出的叶子节点,使确定出的叶子节点的取值为根据所述待存储数据的值计算得到的哈希值;
所述区块链节点在确定出的叶子节点存在关联的历史取值时,对所述第一键进行修改,以将所述第一键值对更新为更新后键值对;以及,所述区块链节点将所述更新后键值对存储于确定出的叶子节点对应的冲突数据存储结构中,使确定出的叶子节点的取值为根据所述待存储数据的值和所述历史取值计算得到的哈希值。
根据本说明书一个或多个实施例的第二方面,提出了一种数据存储节点,包括:
获取单元,获取待存储数据对应的第一键值对,所述第一键值对包含所述待存储数据的值和第一键;
确定单元,根据所述第一键在树状数据组织结构中确定出对应的叶子节点,其中所述树状数据组织结构中的非叶子节点的取值为根据下一级子节点的取值计算得到的哈希值;
关联单元,在确定出的叶子节点不存在关联的历史取值时,将所述待存储数据的值关联至确定出的叶子节点,使确定出的叶子节点的取值为根据所述待存储数据的值计算得到的哈希值;
修改单元,在确定出的叶子节点存在关联的历史取值时,对所述第一键进行修改,以将所述第一键值对更新为更新后键值对;
存储单元,将所述更新后键值对存储于确定出的叶子节点对应的冲突数据存储结构中,使确定出的叶子节点的取值为根据所述待存储数据的值和所述历史取值计算得到的哈希值。
根据本说明书一个或多个实施例的第三方面,提出了一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器通过运行所述可执行指令以实现如第一方面所述的方法。
根据本说明书一个或多个实施例的第四方面,提出了一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如第一方面所述方法的步骤。
附图说明
图1是一示例性实施例提供的一种示例环境的示意图。
图2是一示例性实施例提供的一种概念架构的示意图。
图3是一示例性实施例提供的一种数据存储方法的流程图。
图4是一示例性实施例提供的一种树状数据组织结构的示意图。
图5是一示例性实施例提供的一种将值关联至叶子节点的示意图。
图6-7是一示例性实施例提供的一种将键值对记录于叶子节点对应的冲突数据存储表的示意图。
图8是一示例性实施例提供的一种设备的结构示意图。
图9是一示例性实施例提供的一种数据存储节点的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
图1是一示例性实施例提供的一种示例环境的示意图。如图1所示,示例环境100允许实体参与区块链网络102。区块链网络102可以为公有类型、私有类型或联盟类型的区块链网络。示例环境100可以包括计算设备104、106、108、110、112和网络114;在一实施例中,网络114可以包括局域网(Local Area Network,LAN)、广域网(Wide Area Network,WAN)、因特网或其组合,并连接至网站、用户设备(例如计算设备)和后端系统。在一实施例中,可以通过有线和/或无线通信方式访问网络114。
在某些情况下,计算设备106、108可以是云计算系统的节点(未显示),或者每个计算设备106、108可以是单独的云计算系统,包括由网络互连并作为分布式处理系统工作的多台计算机。
在一实施例中,计算设备104~108可以运行任何适当的计算系统,使其能够作为区块链网络102中的节点;例如,计算设备104~108可以包括但不限于服务器、台式计算机、笔记本电脑、平板电脑计算设备和智能手机。在一实施例中,计算设备104~108可以归属于相关实体并用于实现相应的服务,例如该服务可以用于对某一实体或多个实体之间的交易进行管理。
在一实施例中,计算设备104~108分别存储有区块链网络102对应的区块链账本。计算设备104可以是(或包含)用于提供浏览器功能的网络服务器,该网络服务器可基于网络114提供与区块链网络102相关的可视化信息。在一些情况下,计算设备104可以不参与区块验证,而是监控区块链网络102以确定其他节点(譬如可以包括计算设备106-108)何时达成共识,并据此生成相应的区块链可视化用户界面。
在一实施例中,计算设备104可接收客户端设备(例如计算设备110或计算设备112)针对区块链可视化用户界面发起的请求。在一些情况下,区块链网络102的节点也可以作为客户端设备,比如计算设备108的用户可以使用运行在计算设备108上的浏览器向计算设备104发送上述请求。
响应于上述请求,计算设备104可以基于存储的区块链账本生成区块链可视化用户界面(如网页),并将生成的区块链可视化用户界面发送给请求的客户端设备。如果区块链网络102是私有类型或联盟类型的区块链网络,对区块链可视化用户界面的请求可以包括用户授权信息,在生成区块链可视化用户界面并发送给请求的客户端设备之前,可以由计算设备104对该用户授权信息进行验证,并在验证通过后返回相应的区块链可视化用户界面。
区块链可视化用户界面可以显示在客户端设备上(例如可显示在图1所示的用户界面116中)。当区块链账本发生更新时,用户界面116的显示内容也可以随之发生更新。此外,用户与用户界面116的交互可能导致对其他用户界面的请求,例如显示区块列表、区块详情、交易列表、交易详情、账户列表、账户详情、合约列表、合约详情或者用户对区块链网络实施搜索而产生的搜索结果页面等。
图2是一示例性实施例提供的一种概念架构的示意图。如图2所示,该概念架构200包括实体层202、托管服务层204和区块链网络层206。例如,实体层202可以包括三个实体:实体1、实体2和实体3,每个实体都有各自的交易管理系统208。
在一实施例中,托管服务层204可以包括每个事务管理系统208对应的接口210。例如,各个事务管理系统208使用协议(例如超文本传输协议安全(HTTPS)等)通过网络(例如图1中的网络114)与各自的接口210通信。在一些例子中,每个接口210可以提供各自对应的交易管理系统208与区块链网络层206之间的通信连接;更具体地,接口210可与区块链网络层206的区块链网络212通信。在一些例子中,接口210和区块链网络层206之间的通信可以使用远程过程调用(Remote Procedure Calls,RPCs)而实现。在一些例子中,接口210可以向交易管理系统208提供用于访问区块链网络212的API接口。
如本文所述,区块链网络212以对等网络的形式提供,该对等网络包括多个节点214,这些节点214分别用于对块链数据所形成的区块链账本216进行持久化;其中,图2中仅示出了一份区块链账本216,但区块链网络212中可以存在多份区块链账本216或其副本,比如每一节点214可以分别维护一份区块链账本216或其副本。
需要指出的是:在本说明书中所描述的交易(transaction),是指用户通过区块链的客户端创建,并需要最终发布至区块链的分布式数据库中的一笔数据。其中,区块链中的交易,存在狭义的交易以及广义的交易之分。狭义的交易是指用户向区块链发布的一笔价值转移;例如,在传统的比特币区块链网络中,交易可以是用户在区块链中发起的一笔转账。而广义的交易是指用户向区块链发布的一笔具有业务意图的业务数据;例如,运营方可以基于实际的业务需求搭建一个联盟链,依托于联盟链部署一些与价值转移无关的其它类型的在线业务(比如,租房业务、车辆调度业务、保险理赔业务、信用服务、医疗服务等),而在这类联盟链中,交易可以是用户在联盟链中发布的一笔具有业务意图的业务消息或者业务请求。
图3是一示例性实施例提供的一种数据存储方法的流程图。如图3所示,该方法可以包括以下步骤:
步骤302,区块链节点获取待存储数据对应的第一键值对,所述第一键值对包含所述待存储数据的值和第一键。
在一实施例中,不论是公有链(Public Blockchain),私有链(PrivateBlockchain)、联盟链(Consortium Blockchain),还是多种类型的结合(比如私有链+联盟链、联盟链+公有链等不同组合形式),区块链网络中的节点(即区块链节点)在数据存储的过程中,可以对存储的数据按照一定形式进行组织,比如组织为树状数据组织结构等。
以公有链为例,公有链以比特币、以太坊为代表。例如,在以太坊网络中,区块链节点通过运行EVM(以太坊虚拟机),并在EVM内执行智能合约的代码,可以实现复杂的处理逻辑。智能合约的代码中定义有若干合约状态,这些合约状态的取值可以在代码被执行后发生变化。因此,以太坊网络中的区块链节点采用MPT类型的树状数据组织结构对所有合约状态的取值进行组织和存储,并将MPT的根节点处形成的根哈希记录至区块头中,以用于对合约状态及其取值进行验证。
在一实施例中,本说明书中的待存储数据可以包括上述的合约状态。当然,在其他实施例中还可以适用于其他类型的数据,比如智能合约被执行后产生的收据(receipt)等,本说明书并不对此进行限制。
在一实施例中,区块链节点上预配置有统一的键值对生成规则,可以为待存储数据的值设定相应的键。例如,区块链节点可以直接根据该键值对生成规则,为待存储数据的值设定上述的第一键。
再例如,区块链节点可以根据该键值对生成规则为待存储数据生成对应的初始键值对,该初始键值对包括待存储数据的值和初始键;然后,区块链节点可以选取初始键中特定位的字符组成第一键,且第一键的长度小于初始键,以得到上述的第一键值对。比如在以太坊中,智能合约的模型中定义了合约状态的key长度为32字节、value长度为32字节,即初始键的长度为32字节,那么第一键可以为初始键的前16字节(即上述的特定位),即第一键的长度为16字节;当然,其他实施例中可以选取其他的“特定位”,第一键的长度也可以不同,本说明书并不对此进行限制。类似地,对于前述直接根据键值对生成规则而生成第一键的实施例中,可以直接生成16字节长度的第一键。
假定在待存储数据对应的初始键值对中,待存储数据的值为32字节、初始键的长度为32字节,那么该初始键值对总共占用64字节的存储空间。而通过将初始键处理为上述的第一键,且第一键的长度为16字节,使得第一键值对总共占用48字节的存储空间,所占用的存储空间减少了16字节。在区块链节点针对更多数据进行组织和存储时,如果均采用长度相对更短的第一键,相比于采用长度相对更长的初始键或其他键,显然能够极大地减少对节点上存储空间的占用,并且有助于提升检索性能。
步骤304,所述区块链节点根据所述第一键在树状数据组织结构中确定出对应的叶子节点,其中所述树状数据组织结构中的非叶子节点的取值为根据下一级子节点的取值计算得到的哈希值。
在一实施例中,树状数据组织结构从顶部的根节点向下形成若干层,每层包含若干节点,直至形成最底部的叶子节点。每一节点的取值均为哈希值,其中:叶子节点的取值为关联数据计算得到的哈希值;非叶子节点的取值为下一级子节点的取值计算得到的哈希值,直至计算得到根节点对应的哈希值,即根哈希。因此,根据各节点的取值情况,该树状数据组织结构具有Merkle Tree(默克尔树)的特性。
在一实施例中,树状数据组织结构中的每一节点存在对应的节点标记;其中,在根节点至确定出的叶子节点构成的路径上,各个节点对应的节点标记依次组合形成的组合值等于前述的第一键。因此,区块链节点可以根据待存储数据对应的第一键,从树状数据组织结构的根节点依次向下、分别确定出每一级对应的节点,直至确定出对应的叶子节点。因此,根据路径与键之间的对应关系,该树状数据组织结构具有字典树的特性,比如具体可以采用前缀树(Trie)、压缩前缀树(Patricia trie)或类似的结构形式。
在一实施例中,树状数据组织结构可以综合前述的默克尔树与字典树的特性,譬如在基于字典树的结构的基础上,使得各节点的取值符合默克尔树的特性,从而既可以使节点路径与键相匹配,又可以从叶子节点逐步向上确定出各个节点对应的哈希值。例如,该树状数据组织结构可以为默克尔-帕特里夏树(Merkle Patricia Tree,简称MPT);或者,该树状数据组织结构可以为类似的其他结构。
步骤306a,所述区块链节点在确定出的叶子节点不存在关联的历史取值时,将所述待存储数据的值关联至确定出的叶子节点,使确定出的叶子节点的取值为根据所述待存储数据的值计算得到的哈希值。
在一实施例中,如果确定出的叶子节点尚未存在关联的历史取值,那么可以将待存储数据的值关联至该叶子节点,使得该叶子节点的取值暂时为该待存储数据的值对应的哈希值,且对于后续通过上述步骤302-304定位到该叶子节点的其他数据,该待存储数据的值相对于后续的其他数据而言是已关联至该叶子节点的历史取值,需要转至步骤306b进行处理。
步骤306b,所述区块链节点在确定出的叶子节点存在关联的历史取值时,对所述第一键进行修改,以将所述第一键值对更新为更新后键值对。
在一实施例中,由于区块链节点根据待存储数据对应的第一键确定出叶子节点,那么当该叶子节点存在关联的历史取值时,表明该历史取值对应的键与第一键相同。因此,通过对第一键进行修改,使得更新后键值对中的键区别于历史取值对应的键,以便对待存储数据与历史取值之间进行区分、避免混淆。
在一实施例中,如果第一键是由前述的初始键所含的特定位组成,那么对第一键进行修改时,可以将第一键恢复为初始键,即更新后键值对为前述的初始键值对。当然,第一键还可以被修改为其他取值,而并不一定采用上述的初始键,只要能够区别于历史取值对应的键即可,本说明书并不对此进行限制。
步骤308,所述区块链节点将所述更新后键值对存储于确定出的叶子节点对应的冲突数据存储结构中,使确定出的叶子节点的取值为根据所述待存储数据的值和所述历史取值计算得到的哈希值。
在一实施例中,如果待存储数据确定出的叶子节点已经存在关联的历史取值,表明该待存储数据与历史取值之间发生了数据冲突。但是,每个叶子节点只能够与一个取值建立关联,因而通过为每一叶子节点分别设定对应的冲突数据存储结构,使得发生数据冲突的情况下,可以将数据存储于该冲突数据存储结构中,该冲突数据存储结构中的数据不存在数量限制,并且存储于该冲突数据存储结构中的数据均被确定为与相应的叶子节点之间建立关联,从而对叶子节点可关联的数据实现了数量扩展。因此,当某一键值对被存储于冲突数据存储结构时,相当于该键值对中的值被间接关联至相应的叶子节点。
在一实施例中,根据待存储数据确定出的叶子节点,对应的历史取值可以包括在历史时刻直接关联至该叶子节点的历史值,也可以包括在历史时刻记录于冲突数据存储结构中的历史键值对。其中,历史键值对所含的历史键应当区别于上述更新后键值对所含的键。
其中,当仅存在一个历史取值时,该历史取值通常是直接关联至叶子节点的历史值;当然,本说明书并不排除该历史取值可能是位于冲突数据存储结构中的历史键值对。当存在多个历史取值时,多个历史取值可以均为位于冲突数据存储结构中的历史键值对;或者,最早的一条历史取值为直接关联至叶子节点的历史值,而其他历史取值均为位于冲突数据存储结构中的历史键值对。
在一实施例中,当同时存在直接关联至叶子节点的历史取值和存储于数据存储结构中的键值对(历史键值对和/或上述的更新后键值对)时,除非预先定义了这些数据之间的顺序,否则在基于这些数据生成叶子节点对应的哈希值时,不同顺序可能导致不同的哈希值,即哈希值不是稳态的。
因此,区块链节点可以删除确定出的叶子节点被关联的历史值,并将该历史值对应的第二键值对记录于冲突数据存储结构中;其中,第二键值对包含历史值和第二键,且第二键区别于冲突数据存储结构中的其他键值对所含的键。那么,由于冲突数据存储结构中的所有键值对之间按照预设顺序进行依次排列,比如按照数值生成顺序、键的数值大小顺序等,可以确保按照该顺序排列并生成相应叶子节点的哈希值,因而可以得到稳态哈希值。
在一实施例中,冲突数据存储结构可以为树状数据组织结构,比如默克尔树等。或者,冲突数据存储结构可以为表格结构。或者,可以采用其他形式的冲突数据存储结构,本说明书并不对此进行限制。
图4是一示例性实施例提供的一种树状数据组织结构的示意图。假定区块链节点采用如图4所示的树状数据组织结构,该树状数据组织结构的顶部为根节点41、其他层级包含若干节点,比如根节点41的子节点包括节点421、节点422等,节点421的子节点包括节点431、节点432等,底层为若干叶子节点,如节点441、节点442和节点443等。除了叶子节点之外,其他的每一节点分别存在一个或多个子节点,子节点的数量根据实际情况而定,本说明书并不对此进行限制。
如前所述,树状数据组织结构继承了字典树的特性,可以通过路径表征相应键值对的键。例如,根节点41对应的节点标记为a、节点421对应的节点标记为5、节点422对应的节点标记为7、节点431对应的节点标记为1、节点432对应的节点标记为2、节点441对应的节点标记为1、节点442对应的节点标记为5、节点443对应的节点标记为f等。假定叶子节点441对应于节点431,那么从根节点41至节点441可以形成路径a-5-1-……-1。假定叶子节点442对应于节点432,那么从根节点至节点442可以形成路径a-5-2-……-5。假定叶子节点443对应于节点432,那么从根节点至节点443可以形成路径a-5-2-……-f。
如前所述,树状数据组织结构继承了默克尔树的特性,每个节点的取值为哈希值。对于叶子节点而言,哈希值由叶子节点所关联的数值计算得到。例如,节点441的取值为哈希值Hn-1,该哈希值Hn-1为:关联至该节点441的数值计算出的哈希值;节点442的取值为哈希值Hn-2,该哈希值Hn-2为:关联至该节点442的数值计算出的哈希值;节点443的取值为哈希值Hn-3,该哈希值Hn-3为:关联至该节点443的数值计算出的哈希值。而对于非叶子节点而言,哈希值由节点下一级的子节点的取值计算得到。例如,根节点41的取值为哈希值Hr,且根节点41下一级的节点为节点421和节点422,那么该哈希值Hr为:根据节点421的取值与节点422的取值计算得到的哈希值,比如将节点421对应的哈希值H1-1与节点422对应的哈希值H1-2拼接为一字符串,并将该字符串计算出的哈希值作为上述的哈希值Hr。再例如,节点421的取值为哈希值H1-1,且节点421下一级的节点为节点431和节点432,那么该哈希值H1-1为:根据节点431的取值与节点432的取值计算得到的哈希值,比如将节点431对应的哈希值H2-1与节点432对应的哈希值H2-2拼接为一字符串,并将该字符串计算出的哈希值作为上述的哈希值H1-1。
区块链节点通过执行某一交易调用的智能合约后,假定该智能合约中定义的合约状态Z1发生了取值变化,区块链节点需要将该合约状态Z1的取值存储至如图4所示的树状数据组织结构中。区块链节点首先为该合约状态Z1生成对应的键值对。
对于以太坊网络而言,如前所述,区块链节点生成的键值对中的key为32字节、value为32字节。而在本说明书中,区块链节点可以首先采用类似的方式生成初始键值对,包括初始键K1’、值value为V1,即键值对为K1’-V1,其中K1’的长度为32字节、V1的长度为32字节。然后,区块链节点可以对初始键K1’进行转换,比如截取前16字节,形成新的键K1,构成新的键值对K1-V1。那么,区块链节点在存储该合约状态Z1时,键值对K1-V1仅需占用48字节的存储空间,而非键值对K1’-V1所需占用的64字节。
针对合约状态Z1的键值对K1-V1,区块链节点根据K1在如图4所示的树状数据组织结构中确定相应的叶子节点。例如,当K1的取值为a52……f时,假定该K1的取值匹配于根节点41至叶子节点443的路径,那么可以确定K1对应于叶子节点443。
假定此前并不存在已关联至叶子节点443的历史取值,区块链节点可以将合约状态Z1的取值V1直接关联至叶子节点443,如图5所示。此时,节点443对应的哈希值Hn-i是通过对取值V1进行哈希计算得到。
在针对合约状态Z1进行存储之后,假定区块链节点通过执行某一交易调用的智能合约后,该智能合约中定义的合约状态Z2发生了取值变化,区块链节点需要将该合约状态Z2的取值存储至如图5所示的树状数据组织结构中。
对合约状态Z2的存储过程,与上述合约状态Z1的存储过程类似。区块链节点为合约状态Z2生成初始键值对K2’-V2,然后将初始键K2’的前16字节截取为新的键K2,并组成合约状态Z2的键值对K2-V2。然后,区块链节点根据键K2从如图5所示的树状数据组织结构中确定对应的叶子节点。
假定K2的取值为a52……f,与上述的K1恰好相同,区块链节点可以据此确定出相应的叶子节点为节点443。那么,对于合约状态Z2而言,节点443已经存在相关联的历史取值,即上文被关联至节点443的历史值V1。因此,对合约状态Z2的存储过程,区别于前文对合约状态Z1的存储过程。
区块链节点可以为节点443创建对应的冲突数据存储表,例如该冲突数据存储表可以如图6所示。区块链节点可以在节点443被创建时,就随之创建了冲突数据存储表;或者,区块链节点可以在发生数据冲突的情况下,比如上文中在存储合约状态Z2的过程中,临时创建冲突数据存储表。
区块链节点的处理过程包括两个方面:第一方面,区块链节点将关联至节点443的历史取值V1删除。第二方面,区块链节点将合约状态Z1对应的键值对恢复为初始键值对K1-V1、将合约状态Z2对应的键值对恢复为初始键值对K2-V2,并将初始键值对K1-V1、K2-V2分别存储至节点443对应的冲突数据存储表中。例如图6所示,冲突数据存储表的主键可以包括“键”和“值”,区块链节点可以相应地写入K1-V1、K2-V2。冲突数据存储表的主键还可以包括“冲突数量”,区块链节点可以记入发生冲突的键值对的总量,比如此处为2。
类似地,当区块链节点后续再次生成匹配于叶子节点443的合约状态Z3时,由于键值对K1-V1、K2-V2已经存储于节点443对应的冲突数据存储表中,因而如图7所示,只需要确定出合约状态Z3对应的初始键值对K3-V3,并将该键值对K3-V3记入节点443对应的冲突数据存储表即可。区块链节点还将“冲突数量”的取值更新为3。
在冲突数据存储表中,各条键值对之间按照预设顺序进行依次排列。比如该顺序可以包括键值对的生成顺序。因此,在所有区块链节点分别将键值对K1-V1、K2-V2、K3-V3插入冲突数据存储表时,可以确保每个区块链节点都是将键值对K1-V1排列在先、键值对K2-V2排列在后、键值对K3-V3排列在最后,而节点443对应的哈希值Hn-i均是通过将取值V1、V2、V3按照V1→V2→V3的顺序拼接后进行哈希计算得到,而不会按照V2→V1→V3或其他顺序进行拼接,确保所有区块链节点计算出的哈希值Hn-i取值均相同。
综上所述,本说明书的技术方案可以支持较短长度的key,并且在发生数据冲突的情况下,通过为叶子节点配置相应的冲突数据存储结构,即可记下匹配于该叶子节点的所有键值对,并对各个键值对进行有效区分。实际上,即便是采用上文所述的16字节长度的key,不同合约状态之间产生相同key的概率也极低,因而对于绝大部分的键值对而言,均因采用较短长度的key而为节点节省了大量的存储空间。
图8是一示例性实施例提供的一种设备的示意结构图。请参考图8,在硬件层面,该设备包括处理器802、内部总线804、网络接口806、内存808以及非易失性存储器810,当然还可能包括其他业务所需要的硬件。处理器802从非易失性存储器810中读取对应的计算机程序到内存808中然后运行,在逻辑层面上形成数据存储节点。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
请参考图9,在软件实施方式中,该数据存储节点可以包括:
获取单元91,获取待存储数据对应的第一键值对,所述第一键值对包含所述待存储数据的值和第一键;
确定单元92,根据所述第一键在树状数据组织结构中确定出对应的叶子节点,其中所述树状数据组织结构中的非叶子节点的取值为根据下一级子节点的取值计算得到的哈希值;
关联单元93,在确定出的叶子节点不存在关联的历史取值时,将所述待存储数据的值关联至确定出的叶子节点,使确定出的叶子节点的取值为根据所述待存储数据的值计算得到的哈希值;
修改单元94,在确定出的叶子节点存在关联的历史取值时,对所述第一键进行修改,以将所述第一键值对更新为更新后键值对;
存储单元95,将所述更新后键值对存储于确定出的叶子节点对应的冲突数据存储结构中,使确定出的叶子节点的取值为根据所述待存储数据的值和所述历史取值计算得到的哈希值。
可选的,获取单元91具体用于:
获取所述待存储数据对应的初始键值对,所述初始键值对包括所述待存储数据的值和初始键;
选取所述初始键中特定位的字符组成所述第一键,且所述第一键的长度小于所述初始键,以得到所述第一键值对。
可选的,所述更新后键值对为所述初始键值对。
可选的,所述树状数据组织结构中的每一节点存在对应的节点标记;其中,在根节点至确定出的叶子节点构成的路径上,各个节点对应的节点标记依次组合形成的组合值等于所述第一键。
可选的,所述历史取值包括:在历史时刻记录于所述冲突数据存储结构中的历史键值对;其中,所述历史键值对所含的历史键区别于所述更新后键值对所含的键。
可选的,所述历史取值包括:在历史时刻被关联至确定出的叶子节点的历史值。
可选的,还包括:
删除单元96,删除确定出的叶子节点被关联的历史值;
记录单元97,将所述历史值对应的第二键值对记录于所述冲突数据存储结构中,所述第二键值对包含所述历史值和第二键,且所述第二键区别于所述冲突数据存储结构中的其他键值对所含的键。
可选的,所述冲突数据存储结构中的所有键值对之间按照预设顺序进行依次排列。
可选的,所述冲突数据存储结构为树状数据组织结构或表格结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。