CN112306991A - 一种树形结构中数据的处理方法及装置、设备、存储介质 - Google Patents

一种树形结构中数据的处理方法及装置、设备、存储介质 Download PDF

Info

Publication number
CN112306991A
CN112306991A CN202011192840.4A CN202011192840A CN112306991A CN 112306991 A CN112306991 A CN 112306991A CN 202011192840 A CN202011192840 A CN 202011192840A CN 112306991 A CN112306991 A CN 112306991A
Authority
CN
China
Prior art keywords
node
data
key
key value
primary
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
CN202011192840.4A
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.)
WeBank Co Ltd
Original Assignee
WeBank 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 WeBank Co Ltd filed Critical WeBank Co Ltd
Priority to CN202011192840.4A priority Critical patent/CN112306991A/zh
Publication of CN112306991A publication Critical patent/CN112306991A/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/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/21Design, administration or maintenance of databases
    • G06F16/214Database migration support
    • 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/23Updating
    • G06F16/2308Concurrency control
    • G06F16/2336Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
    • G06F16/2343Locking methods, e.g. distributed locking or locking implementation details

Landscapes

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

Abstract

本申请实施例公开了一种树形结构中数据的处理方法及装置、设备、存储介质,其中,该方法包括:获取操作请求的主键的键值;将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。

Description

一种树形结构中数据的处理方法及装置、设备、存储介质
技术领域
本申请实施例涉及但不限于金融科技(Fintech)的信息技术,尤其涉及一种树形结构中数据的处理方法及装置、设备、存储介质。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,然而,由于金融行业的安全性、实时性要求,金融科技也对技术提出了更高的要求。金融科技领域下,通过共享锁(即读锁,读-读不会产生操作阻塞,读-写会产生操作阻塞)、互斥锁(即写锁,读-写会产生操作阻塞,写-写会产生操作阻塞)和共享互斥锁(即介于读锁与写锁之间的锁,读-写不会产生操作阻塞,在写并发冲突时可升级为互斥锁)相互配合,一定程度上减少了线程并发操作的阻塞等待。然而,相关技术中涉及的锁存在以下问题:一是读写操作在访问目标节点的时候,都需要对目标节点路径上的所有节点进行依次的加锁与解锁,这里,所述目标节点路径为树根节点到目标节点的路线,在高并发的场景下,这种频繁加锁与解锁操作,会随着数据量的增加,引发越来越较高的性能消耗,从而降低内存索引的处理性能;二是三种锁的控制粒度都是节点级别,而树形结构具有一节点包含多元素的属性,这就导致控制粒度越粗,并发性能也越低;此外,这三种锁都是根据操作系统的线程挂起来实现的,而线程的挂起操作会造成操作系统的用户态和内核态切换,导致高性能消耗。
发明内容
有鉴于此,本申请实施例为解决相关技术中存在的至少一个问题而提供一种树形结构中数据的处理方法及装置、设备、存储介质。
本申请实施例的技术方案是这样实现的:
一方面,本申请实施例提供一种树形结构中数据的处理方法,所述方法包括:获取操作请求的主键的键值;将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
又一方面,本申请实施例提供一种树形结构中数据的处理装置,所述装置包括:获取模块,用于获取操作请求的主键的键值;比较模块,用于将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;迁移模块,用于在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;处理模块,用于在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
再一方面,本申请实施例提供一种树形结构中数据的处理设备包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法中的步骤。
还一方面,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法中的步骤。
本申请实施例提供的树形结构中数据的处理方法,一方面,在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移,这样,能够通过对节点添加节点锁,保证对节点的数据分裂操作的数据安全性。另一方面,在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理,这样,能够在对目标节点的数据进行操作的场景中,与节点锁相比,通过数据行锁是一种轻量级、细粒度的锁,对数据行加锁操作进行细粒度控制,避免对节点加锁这种较粗粒度的锁操作,减少了锁的数量。进一步地,数据行锁的使用,避免了对大量数据进行操作时由于粗粒度的锁操作引发的高性能的消耗,从而提升了对树形结构中数据处理的并发性能,避免了使用非轻量级锁时因操作系统中的线程挂起导致的用户态和内核态的切换,进一步避免了切换内核时的性能消耗。
附图说明
图1A为本申请实施例树形结构中数据的处理方法的实现流程示意图;
图1B为本申请实施例T型树形结构中节点的数据结构示意图;
图1C为本申请实施例三种不同形态的树形结构示意图;
图1D为本申请实施例树形结构中节点的数据结构示意图;
图2A为本申请实施例树形结构中数据的处理方法的实现流程示意图;
图2B为本申请实施例树形结构中数据的处理方法的实现流程示意图;
图2C为本申请实施例树形结构中数据的处理方法的实现流程示意图;
图3A为相关技术中T树节点数据结构示意图;
图3B为相关技术中T树形结构示意图;
图4为本申请实施例树形结构中数据的处理方法的锁控制粒度示意图;
图5为本申请实施例树形结构中数据的处理方法的节点数据结构示意图;
图6为本申请实施例树形结构中数据的处理装置的组成结构示意图;
图7为本申请实施例中计算机设备的一种硬件实体示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面结合附图和实施例对本申请的技术方案进一步详细阐述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
如果申请文件中出现“第一/第二”的类似描述则增加以下的说明,在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
下面结合附图和实施例对本申请的技术方案进一步详细阐述。
本申请实施例提供一种树形结构中数据的处理方法,图1A为本申请实施例树形结构中数据的处理方法的实现流程示意图,如图1A所示,该方法包括:
步骤S101,获取操作请求的主键的键值;
这里,所述操作请求可以为读操作请求,也可以为写操作请求。在一些实施例中,所述写操作请求可以为由于待写入的节点空间已满而执行的分裂操作,也可以为对待写入的节点的数据行进行的数据的更新操作。
在一些实施例中,所述待写入、待读取的数据常常以键值对的形式进行存储,因此,执行所述操作请求时,需要根据键值进行操作。
步骤S102,将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;
这里,所述树形结构可以为T树,所述T树是平衡二叉树的变体,平衡条件与平衡二叉树一致,即左右子树的高度差不能超过1,与平衡二叉树的区别在于,平衡二叉树的节点内容纳一个元素,而T树的节点内是一个链表,可以容纳更多的元素。这里,所述元素以键值的形式进行存储。
在一些实施例中,所述节点的键值可以是一个范围,将所述主键的键值与节点的键值进行比较,可以为判断所述主键的键值是否在所述节点键值的范围内。在所述主键的键值在所述节点键值的范围内情况下,可以在所述节点的链表内查询到对应的数据,因此,确定所述节点为操作请求要操作的目标节点。
在另一些实施例中,所述树形结构可以为平衡二叉树,所述节点内容纳一个元素,所述将所述主键的键值与节点的键值进行比较,可以为判断所述主键的键值是否与节点的键值相等。在所述主键的键值与节点的键值相等的情况下,确定节点为操作请求要操作的目标节点。
步骤S103,在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;
这里,所述分裂操作为对节点上的数据进行拆分的操作,通过所述分裂操作可以将所述节点上的数据拆分到两个节点上,即将所述节点的数据拆分到所述节点与分裂节点上。
这里,所述节点锁用于对节点加锁,属于粗粒度的锁,控制每个节点的操作,包含互斥锁,用于保证并发操作时的数据安全性。
步骤S104,在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
这里,所述更新操作的对象为所述节点的数据行,对所述数据行进行操作时,为保证多个线程读取同一对象数据的数据一致性,需要在对数据行进行更新操作之前,激活所述目标节点的数据行锁。
这里,需要说明的是,数据行锁与节点锁控制粒度依次增大。
本申请实施例提供的树形结构中数据的处理方法,一方面,在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移,这样,能够通过对节点添加节点锁,保证对节点的数据分裂操作的数据安全性。另一方面,在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理,这样,能够在对目标节点的数据进行操作的场景中,与节点锁相比,通过数据行锁是一种轻量级、细粒度的锁,对数据行加锁操作进行细粒度控制,避免对节点加锁这种较粗粒度的锁操作,减少了锁的数量。进一步地,数据行锁的使用,避免了对大量数据进行操作时由于粗粒度的锁操作引发的高性能的消耗,从而提升了对树形结构中数据处理的并发性能,避免了使用非轻量级锁时因操作系统中的线程挂起导致的用户态和内核态的切换,进一步避免了切换内核时的性能消耗。
本申请实施例提供一种树形结构中数据的处理方法,该方法包括:
步骤S110,获取操作请求的主键的键值;
步骤S120,将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;
步骤S130,在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;
步骤S140,在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
其中,所述目标节点的数据行包括线程ID和操作在途状态,所述数据行锁至少包括:偏锁、旋锁和等待锁。
这里,所述节点的数据行存储在节点的数据域,所述数据行可以包括多个字段,例如,可以包括:线程ID(thread_id)、操作在途状态(on_way)和数据(data)等。
这里,所述偏锁简称B锁,通过目标数据行记录下某个线程的ID,声明该数据行属于此线程,之后该线程再对此数据行做操作,不用加锁。属于最轻量的锁,性能消耗可以忽略不计。
这里,所述旋锁简称O锁,通过对比交换(Compare and Swap,CAS)+版本号控制多个线程同时对目标数据行的操作,每次抢占到目标数据行控制权,则执行对应操作,操作成功,目标数据行版本号递增1,如果操作失败,则重新获取目标数据行数据与最新版本号,根据最新版本号重新做操作。抢夺控制权失败的线程则在数据行外部轮询等待。属于中等级别的锁,会消耗少量的CPU性能。
这里,所述等待锁简称W锁,通过底层操作系统,对写线程进行挂起等待处理,直到唤醒后再尝试继续操作。会造成操作系统用户态与内核态的切换,性能开销比较大。
在一些实施例中,所述步骤S140,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理,包括:
步骤S141,在所述线程ID为空且所述操作在途状态字段为否的情况下,通过激活的偏锁对所述目标节点的数据行进行处理;
在一些实施例中,所述线程ID为空表征当前无线程使用所述数据行,即所述数据行不用于记录任一线程产生的数据;所述操作在途状态字段为否表征当前无线程正在对数据行做操作,因此,此时可直接对数据行进行操作。默认此时的状态为偏锁激活状态,确定为偏锁激活状态后,通过CAS将当前线程的线程ID记录到所述数据行的thread_id字段中,即声明所述数据行属于此线程ID,同时将on_way字段设置为Y,表明此时有线程正在对所述数据行做操作,完成更新操作后,再将所述数据行的on_way字段设置为N,表明此时没有线程正在对主存中所述数据行做操作。
在一些实施例中,在所述线程ID为非空的情况下,则判断主存中所述数据行的thread_id与当前线程的线程ID是否相同。1)在主存中所述数据行的thread_id与当前线程的线程ID相同的情况下,则直接对所述数据行执行操作,不用任何加锁操作,同时将on_way字段设置为Y,表明此时有线程正在对所述数据行做操作,完成操作后,再将所述数据行的on_way字段设置为N,表明此时没有线程正在对所述数据行做操作。
2)在主存中所述数据行的thread_id与当前线程的线程ID不相同的情况下,则判断主存中所述数据行的on_way字段是否为N,如果是N,即说明此时没有线程正在对所述数据行进行操作,则执行偏锁的重定向,将主存中所述数据行的thread_id通过CAS更新为当前线程的线程ID,同时将on_way字段设置为Y,表明此时有线程正在对所述数据行做操作,完成更新操作后,再将所述数据行的on_way字段设置为N,表明此时没有线程正在对所述数据行做操作。
步骤S142,在所述目标节点的数据行的线程ID与请求主键键值的ID不同且操作在途状态字段为是的情况下,通过激活的旋锁对所述目标节点的数据行进行处理;
这里,所述操作在途状态字段为是说明此时有线程正在对目标数据行进行操作,则对数据行执行锁升级,采用旋锁操作。
这里,实现所述旋锁操作,需要在所述数据行中新增标记字段version来实现旋锁,旋锁是根据主存内数据行实际版本号与操作线程内数据行预期版本号相对比,如果匹配相同,则对主存内数据行执行操作,同时将数据行版本号递增1,如果版本号匹配不相同,则重新获取主存内数据行的最新内容与最新版本号,最新内容作为操作的基础内容,最新版本号作为操作线程内数据行的新预期版本号,再次做匹配执行操作,没有抢夺到旋锁的线程,在目标数据行外轮询等待,循环时会消耗少量CPU性能。
在一些实施例中,采用旋锁操作后,想要操作此数据行的线程,需要先不断轮询主存内目标数据行,直到目标数据行on_way字段变为N,再开始竞争目标数据行,一旦有一个线程最先将目标数据行的on_way字段设置为Y,并将thread_id更新为自己的线程ID,则说明此线程获得了目标数据行的控制权,此时根据主存内目标数据行实际版本号与当前获得控制权的线程内目标数据行预期版本号相对比,如果匹配相同,则对主存中数据行执行操作,同时将数据行版本号递增1,如果版本号不匹配,则重新查询获取主存中数据行的最新值与最新版本号,最新值作为更新操作的原始值,最新版本号作为操作线程内数据行的新预期版本号,然后再次做匹配,执行更新操作。
在一些实施例中,完成对数据行的操作后,需要将目标数据行的on_way字段设置为N,表明此时没有线程正在对数据行做操作。
在一些实施例中,执行完所述更新操作后,将on_way字段设置为N,释放旋锁,结束操作,并唤醒可能处于挂起等待状态的其他想要操作此数据行的线程,使得所述线程抢夺所述数据行的控制权。当并发线程全部处理完毕,则目标数据行的锁自动降级为偏锁,将所述锁类型从中等量级的旋锁转化为轻量级的偏锁,节约性能消耗。
步骤S143,在所述旋锁执行的轮询所述数据行的次数超过预先设定的阈值的情况下,通过激活的等待锁对所述目标节点的数据行进行处理。
在一些实施例中,由于所述旋锁属于中等量级的锁子,且会通过轮询的方式,以耗费少量CPU性能为代价,等待操作机会,但是如果某一数据行的并发程度处于异常超高状态,且当前处理中的线程操作比较耗时,会造成大量的请求线程堆积,空耗CPU进行等待,从而使打满CPU负载,会造成得不偿失的性能损失。所以,在所述旋锁执行的轮询所述数据行的次数超过预先设定的阈值的情况下,需要将所述旋锁升级为等待锁。例如,可以当一个线程轮询目标数据行的次数超过20次的时候,则升级为等待锁。当激活所述等待锁后,可以通过操作系统使写线程进入挂起等待状态,释放CPU资源,直到处理中的线程释放目标数据行的控制权,唤醒等待状态中的线程参与新一轮的目标数据行的控制权竞争。避免保持旋锁的轮询状态,导致的占用大量CPU资源。
在一些实施例中,当唤醒等待状态中的线程参与新一轮的目标数据行的控制权竞争时,所述等待锁降级为旋锁,得到控制权的线程进入目标数据行进行操作,其他被唤醒的竞争线程重新开始轮询等待;当所有的线程处理完毕,目标数据行的锁再次降级为偏锁。
这里,需要说明的是,由于等待锁的触发会造成操作系统用户态和内核态的切换,会造成较大的资源开销,所以属于重量级的锁,只有在多线程并发程度最严重的时候才启用,而实际系统运行中,此类极端情况一般偏少,绝大部分时间通过偏锁和旋锁,以微小性能开销为代价,便可解决多线程并发安全问题,从而提高改进树形结构中数据处理的并发性能。
这里,需要说明的是,偏锁、旋锁、等待锁,性能消耗等级依次递增。
本申请实施例提供的树形结构中数据的处理方法,一方面,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理,这样,可以使用偏锁通过目标数据行记录下线程的ID,声明该目标数据行属于此线程,那么当该目标数据行再次遇到相同线程ID的线程时,可以直接操作,而不用做任何加锁的操作。并且,偏锁在性能消耗方面极低,基本可以忽略不计。另一方面,在所述目标节点的数据行的线程ID与请求主键键值的ID不同且操作在途状态字段为是的情况下,通过激活的旋锁对所述目标节点的数据行进行处理,这样,能够在有线程对目标数据行进行操作时,将偏锁升级为旋锁,不断轮询目标数据行,无线程对目标数据行进行操作时,开始竞争目标数据行以保证数据的安全性。此外,通过在所述旋锁执行的轮询所述数据行的次数超过预先设定的阈值的情况下,通过激活的等待锁对所述目标节点的数据行进行处理,这样,可以通过操作系统使线程进入挂起等待状态,释放CPU资源,直到处理中的线程释放目标数据行的控制权,唤醒等待状态中的线程参与新一轮的目标数据行的控制权竞争。如此,可以通过目标数据行被线程访问的不同状态,进行不同级别性能消耗的锁处理,节约锁的性能开销和CPU资源,提高了树形结构中数据的处理性能。
本申请实施例提供一种树形结构中数据的处理方法,该方法包括:
步骤S210,获取操作请求的主键的键值;
步骤S220,将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点,其中,所述树形结构中每一节点的数据结构至少包括:一级索引;其中,所述一级索引存储空间是CPU缓存行存储空间的整数倍;
这里,所述缓存行(CACHE_LINE):CPU内高速缓存的存储最小单位与操作最小单位,缓存行是2的整数幂个连续字节,一般取值范围为32-256个字节。例如,Linux系统中缓存行大小默认是64字节。
这里,需要说明的是,相关技术中会存在将至少两个节点的数据存储在一个缓存行的情况,因此,在一个缓存行数据被多核CPU处理的情况下,其中一个核心对缓存行中的数据进行加锁解锁操作,进行数据更新时,会导致其他核心缓存数据与更新好的数据不一致的问题,从而导致其他核心高速缓存中的数据缓存失效,缓存频繁失效后,会使得所述高速缓存的数据有效性不高,使高速缓存功能无法被有效利用,使得系统性能严重下滑。
这里,所述一级索引存储空间是CPU缓存行存储空间的整数倍,可以保证要给节点的属于存储在一个缓存行中,可以避免至少两个节点的数据存储在一个缓存行时引发的高速缓存功能无法被有效利用,使得系统性能严重下滑等问题。
在一些实施例中,所述一级索引还包括:最小键值、最大键值,所述步骤S220,将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点,包括:
这里,所述最小键值表示节点内最小键对应的键值,所述最大键值表示节点内最大键对应的键值。
步骤S221A,将所述主键的键值与所述节点的一级索引中的最小键值进行比较,得到第一比较结果;
这里,所述第一比较结果表征所述主键的键值是否小于所述最小键值;
步骤S222A,根据所述第一比较结果,确定目标节点;
在一些实施例中,所述步骤S222A,根据所述第一比较结果,确定目标节点,包括:
步骤S2221A,在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点存在左子树的情况下,将所述节点的左子树节点作为待对比节点;
在一些实施例中,如果主键的键值小于最小键值,且当前节点存在左子树,则进入左子树继续寻找。
步骤S2222A,将所述主键的键值与待对比节点的一级索引中的最小键值和最大键值进行比较,得到第三比较结果;
这里,所述待对比节点为左子树节点,所述左子树节点对应的最大键值小于所述节点的最小键值。
步骤S2223A,在所述第三比较结果表征所述主键的键值属于所述待对比节点的键值范围的情况下,确定所述待对比节点为目标节点。
在一些实施例中,所述一级索引还包括主键域,所述树形结构中每一节点的数据结构还包括二级索引,在所述步骤S222A,根据所述第一比较结果,确定目标节点之后,所述方法还包括:
这里,所述主键域以链表的形式的进行存储,例如,双向链表的形式存储,所述主键域内存储的内容为节点包括的元素。这里,所述二级索引为数据域,访问所述二级索引中数据的方法为根据下标找到对应的数据行,读取所述数据中的数据记录。
这里,所述数据域中数据的格式为DATA<key,data,thread_id,on_way,version>,其中,key为主键,data为实际的存储数据,thread_id记录线程ID,on_way记录数据行当前是否有线程正在操作,version为实际数据的版本号。图1B为本申请实施例T型树形结构中节点的数据结构示意图,如图1B所示,使用数组来存储数据,数组大小根据一级索引容量来计算,一级索引容量默认为200,可以存储400个键值,则数组大小设置为400。
步骤S2224A,遍历所述目标节点的主键域,其中所述主键域至少包括键值;
步骤S2225A,在所述主键域中的键值与所述主键的键值匹配的情况下,确定所述主键的键值对应的存储地址;
这里,所述确定所述主键的键值对应的存储地址包括:利用哈希函数确定所述主键的键值对应的哈希值;对所述哈希值与容量取余,得到所述主键的键值对应的存储地址。
举例说明,哈希函数的公式如下:
hash(key)=key[0]*31^(n-1)+key[1]*31^(n-2)+...+key[n-1]*31^(n-n);
这里,key[n]是主键key的第n个字符的ASCII码值,n是主键key的长度,hash(key)是根据哈希函数对键值做计算得到的结果,^表示求幂。
举例说明,图1D为本申请实施例树形结构中节点的数据结构示意图,如图1D所示,在请求主键的键值为b的情况下,对b求二级索引的地址下标:[ASCII(b)*31^(1-1)]%400=98,于是定位到主存中二级索引地址下标为98的目标数据行11。
步骤S2226A,根据所述存储地址,在所述二级索引中确定所述目标数据行,其中,所述数据行中至少包括:键值和数据;
这里,所述存储地址用于确定目标数据行,主键键值用于再次与目标数据行的键值进行对比,相同时,读取数据。
步骤S2227A,在所述目标数据行的键值与主键键值匹配的情况下,返回所述目标数据行的数据;在所述主键域中的键值与所述主键的键值不匹配的情况下,返回空值,以表征所述请求的主键的键值不存在。
这里,在所述不匹配的情况下,先进行线性探测,探测到匹配的键值,返回所述目标数据行的数据;否则,返回空值。
在一些实施例中,所述方法还包括:步骤S223A,在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点不存在左子树且所述主键的键值小于所述节点的左指针的情况下,将所述节点的上一个节点作为待对比节点;
这里,需要说明的是,在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点不存在左子树且所述主键的键值小于所述节点的左指针的情况下,所述树形结构发生了旋转,从而无法获取到实际存在的请求的key值。
在一些实施例中,所述树形结构发生旋转的情况为:图1C为本申请实施例三种不同形态的树形结构示意图,如图1C(a)所示,假设请求主键键值实际在目标节点PL内,那么当读操作读取了P节点,发现请求主键键值小于P节点的范围,准备继续读取P树的左子树PL时,另一个写操作同时插入了节点PLRR,导致T树的P节点左右子树高度差的绝对值超过了1(P节点的左子树PL最大高度为3,右子树PR最大高度为1,差值的绝对值为2),T树失衡做图1C中(b)(c)旋转变换,最终变换成图1C中(c)结构,此时P节点的左子树变成了PLRR节点,而PLRR节点不包含请求主键的键值。
这里,在中序遍历的过程中,需要根据当前节点的左指针跳转到当前节点的上一个节点,继续寻找目标节点即可。这里,所述中序遍历为以先访问左子树,再访根节点,最后访问右子树的顺序遍历树形结构。
举例说明,如图1C(c)所示,树形结构发生了旋转,在进行读操作的情况下,读取P的左子树PLRR节点,判断请求主键键值小于PLRR的最小键值,同时PLRR不存在左子树,再判断请求主键键值是否小于PLRR的左指针,如果大于,则值不存在,返回空值;如果小于,则说明目标节点被变换了路径,根据左指针跳转到PLRR的中序遍历上一个节点PLR,然后将请求主键键值与节点PLR的最大键值与最小键值对比,小于最小键值则访问节点PLR的左子树PL,从而寻找到目标节点PL,然后遍历PL节点的主键域链表,如果命中存量主键,则根据主键的哈希值去二级索引检索地址,对比键值值,读取数据并返回,如果没有命中存量主键,则返回空值表示数据不存在。
步骤S224A,在所述主键的键值大于所述节点的左指针的情况下,返回空值,以表征所述请求的主键的键值不存在。
在另一些实施例中,所述一级索引还包括:最小键值、最大键值,所述步骤S220,将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点,包括:
步骤S221B,将所述主键的键值与所述节点的一级索引中的最大键值进行比较,得到第二比较结果;
这里,所述第二比较结果表征所述主键的键值是否大于所述最大键值;
步骤S222B,根据所述第二比较结果,确定目标节点;
在一些实施例中,所述步骤S222B,根据所述第二比较结果,确定目标节点,包括:
步骤S2221B,在所述第二比较结果为大于所述节点的一级索引中的最大键值且所述节点存在右子树节点的情况下,将所述节点的右子树节点确定为待对比节点;
步骤S2222B,在所述主键的键值大于所述节点的右指针的情况下,将所述节点的下一个节点确定为待对比节点。
步骤S2223B,将所述主键的键值与所述待对比节点的一级索引中的最小键值和最大键值进行比较,得到第四比较结果;
这里,所述待对比节点可以为步骤S2221B中所述节点的右子树节点,也可以为步骤S2222B中的所述节点的下一个节点。
步骤S2224B,在所述第四比较结果表征所述主键的键值属于所述待对比节点的键值范围的情况下,确定所述待对比节点为目标节点。
本申请实施例提供的树形结构中数据的处理方法,一方面,通过将所述一级索引存储空间是CPU缓存行存储空间的整数倍,能够保证要给节点的属于存储在一个缓存行中,可以避免至少两个节点的数据存储在一个缓存行时引发的高速缓存功能无法被有效利用,使得系统性能严重下滑等问题。另一方面,将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;遍历所述目标节点的主键域,其中所述主键域至少包括键值;在所述主键域中的键值与所述主键的键值匹配的情况下,确定所述主键的键值对应的存储地址;根据所述存储地址,在所述二级索引中确定所述目标数据行,这样,实现了树形结构的无锁读,大大提升了内存索引的读操作并发性,同时消除了锁带来的性能损耗。此外,通过在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点不存在左子树且所述主键的键值小于所述节点的左指针的情况下,将所述节点的上一个节点确定为待对比节点;在所述主键的键值大于所述节点的右指针的情况下,将所述节点的下一个节点确定为待对比节点,这样,通过为树形结构增加左指针和右指针实现无锁读操作,降低锁数量与加锁解锁操作量。
本申请实施例提供一种树形结构中数据的处理方法,图2A为本申请实施例树形结构中数据的处理方法的实现流程示意图,如图2A所示,该方法包括:
步骤S201,获取操作请求的主键的键值;
步骤S202,将所述主键的键值与所述节点的一级索引中的最小键值进行比较,得到第一比较结果,其中,所述树形结构中每一节点的数据结构至少包括:一级索引和二级索引,所述一级索引还包括:最小键值、最大键值和主键域;其中,所述一级索引存储空间是CPU缓存行存储空间的整数倍;
步骤S203,根据所述第一比较结果,确定目标节点:
步骤S204,遍历所述目标节点的主键域,其中所述主键域至少包括键值;
步骤S205,在所述主键域中的键值与所述主键的键值不匹配的情况下,将所述主键的键值加入所述目标节点的一级索引并判断所述一级索引是否已满;
举例说明,在所述主键域中的键值与所述主键的键值不匹配的情况下,则将主键的键值添加入一级索引,同时判断一级索引是否已满。
步骤S206,在所述一级索引未满的情况下,将所述主键的键值对应的数值加入所述目标节点的二级索引,以完成数据写入的操作;
步骤S207,在所述一级索引已满的情况下,确定所述操作请求为分裂操作请求。
在一些实施例中,所述方法还包括:步骤S205A,在所述目标节点的主键域的键值与所述主键的键值匹配的情况下,将所述主键的键值对应目标数据行的数据更新为所述主键的键值对应的数据,以完成数据写入的操作。
在一些实施例中,所述方法还包括:步骤S208A,在所述操作请求为分裂操作请求的情况下,激活所述目标节点的节点锁;
举例说明,如果一级索引已满,则激活目标节点的节点锁互斥锁,对节点进行分裂操作,此时其他想要读写目标节点的线程全部挂起等待。
步骤S209A,在所述目标节点不存在右子树节点的情况下,创建右子树节点并激活所述右子树节点的节点锁;
举例说明,判断目标节点是否存在右子树,如果不存在,则创建新的右子树并激活新右子树的节点锁互斥锁。
步骤S210A,将所述迁移数据存储在建立的右子树节点上,并解除所述节点锁,以完成所述数据迁移。
在一些实施例中,所述方法还包括:步骤S211A,将所述主键的键值对应的数值加入所述数据迁移后的右子树节点的二级索引,以完成数据写入的操作。
在一些实施例中,所述方法还包括:步骤S209B,在所述目标节点存在右子树的情况下,激活所述右子树的节点锁;
步骤S210B,将所述目标节点的一级索引的数据划分为保留数据和迁移数据,其中,所述保留数据保留在所述目标节点;
步骤S211B,将所述迁移数据中的每一数据存储在所述右子树的分裂节点上并解除所述节点锁,以完成所述数据迁移。
举例说明,如果存在右子树,则激活右子树的节点锁互斥锁,然后根据目标节点的一级索引,如图2B,n为一级索引可容纳最大元素数,默认为400,从左向右取节点的75%数据作为保留数据,剩余数据作为迁移数据,根据目标节点的右子树地址,向其右子树迁移,迁移的同时判断右子树节点容量是否满了,如果未满,则完成了节点分裂操作,同时解除以上节点的节点锁互斥锁,唤醒外部挂起等待线程。
如果存在右子树且右子树的节点容量已满,如图2C,则继续判断右子树的右子树节点是否存在,如果不存在,则创建新的右子树的右子树并激活其节点锁互斥锁,如果存在,则激活右子树的右子树的节点锁互斥锁,同时将右子树节点内从左向右取75%的数据作为保留数据,剩余数据作为迁移数据,向右子树的右子树节点整体迁移。如此循环操作,直到全部数据向层层右子树迁移完毕,而所有节点处于非满状态,以完成所述数据迁移。
在一些实施例中,完成所述数据迁移后,所述方法还包括:判断改进T树是否处于平衡状态,如果不平衡,则做旋转操作使改进T树重新平衡,最后,将以上步骤中激活了节点锁X锁的节点进行解除节点锁X锁。
在一些实施例中,所述方法还包括:步骤S212B,将所述主键的键值对应的数值加入所述分裂节点的二级索引,以完成数据写入的操作。
在一些实施例中,完成所述输入写入操作后,还序言唤醒外部挂起等待线程。
本申请实施例提供的树形结构中数据的处理方法,通过将所述迁移数据中的每一数据存储在所述右子树的分裂节点上并解除所述节点锁,以完成所述数据迁移,这样,可以避免在完成数据写入的过程中,因为存储空间已满导致的数据溢出,造成数据丢失。
相关技术中,以T树为例,使用T树构建内存索引和T树索引并发控制的过程分别为:
(1)使用T树构建内存索引:
根据请求主键的键值,遍历并加载内存中的T树索引节点,直到键值与某个T树节点中的键值相等,则返回对应的数据,否则返回空表示数据不存在。
图3A为相关技术中T树节点数据结构示意图,如图3A所示,所述T树节点的数据结构包含了父节点地址,节点控制信息,左子树地址,右子树地址,以及保存有实际数据列表的数据域。
(2)T树索引并发控制
这里,所述T树索引并发控制至少包括:读并发控制和写并发控制:
其中,读并发控制所涉及到的节点可以参见图3B所示,读并发控制的步骤包括:
步骤S11,读取T树根节点P,并对P节点加上S锁(共享锁);
步骤S12,根据请求主键key,从根节点P开始向下遍历并比较,假设key值小于P节点范围,则获取到下一个节点PL,对PL节点加上S锁,同时对P节点解除S锁;
步骤S13,继续向下遍历比较,假设key值大于PL节点范围,则获取到下一个节点PLR,对PLR节点加上S锁,同时对PL节点解除S锁;
步骤S14,继续向下遍历比较,假设key属于PLR节点范围,则遍历PLR节点内数据列表,对比键值大小,获取对应的数据值,如果列表中存在key值,则返回对应的数据,如果不存在,则返回空。同时对PLR节点解除S锁。
步骤S15,节点上的S锁可以重复叠加,不会产生操作阻塞,但是一个加持了S锁的节点不能叠加X锁,此时会产生操作阻塞等待,所以当节点被一个线程读取的时候,其他线程是不能修改目标节点的,不会因为修改操作导致目标节点路径发生变化,而找不到实际存在的值。
其中,写并发控制所涉及到的节点也可以参见图3B所示,写并发控制的步骤为:
步骤S21,读取T树根节点P,并对P节点加上SX锁(共享互斥锁);
步骤S22,根据请求主键key,从根节点P开始向下遍历比较,假设key小于P节点范围,则获取到下一个节点PL,对PL节点加上SX锁,同时判断PL节点空间是否已满,如果未满,则对P节点解除SX锁,否则不解除P节点的SX锁;
步骤S23,继续向下遍历比较,假设key小于PL节点范围,则获取到下一个节点PLL,对PLL节点加上SX锁,同时判断PLL节点空间是否已满,如果未满,则对PL节点解除SX锁,否则不解除PL节点的SX锁;
步骤S24,继续向下遍历比较,假设key在PLL节点范围内,则对节点PLL加X锁,同时判断PLL节点空间是否已满,如果未满,则直接插入新值,然后解除节点PLL的X锁(互斥锁),解除以上步骤中持有SX锁节点的SX锁;如果已满,则将以上步骤中,持有SX锁的节点升级为X锁,然后将新值插入PLL节点,同时为PLL新增右子节点PLLR,将溢出的数据迁移至PLLR节点,最后将判断T树是否平衡,不平衡则通过旋转T树结构达到平衡。
步骤S25,完成数据新增与T树结构调整后,对第4步骤中升级为X锁的节点进行统一解除X锁。
步骤S26,节点上的X锁不可以重复叠加,持有X锁的节点,其他线程的读写操作会被阻塞在节点外等待。
由此可见,相关技术中,存在2个缺点:
(1)通过三种类型的锁(S锁,X锁,SX锁)相互配合,一定程度上减少了线程并发操作的阻塞等待,但缺点也很明显,一是读写操作在访问目标节点的时候,都需要对目标节点路径上的所有节点进行依次的加锁与解锁,在高并发的场景下,这种频繁加锁与解锁操作,会随着数据量的增加,引发越来越较高的性能消耗,从而降低内存索引的处理性能;二是三种锁的控制粒度都是节点级别,而T树本身又具有一节点包含多元素的属性,控制粒度越粗,并发性能也越低,并且这三种锁都是根据操作系统的线程挂起来实现的,而线程的挂起操作会造成操作系统的用户态和内核态切换,性能消耗也是一大短板。
(2)在多核CPU处理器的今天,每个核心内部都有一个私有高速缓存,而T树节点设计时没有考虑高速缓存,当一个缓冲行的数据被多个核心读取后,其中一个核心对缓存行中的数据进行加锁解锁操作,会导致其他核心高速缓存中的这个数据频繁产生缓存失效,高速缓存得不到利用,系统性能严重下滑。
为解决上述两个问题,本申请实施例提供一种树形结构中数据的处理方法,使树形结构中的数据在高并发的场景下,性能损耗减小,且保证多线程并发安全。本申请实施例提供的树形结构中数据的处理方法通过数据行锁41和节点锁42实现,图4为本申请实施例树形结构中数据的处理方法的锁控制粒度示意图,如图4所示,从控制粒度上划分为两类,一类是数据行锁41,属于细粒度的锁,控制每一条数据的操作,包含有偏锁(B锁),旋锁(O锁),等待锁(W锁);另一类是节点锁42,属于粗粒度的锁,控制每个节点的操作,只包含互斥锁(X锁)。
图5为本申请实施例树形结构中数据的处理方法的节点数据结构示意图,如图5所示,在数据域51的数据行中新增标记字段thread_id和on_way来实现偏锁,偏锁通过目标数据行记录下线程的ID,声明该目标数据行属于此线程,那么当该目标数据行再次遇到相同线程ID的线程时,可以直接操作,而不用做任何加锁的操作,性能消耗方面可以忽略不计。在数据行中新增标记字段version来实现旋锁,旋锁是根据主存内数据行实际版本号与操作线程内数据行预期版本号相对比,如果匹配相同,则对主存内数据行执行操作,同时将数据行版本号递增1,如果版本号匹配不相同,则重新获取主存内数据行的最新内容与最新版本号,最新内容作为操作的基础内容,最新版本号作为操作线程内数据行的新预期版本号,再次做匹配执行操作,没有抢夺到旋锁的线程,在目标数据行外轮询等待,循环时会消耗少量CPU性能。等待锁,是根据操作系统挂起线程进行等待,保证多线程并发操作时的安全。偏锁、旋锁、等待锁,性能消耗等级依次递增,数据行锁与节点锁控制粒度依次增大。如图5所示,为每个树形结构中节点新增一个左指针,一个右指针,一个节点锁标记,通过左指针和右指针实现无锁读操作,降低锁数量与加锁解锁操作量。这样,可以通过控制锁的数量,粒度,性能消耗,来完成性能的优化与并发安全。如图5所示,将节点的数据结构划分为一级索引和二级索引,一级索引是CPU缓冲行大小的整数倍,保存高频率使用的数据,当CPU从内存中整行读取数据的时候,加载进高速缓存的都是高频率使用数据,使高速缓存发挥最大的性能作用。二级索引保存实际数据值,使用频率相对于一级索引中的数据偏低,无需每次都全部加载进高速缓存,以保证高速缓存的有效性。
本申请实施例提供一种树形结构中数据的处理方法,在一些实施例中,节点的一级索引大小为CPU高速缓存缓冲行的整数倍,包含索引头,边界行,键值行三个部分。
表1为本申请实施例提供的树形结构中节点的索引头结构,如表1所示,每个字段占用固定大小的空间,占用空间加起来总共64字节,恰好一个缓存行的空间。
表1 树形结构中节点的索引头结构
Figure BDA0002753201410000211
表1中中文与字符之间的对应关系如下:节点地址采用NODE_ADDR表示,父节点地址采用PARENT_ADDR表示,左子树地址采用LEFT_ADDR表示,右子树地址采用RIGHT_ADDR表示;平衡因子采用BALANCE_FACTOR表示,锁标志采用LOCK_FLAG表示,主键总长度采用KEY_LENGTH表示平衡因子采用BALANCE_FACTOR表示。
表2为本申请实施例提供的树形结构中节点的边界行结构,如表2所示,每个字段占用固定大小的空间,占用空间加起来总共128byte,恰好两个缓存行的空间。这里,如图1B所示,左指针指向中序遍历的上一个节点,右指针指向中序遍历的下一个节点。
表2 树形结构中节点的边界行结构
Figure BDA0002753201410000221
表2中中文与字符之间的对应关系如下:最小键值采用MIN_KEY表示;最大键值采用MAX_KEY表示;左指针采用LEFT_POINT表示;右指针采用RIGHT_POINT表示。
表3为本申请实施例提供的树形结构中节点的键值行结构,如表3所示,键值行结构中包括:主键域和填充域。
表3 树形结构中节点的键值行结构
Figure BDA0002753201410000222
表3中中文与字符之间的对应关系如下:主键域采用KEYS表示;填充域采用PADDING表示。
在一些实施例中,一级索引容量为可调参数意义是缓存行的正整数倍数(缓存行默认大小为64byte),取值范围为100~300,默认为200,即200个缓冲行大小,则默认每个节点的一级索引大小为200*64byte=12800byte。一个key键占用32byte,则一个缓冲行可以保存2个key,一个节点200个缓冲行可以存放400个key键,一颗15层改进T树有16384个节点,则可存放6553600个key,约等于655万条数据。使用者可以根据实际项目的数据需求,权衡调节一级索引容量,达到最优选择。
一级索引严格对齐缓冲行的整数倍大小,使数据边界更明显,CPU在以缓冲行为单位读取并操作目标数据的时候,不会干扰到其他数据,使其他数据缓存失效,从而提高缓存的有效性。
二级索引主要包括数据域,这里,所述数据域中数据的格式为DATA<key,data,thread_id,on_way,version>,其中,key为主键,data为实际的存储数据,thread_id记录线程ID,on_way记录数据行当前是否有线程正在操作,version为实际数据的版本号。图1B为本申请实施例T型树形结构中节点的数据结构示意图,如图1B所示,使用数组来存储数据,数组大小根据一级索引容量来计算,一级索引容量默认为200,可以存储400个键值,则数组大小设置为400。hash(key)为根据哈希函数对key键值做计算得到的结果,其中,哈希函数的公式如下:
hash(key)=key[0]*31^(n-1)+key[1]*31^(n-2)+...+key[n-1]*31^(n-n);
这里,key[n]是主键key的第n个字符的ASCII码值,n是主键key的长度,hash(key)是根据哈希函数对键值做计算得到的结果,^表示求幂。
这里,存储使用开放寻址法,通过对主键key求出哈希值,然后与数组容量(400)取余,得到数据在数组中的地址下标,提高检索效率,然后对比请求key值与表中key值是否相等,相等则返回实际值,不相等则进行线性探测,探测到匹配key则返回具体数据,否则返回空。
本申请实施例提供一种树形结构中数据的处理方法,以T树的读操作无锁并发控制为例,所述方法包括:
步骤S31,读取根节点,并判断读操作请求的主键的键值是否在所述根节点范围内;
这里,如图1C所示,读取T树根节点P,根据请求的主键的键值(key值),与节点P的最小键和最大键比较,判断请求的key值是否在节点范围内,假设key小于P的最小键,则向左子树PL遍历。
步骤S32,读取所述左子树节点,并判断读操作请求的主键的键值是否在所述左子树节点范围内;
这里,读取所述左子树节点PL,将请求key值,与节点PL的最小键和最大键比较,判断请求的key值是否在节点范围内。
步骤S33,在所述请求的key值在所述左子树节点范围内的情况下,确定所述左子树节点为目标节点。
举例说明,确定所述左子树节点PL为目标节点,则遍历PL节点的主键域链表,如果命中存量主键,则根据主键的哈希值去二级索引检索地址,读取数据直接返回,如果未命中存量主键,则返回空值表示数据不存在。
在一些实施例中,由于读操作不再对目标节点路径上的节点进行加锁解锁操作,那么在搜寻目标节点的情况下,如果存在其他写操作插入新值,导致T树失去平衡,发生旋转,目标节点的路径发生改变,从而无法获取到实际存在的请求的key值。这里,T树失去平衡即某个节点的左右子树高度差绝对值超过1。例如,PLR为目标节点,P->PL->PLR则为目标节点路径,P与PL节点为目标节点路径上的节点。
举例说明,如图1C所示,假设请求主键key实际在目标节点PL内,那么当读操作读取了P节点,发现请求主键key小于P节点的范围,准备继续读取P树的左子树PL时,另一个写操作同时插入了节点PLRR,导致T树的P节点左右子树高度差的绝对值超过了1(P节点的左子树PL最大高度为3,右子树PR最大高度为1,差值的绝对值为2),T树失衡发生旋转变换,如图1C中(b)(c)所示,最终变换成图1C中(c)结构,此时P节点的左子树变成了PLRR节点,而PLRR节点不包含请求主键key,从而返回空,查询不到T树中实际存在的数据。
在一些实施例中,在所述T树旋转的情况下,通过一级索引中新增的左指针和右指针可以很好的解决这个问题,当树结构变换后,读操作读取P的左子树PLRR节点,判断请求主键key小于PLRR的最小键值,同时PLRR不存在左子树,再判断请求主键key是否小于PLRR的左指针,如果大于,则值不存在,返回空值;如果小于,则说明目标节点被变换了路径,根据左指针跳转到PLRR的中序遍历上一个节点PLR,然后将请求主键key与节点PLR的最大键值与最小键值对比,小于最小键值则访问节点PLR的左子树PL,从而寻找到目标节点PL,然后遍历PL节点的主键域链表,如果命中存量主键,则根据主键的哈希值去二级索引检索地址,对比key值,读取数据并返回,如果没有命中存量主键,则返回空值表示数据不存在。
读操作无锁并发控制算法可以归纳为以下三种情况:1)如果请求主键key小于当前节点的最小键值,且当前节点没有左子树,且请求主键key小于当前节点左指针,则说明目标节点的路径被平衡操作变换过,根据左指针跳转到中序遍历上一个节点继续寻找目标节点即可;2)如果请求主键key大于当前节点的最大键值,且当前节点没有右子树,且请求主键key大于当前节点右指针,则说明目标节点的路径被平衡操作变换过,根据右指针跳转到中序遍历下一个节点继续寻找目标节点即可;3)如果不属于以上两种场景,则说明目标节点的路径未被变换过,按正常情况将请求主键key与当前节点最小键值和最大键值对比,有以下四个子场景:(1)如果key小于最小键值,且当前节点存在左子树,则进入左子树继续寻找;(2)如果key小于最小键值,且当前节点不存在左子树,且key大于当前节点左指针,则说明值不存在,返回空;(3)如果key大于最大键值,且当前节点存在右子树,则进入右子树继续寻找;(4)如果key大于最大键值,且当前节点不存在右子树,且key小于当前节点右指针,则说明值不存在,返回空。
本申请实施例提供的树形结构中数据的处理方法,通过读取根节点,并判断读操作请求的主键的键值是否在所述根节点范围内;读取所述左子树节点,并判断读操作请求的主键的键值是否在所述左子树节点范围内;在所述请求的key值在所述左子树节点范围内的情况下,确定所述左子树节点为目标节点。这样,实现了对树形结构中数据的无锁并发控制,提升了内存索引的读操作并发性,同时消除了锁带来的性能损耗。
本申请实施例提供一种树形结构中数据的处理方法,以T树的写操作多级锁并发控制为例,所述方法包括:
步骤S41,根据写操作请求的主键key和无锁读操作,确定所述请求的主键key对应的目标节点;
步骤S42,将所述请求的主键key添加入一级索引,同时判断一级索引是否已满;
步骤S43,在所述一级索引未满的情况下,将所述主键的键值对应的数值加入所述目标节点的二级索引,以完成数据写入的操作;
举例说明,确定到目标节点后,如果节点内一级索引不存在请求主键key,则将主键key添加入一级索引,同时判断一级索引是否已满,如果未满,则将请求主键key对应的数值存入二级索引,完成数据的初次插入操作。
步骤S44,在所述一级索引已满的情况下,确定所述操作请求为分裂操作请求;
步骤S45,在所述操作请求为分裂操作请求的情况下,激活所述目标节点的节点锁;
在一些实施例中,如果一级索引已满,则激活目标节点的节点锁X锁,对节点进行分裂操作,此时其他想要读写目标节点的线程全部挂起等待。同时判断目标节点是否存在右子树。
步骤S46,在所述目标节点不存在右子树节点的情况下,创建右子树节点并激活所述右子树节点的节点锁;
在一些实施例中,在所述目标节点不存在右子树节点的情况下,则创建新的右子树并激活新右子树的节点锁X锁,在所述目标节点存在右子树节点的情况下,则激活右子树的节点锁X锁,然后根据目标节点的一级索引,如图2B,n为一级索引可容纳最大元素数,默认为400,从左向右取节点的75%数据作为保留数据,剩余数据则根据目标节点的右子树地址,向其右子树迁移,迁移的同时判断右子树节点容量是否满了,如果未满,则完成了节点分裂操作,同时解除以上节点的节点锁X锁,唤醒外部挂起等待线程。如果满了,如图2C,则继续判断右子树的右子树节点是否存在,如果不存在,则创建新的右子树的右子树并激活其节点锁X锁,如果存在,则激活右子树的右子树的节点锁X锁,同时将右子树节点内从左向右取75%的数据作为保留数据,剩余数据向右子树的右子树节点整体迁移。如此循环操作,直到全部数据向层层右子树迁移完毕,而所有节点处于非满状态,再判断改进T树是否处于平衡状态,如果不平衡,则做旋转操作使改进T树重新平衡。
步骤S47,完成节点分裂与数据写入操作。
在一些实施例中,对激活了节点锁X锁的节点进行解除节点锁X锁,完成数据的初次插入操作,唤醒外部挂起等待线程。由于节点锁X锁的加锁顺序是自上而下,自左而右的顺序,所以不会造成死锁的情况。
在一些实施例中,确定目标节点之后,如果节点内一级索引存在请求主键key,则对节点内数据行进行更新操作。如图1D,假设请求主键key为b,则对b求二级索引的地址下标:[ASCII(b)*31^(1-1)]%400=98,于是定位到主存中二级索引地址下标为98的目标数据行11。当前线程读取目标数据行11,首先判断目标数据行thread_id字段是否为空且on_way字段为N,如果是,则执行偏锁,通过CAS将当前线程的线程ID记录到主存中目标数据行的thread_id字段中,即声明此数据行属于此线程ID,同时将on_way字段设置为Y,表明此时有线程正在对目标数据行做操作,完成更新操作后,再将目标数据行的on_way字段设置为N,表明此时没有线程正在对主存中目标数据行做操作。
在一些实施例中,如果目标数据行thread_id字段不为空,则判断主存中目标数据行的thread_id与当前线程的线程ID是否相同,如果相同,则直接对目标数据行执行操作,不用任何加锁操作。如果不相同,则判断主存中目标数据行的on_way字段是否为N,如果是N,即说明此时没有线程正在对目标数据行进行操作,则执行偏锁重定向,将主存中目标数据行的thread_id通过CAS更新为当前线程的线程ID,同时将on_way字段设置为Y,表明此时有线程正在对目标数据行做操作,完成更新操作后,再将目标数据行的on_way字段设置为N,表明此时没有线程正在对目标数据行做操作;
在一些实施例中,如果主存中目标数据行的thread_id与当前线程的线程ID不相同,且on_way字段为Y,即说明此时有线程正在对目标数据行进行操作,则对目标数据行执行锁升级,将偏锁升级为旋锁,此时所有想要操作此数据行的线程,先不断轮询主存内目标数据行,直到目标数据行on_way字段变为N,则开始竞争目标数据行,一旦有一个线程最先将目标数据行的on_way字段设置为Y,并将thread_id更新为自己的线程ID,则说明此线程获得了目标数据行的控制权,此时根据主存内目标数据行实际版本号与当前获得控制权的线程内目标数据行预期版本号相对比,如果匹配相同,则对主存中数据行执行操作,同时将数据行版本号递增1,如果版本号不匹配,则重新查询获取主存中数据行的最新值与最新版本号,最新值作为更新操作的原始值,最新版本号作为操作线程内数据行的新预期版本号,然后再次做匹配,执行更新操作,最后将on_way字段设置为N,释放旋锁,结束操作,并换醒可能处于挂起等待状态的其他想要操作此数据行的线程,它们开始新一轮的控制权抢夺。当并发线程全部处理完毕,则目标数据行的锁自动降级为偏锁,按照如果目标数据行thread_id字段不为空,则判断主存中目标数据行的thread_id与当前线程的线程ID是否相同的过程执行操作。
这里,所述旋锁属于中等量级的锁,通过轮询的方式,以耗费少量CPU性能为代价,等待操作机会,但是如果某一数据行的并发程度处于异常超高状态,且当前处理中的线程操作比较耗时,会造成大量的请求线程堆积,空耗CPU进行等待,从而使打满CPU负载,会造成得不偿失的性能损失,所以,当一个线程轮询目标数据行的次数超过20次的时候,则升级为等待锁,通过操作系统使写线程进入挂起等待状态,释放CPU资源,直到处理中的线程释放目标数据行的控制权,唤醒等待状态中的线程参与新一轮的目标数据行的控制权竞争,此时等待锁降级为旋锁,得到控制权的线程进入目标数据行进行操作,其他被唤醒的竞争线程重新开始轮询等待,重复如果主存中目标数据行的thread_id与当前线程的线程ID不相同,且on_way字段为Y的操作,直到所有的线程处理完毕,目标数据行的锁再次降级为偏锁。由于等待锁的触发会造成操作系统用户态和内核态的切换,会造成较大的资源开销,所以属于重量级的锁,只有在多线程并发程度最严重的时候才启用,而实际系统运行中,此类极端情况一般偏少,绝大部分时间通过偏锁和旋锁,以微小性能开销为代价,便可解决多线程并发安全问题,从而提高改进T树的并发性能。
本申请实施例提供的树形结构中数据的处理方法,通过偏锁、旋锁和等待锁等多级别锁并发写控制;对齐缓冲行的整数倍大小,使数据边界更明显目标节点索引与CPU的1L缓存对齐这两个方面,充分利用了CPU高速缓存,减少了锁的数量,并减少了加锁解锁操作量,细化锁粒度,降低锁性能开销,实现了树形结构的并发性能优化,保证了多线程处理的安全。
基于前述的实施例,本申请实施例提供一种树形结构中数据的处理装置,该装置包括所包括的各单元、以及各单元所包括的各模块,可以通过树形结构中数据的处理设备(例如可以计算机设备)中的处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为中央处理器(CPU)、微处理器(MPU)、数字信号处理器(DSP)或现场可编程门阵列(FPGA)等。
图6为本申请实施例树形结构中数据的处理装置的组成结构示意图,如图6所示,所述装置600包括获取模块601、比较模块602、迁移模块603和处理模块604,其中:
获取模块601,用于获取操作请求的主键的键值;
比较模块602,用于将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;
迁移模块603,用于在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;
处理模块604,用于在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
在一些实施例中,所述目标节点的数据行包括线程ID和操作在途状态,所述数据行锁至少包括:偏锁、旋锁和等待锁,所述处理模块,用于:
在所述线程ID为空且所述操作在途状态字段为否的情况下,通过激活的偏锁对所述目标节点的数据行进行处理;
在所述目标节点的数据行的线程ID与请求主键键值的ID不同且操作在途状态字段为是的情况下,通过激活的旋锁对所述目标节点的数据行进行处理;
在所述旋锁执行的轮询所述数据行的次数超过预先设定的阈值的情况下,通过激活的等待锁对所述目标节点的数据行进行处理。
在一些实施例中,所述树形结构中每一节点的数据结构至少包括:一级索引;其中,所述一级索引存储空间是CPU缓存行存储空间的整数倍。
在一些实施例中,所述一级索引还包括:最小键值、最大键值;所述比较模块,包括第一比较单元和第一确定单元,其中:所述第一比较单元,用于将所述主键的键值与所述节点的一级索引中的最小键值进行比较,得到第一比较结果;所述第一确定单元,用于根据所述第一比较结果,确定目标节点;
或者,所述比较模块,包括第二比较单元和第二确定单元,其中所述第二比较单元,用于将所述主键的键值与所述节点的一级索引中的最大键值进行比较,得到第二比较结果;所述第二确定单元,用于根据所述第二比较结果,确定目标节点。
在一些实施例中,所述第一确定单元,用于:在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点存在左子树的情况下,将所述节点的左子树节点作为待对比节点;将所述主键的键值与待对比节点的一级索引中的最小键值和最大键值进行比较,得到第三比较结果;在所述第三比较结果表征所述主键的键值属于所述待对比节点的键值范围的情况下,确定所述待对比节点为目标节点。
在一些实施例中,所述一级索引还包括主键域,所述树形结构中每一节点的数据结构还包括二级索引;所述装置还包括:
遍历模块,用于遍历所述目标节点的主键域,其中所述主键域至少包括键值;
第一确定模块,用于在所述主键域中的键值与所述主键的键值匹配的情况下,确定所述主键的键值对应的存储地址;
第二确定模块,用于根据所述存储地址,在所述二级索引中确定所述目标数据行,其中,所述数据行中至少包括:键值和数据;
第一返回模块,用于在所述目标数据行的键值与主键键值匹配的情况下,返回所述目标数据行的数据;在所述主键域中的键值与所述主键的键值不匹配的情况下,返回空值,以表征所述请求的主键的键值不存在。
在一些实施例中,所述装置还包括:
第三确定模块,用于在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点不存在左子树且所述主键的键值小于所述节点的左指针的情况下,将所述节点的上一个节点作为待对比节点;
第二返回模块,用于在所述主键的键值大于所述节点的左指针的情况下,返回空值,以表征所述请求的主键的键值不存在。
在一些实施例中,所述第二确定单元,还用于:
在所述第二比较结果为大于所述节点的一级索引中的最大键值且所述节点存在右子树节点的情况下,将所述节点的右子树节点确定为待对比节点;在所述主键的键值大于所述节点的右指针的情况下,将所述节点的下一个节点确定为待对比节点;
将所述主键的键值与所述待对比节点的一级索引中的最小键值和最大键值进行比较,得到第四比较结果;
在所述第四比较结果表征所述主键的键值属于所述待对比节点的键值范围的情况下,确定所述待对比节点为目标节点。
在一些实施例中,所述装置还包括:
第一加入模块,用于在所述主键域中的键值与所述主键的键值不匹配的情况下,将所述主键的键值加入所述目标节点的一级索引并判断所述一级索引是否已满;
第二加入模块,用于在所述一级索引未满的情况下,将所述主键的键值对应的数值加入所述目标节点的二级索引,以完成数据写入的操作;
第四确定模块,用于在所述一级索引已满的情况下,确定所述操作请求为分裂操作请求。
在一些实施例中,所述装置还包括:更新模块,用于在所述目标节点的主键域的键值与所述主键的键值匹配的情况下,将所述主键的键值对应目标数据行的数据更新为所述主键的键值对应的数据,以完成数据写入的操作。
在一些实施例中,所述迁移模块,包括:
第一激活单元,用于激活所述目标节点的节点锁;
创建单元,用于在所述目标节点不存在右子树节点的情况下,创建右子树节点并激活所述右子树节点的节点锁;
第一存储单元,用于将所述迁移数据存储在建立的右子树节点上,并解除所述节点锁,以完成所述数据迁移。
在一些实施例中,所述迁移模块,还包括:
第二激活单元,用于在所述目标节点存在右子树的情况下,激活所述右子树的节点锁;
划分单元,用于将所述目标节点的一级索引的数据划分为保留数据和迁移数据,其中,所述保留数据保留在所述目标节点;
第二存储单元,用于将所述迁移数据中的每一数据存储在所述右子树的分裂节点上并解除所述节点锁,以完成所述数据迁移。
以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,本申请实施例中,如果以软件功能模块的形式实现上述的树形结构中数据的处理方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read OnlyMemory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件和软件结合。
对应地,本申请实施例提供一种树形结构中数据的处理设备,例如可以是计算机设备,该设备包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法中的步骤。
对应地,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法中的步骤。
这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请存储介质和设备实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,图7为本申请实施例中计算机设备的一种硬件实体示意图,如图7所示,该计算机设备700的硬件实体包括:处理器701、通信接口702和存储器703,其中
处理器701通常控制计算机设备700的总体操作。
通信接口702可以使计算机设备通过网络与其他设备通信。
存储器703配置为存储由处理器701可执行的指令和应用,还可以缓存待处理器701以及计算机设备700中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(FLASH)或随机访问存储器(Random AccessMemory,RAM)实现。
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本申请各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本申请上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

Claims (15)

1.一种树形结构中数据的处理方法,其特征在于,所述方法包括:
获取操作请求的主键的键值;
将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;
在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;
在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
2.根据权利要求1所述的方法,其特征在于,所述目标节点的数据行包括线程ID和操作在途状态,所述数据行锁至少包括:偏锁、旋锁和等待锁,所述通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理,包括:
在所述线程ID为空且所述操作在途状态字段为否的情况下,通过激活的偏锁对所述目标节点的数据行进行处理;
在所述目标节点的数据行的线程ID与请求主键键值的ID不同且操作在途状态字段为是的情况下,通过激活的旋锁对所述目标节点的数据行进行处理;
在所述旋锁执行的轮询所述数据行的次数超过预先设定的阈值的情况下,通过激活的等待锁对所述目标节点的数据行进行处理。
3.根据权利要求1所述的方法,其特征在于,所述树形结构中每一节点的数据结构至少包括:一级索引;其中,所述一级索引存储空间是CPU缓存行存储空间的整数倍。
4.根据权利要求3所述的方法,其特征在于,所述一级索引还包括:最小键值、最大键值;所述将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点,包括:
将所述主键的键值与所述节点的一级索引中的最小键值进行比较,得到第一比较结果;根据所述第一比较结果,确定目标节点;
或者,
将所述主键的键值与所述节点的一级索引中的最大键值进行比较,得到第二比较结果;根据所述第二比较结果,确定目标节点。
5.根据权利要求4所述的方法,其特征在于,所述根据所述第一比较结果,确定目标节点,包括:
在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点存在左子树的情况下,将所述节点的左子树节点作为待对比节点;
将所述主键的键值与待对比节点的一级索引中的最小键值和最大键值进行比较,得到第三比较结果;
在所述第三比较结果表征所述主键的键值属于所述待对比节点的键值范围的情况下,确定所述待对比节点为目标节点。
6.根据权利要求5所述的方法,其特征在于,所述一级索引还包括主键域,所述树形结构中每一节点的数据结构还包括二级索引;所述方法还包括:
遍历所述目标节点的主键域,其中所述主键域至少包括键值;
在所述主键域中的键值与所述主键的键值匹配的情况下,确定所述主键的键值对应的存储地址;
根据所述存储地址,在所述二级索引中确定所述目标数据行,其中,所述数据行中至少包括:键值和数据;
在所述目标数据行的键值与主键键值匹配的情况下,返回所述目标数据行的数据;在所述主键域中的键值与所述主键的键值不匹配的情况下,返回空值,以表征所述请求的主键的键值不存在。
7.根据权利要求5所述的方法,其特征在于,所述方法还包括:
在所述第一比较结果为小于所述节点的一级索引中的最小键值且所述节点不存在左子树且所述主键的键值小于所述节点的左指针的情况下,将所述节点的上一个节点作为待对比节点;
在所述主键的键值大于所述节点的左指针的情况下,返回空值,以表征所述请求的主键的键值不存在。
8.根据权利要求4所述的方法,其特征在于,所述根据所述第二比较结果,确定目标节点,包括:
在所述第二比较结果为大于所述节点的一级索引中的最大键值且所述节点存在右子树节点的情况下,将所述节点的右子树节点确定为待对比节点;在所述主键的键值大于所述节点的右指针的情况下,将所述节点的下一个节点确定为待对比节点;
将所述主键的键值与所述待对比节点的一级索引中的最小键值和最大键值进行比较,得到第四比较结果;
在所述第四比较结果表征所述主键的键值属于所述待对比节点的键值范围的情况下,确定所述待对比节点为目标节点。
9.根据权利要求6所述的方法,其特征在于,所述方法还包括:
在所述主键域中的键值与所述主键的键值不匹配的情况下,将所述主键的键值加入所述目标节点的一级索引并判断所述一级索引是否已满;
在所述一级索引未满的情况下,将所述主键的键值对应的数值加入所述目标节点的二级索引,以完成数据写入的操作;
在所述一级索引已满的情况下,确定所述操作请求为分裂操作请求。
10.根据权利要求6所述的方法,其特征在于,所述方法还包括:
在所述目标节点的主键域的键值与所述主键的键值匹配的情况下,将所述主键的键值对应目标数据行的数据更新为所述主键的键值对应的数据,以完成数据写入的操作。
11.根据权利要求9所述的方法,其特征在于,所述通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移,包括:
激活所述目标节点的节点锁;
在所述目标节点不存在右子树节点的情况下,创建右子树节点并激活所述右子树节点的节点锁;
将所述迁移数据存储在建立的右子树节点上,并解除所述节点锁,以完成所述数据迁移。
12.根据权利要求11所述的方法,其特征在于,所述通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移,还包括:
在所述目标节点存在右子树的情况下,激活所述右子树的节点锁;
将所述目标节点的一级索引的数据划分为保留数据和迁移数据,其中,所述保留数据保留在所述目标节点;
将所述迁移数据中的每一数据存储在所述右子树的分裂节点上并解除所述节点锁,以完成所述数据迁移。
13.一种树形结构中数据的处理装置,其特征在于,所述装置包括:
获取模块,用于获取操作请求的主键的键值;
比较模块,用于将所述主键的键值与所述树形结构中节点的键值进行比较,得到目标节点;
迁移模块,用于在所述操作请求为分裂操作请求的情况下,通过激活的所述目标节点的节点锁对所述目标节点的数据进行数据迁移;
处理模块,用于在所述操作请求为更新操作请求的情况下,通过激活的所述目标节点的数据行锁对所述目标节点的数据行进行数据处理。
14.一种树形结构中数据的处理设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至12任一项所述方法中的步骤。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至12任一项所述方法中的步骤。
CN202011192840.4A 2020-10-30 2020-10-30 一种树形结构中数据的处理方法及装置、设备、存储介质 Pending CN112306991A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011192840.4A CN112306991A (zh) 2020-10-30 2020-10-30 一种树形结构中数据的处理方法及装置、设备、存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011192840.4A CN112306991A (zh) 2020-10-30 2020-10-30 一种树形结构中数据的处理方法及装置、设备、存储介质

Publications (1)

Publication Number Publication Date
CN112306991A true CN112306991A (zh) 2021-02-02

Family

ID=74332963

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011192840.4A Pending CN112306991A (zh) 2020-10-30 2020-10-30 一种树形结构中数据的处理方法及装置、设备、存储介质

Country Status (1)

Country Link
CN (1) CN112306991A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113420024A (zh) * 2021-06-02 2021-09-21 浪潮软件股份有限公司 一种业务表单数据分表存储方法
CN114238704A (zh) * 2022-02-21 2022-03-25 北京金山云网络技术有限公司 树形索引的拆分方法、数据访问方法、装置及电子设备
CN114282074A (zh) * 2022-03-04 2022-04-05 阿里云计算有限公司 数据库操作方法、装置、设备及存储介质
WO2023284473A1 (zh) * 2021-07-14 2023-01-19 腾讯科技(深圳)有限公司 数据管理方法、装置、计算机设备及存储介质
CN115905246A (zh) * 2023-03-14 2023-04-04 智者四海(北京)技术有限公司 基于动态压缩前缀树的kv缓存方法与装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5440732A (en) * 1993-02-05 1995-08-08 Digital Equipment Corp., Pat. Law Gr. Key-range locking with index trees
EP1395906A1 (en) * 2001-06-09 2004-03-10 Transact in Memory, Inc. Cache-conscious concurrency control scheme for database systems
CN109254962A (zh) * 2017-07-06 2019-01-22 中国移动通信集团浙江有限公司 一种基于t-树的索引优化方法及装置
US10275480B1 (en) * 2016-06-16 2019-04-30 Amazon Technologies, Inc. Immediately-consistent lock-free indexing for distributed applications
CN110990404A (zh) * 2019-11-27 2020-04-10 亚信科技(中国)有限公司 一种索引数据的处理方法、装置及电子设备

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5440732A (en) * 1993-02-05 1995-08-08 Digital Equipment Corp., Pat. Law Gr. Key-range locking with index trees
EP1395906A1 (en) * 2001-06-09 2004-03-10 Transact in Memory, Inc. Cache-conscious concurrency control scheme for database systems
US10275480B1 (en) * 2016-06-16 2019-04-30 Amazon Technologies, Inc. Immediately-consistent lock-free indexing for distributed applications
CN109254962A (zh) * 2017-07-06 2019-01-22 中国移动通信集团浙江有限公司 一种基于t-树的索引优化方法及装置
CN110990404A (zh) * 2019-11-27 2020-04-10 亚信科技(中国)有限公司 一种索引数据的处理方法、装置及电子设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
吕鹏;蒋平;吴钦章;: "一种T-树的优化设计与实现方法", 计算机工程, no. 08, 15 August 2013 (2013-08-15) *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113420024A (zh) * 2021-06-02 2021-09-21 浪潮软件股份有限公司 一种业务表单数据分表存储方法
WO2023284473A1 (zh) * 2021-07-14 2023-01-19 腾讯科技(深圳)有限公司 数据管理方法、装置、计算机设备及存储介质
CN114238704A (zh) * 2022-02-21 2022-03-25 北京金山云网络技术有限公司 树形索引的拆分方法、数据访问方法、装置及电子设备
CN114282074A (zh) * 2022-03-04 2022-04-05 阿里云计算有限公司 数据库操作方法、装置、设备及存储介质
CN114282074B (zh) * 2022-03-04 2022-08-16 阿里云计算有限公司 数据库操作方法、装置、设备及存储介质
CN115905246A (zh) * 2023-03-14 2023-04-04 智者四海(北京)技术有限公司 基于动态压缩前缀树的kv缓存方法与装置

Similar Documents

Publication Publication Date Title
CN112306991A (zh) 一种树形结构中数据的处理方法及装置、设备、存储介质
US9563477B2 (en) Performing concurrent rehashing of a hash table for multithreaded applications
US8131894B2 (en) Method and system for a sharing buffer
US8412887B2 (en) Wait-free parallel data cache
US8788543B2 (en) Scalable, concurrent resizing of hash tables
US8473950B2 (en) Parallel nested transactions
US8099538B2 (en) Increasing functionality of a reader-writer lock
Crain et al. A contention-friendly binary search tree
US7624246B2 (en) Method and system for memory allocation in a multiprocessing environment
US20110161540A1 (en) Hardware supported high performance lock schema
US11056145B2 (en) Global secondary path locking technique enabling high read concurrency for read-mostly workloads
CN110727675A (zh) 一种链表的处理方法及装置
US9400692B2 (en) System and method for managing the allocating and freeing of objects in a multi-threaded system
WO2011096163A1 (ja) 情報処理システム、排他制御方法および排他制御用プログラム
JP2001265611A (ja) コンピュータシステム、メモリ管理方法、記憶媒体及びプログラム伝送装置
CN116661690A (zh) 记录内存状态的方法、装置、计算机设备及存储介质
CN116302097A (zh) 一种基于自旋锁的多核处理器共享数据访问设计方法
Singh et al. Efficient hardware primitives for immediate memory reclamation in optimistic data structures
US20210103584A1 (en) Hash-based data structure
US20090193423A1 (en) Wakeup pattern-based colocation of threads
US20230110566A1 (en) Method for synchronization for improving concurrent read performance of critical section in distributed shared memory and apparatus using the same
CN116974955A (zh) 持久性内存文件数据缓存方法、系统、设备及存储介质
WO2017091234A1 (en) Providing a segmented hash map

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