一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

图数据写入方法及装置与流程

2021-11-22 13:56:00 来源:中国专利 TAG:

1.本说明书实施例通常涉及数据库领域,尤其涉及图数据写入方法及装置。


背景技术:

2.图数据库在写入顶点/边数据时,为了保证数据的准确性,需要对相应的数据资源进行加锁,并且在图数据写入完成后进行解锁。按照这种图数据写入方式,在图数据库的写入出现热点数据时,会阻塞图数据库内的线程池中的大部分写入线程,从而导致数据写入被阻塞,由此造成图数据库的整体写入tps(transactions per second)大幅下降。此外,由于锁之间存在互斥性,使得热点数据的写请求无法并发执行,从而导致热点数据的写入tps较低,无法匹配热点数据的写入规模,由此发生大量热点数据写请求失败或超时。


技术实现要素:

3.鉴于上述,本说明书实施例提供一种图数据写入方法及装置。利用该图数据写入方法及装置,通过为图数据中的每个顶点或每条边设置更细粒度的行锁结构,可以减少顶点/边写入时的锁竞争,由此提升图数据库的整体写入tps。此外,由于所设置的行锁可以自动增删,由此实现行锁的动态管理,从而可以使用较少内存覆盖保护超大规模的图数据。
4.根据本说明书实施例的一个方面,提供一种图数据写入方法,包括:响应于接收到用户发起的第一图数据写请求,基于所述第一图数据写请求中的目标写入对象的对象标识信息确定各个目标写入对象的对应行锁的行锁索引,所述目标写入对象包括目标写入顶点和/或目标写入边,每个目标写入对象对应一个行锁;基于各个目标写入对象的行锁索引,为所述第一图数据写请求中的各个目标写入对象加锁;在所述第一图数据请求中的各个目标写入对象完成加锁后,执行针对所述第一图数据写请求的图数据写入;在所述第一图数据写请求中的各个目标写入对象的图数据写入完成后,对所述第一图数据写请求持有的行锁进行解锁;以及在所述第一图数据写请求持有的所有行锁完成解锁后,将图数据写入结果提供给所述用户。
5.可选地,在上述方面的一个示例中,基于各个目标写入对象的行锁索引,为所述第一图数据写请求中的各个目标写入对象加锁可以包括:基于所述第一图数据写请求中的各个目标写入对象的行锁索引,确定各个目标写入对象的加锁顺序;以及按照所确定的加锁顺序,为所述第一图数据写请求中的各个目标写入对象加锁并将已加锁的行锁信息记录在写请求记录中,所述行锁信息至少包括行锁的行锁索引。
6.可选地,在上述方面的一个示例中,按照所确定的加锁顺序,为所述第一图数据写请求中的各个目标写入对象加锁可以包括:针对所述第一图数据写请求循环执行下述加锁过程,直到各个目标写入对象完成加锁或者所述第一图数据写请求被放入行锁等待队列:按照所确定的加锁顺序,从所述第一图数据写请求中顺序取出当前未加锁的目标写入对象;针对所取出的目标写入对象,根据该目标写入对象的行锁索引查询所在闩锁中是否存在对应的行锁;在所在闩锁中不存在对应的行锁时,在所在闩锁中为所取出的目标写入对
象创建行锁,在所在闩锁中存在对应的行锁时,将所述第一图数据写请求放入该行锁的行锁等待队列。
7.可选地,在上述方面的一个示例中,在所述第一图数据写请求中的各个目标写入对象的图数据写入完成后,对所述第一图数据写请求持有的行锁进行解锁可以包括:针对所述第一图数据写请求循环执行下述解锁过程,直到所述第一图数据写请求持有的所有行锁完成解锁:从所述第一图数据写请求的写请求记录中取出未解锁的行锁信息;基于所取出的行锁信息中的行锁索引,查询对应的行锁等待队列中是否存在等待写入的图数据写请求;在所述行锁等待队列中存在等待写入的图数据写请求时,将所述行锁索引所对应的行锁的持有权传递给位于所述行锁等待队列队首的第二图数据写请求,在所述行锁等待队列中不存在等待写入的第二图数据写请求时,从所在闩锁中删除所述行锁索引所对应的行锁。
8.可选地,在上述方面的一个示例中,所述图数据写入方法还可以包括:触发所述第二图数据写请求的异步重试来进行针对所述第二图数据写请求的图数据写入。
9.可选地,在上述方面的一个示例中,所述图数据写入方法还可以包括:响应于所述第二图数据写请求被触发异步重试,访问所述第二图数据写请求所在的行锁等待队列,以确定所述行锁等待队列中是否存在可合并处理的第三图数据写请求;以及在所述行锁等待队列中存在可合并处理的第三图数据写请求时,将所述第二图数据写请求与所述第三图数据写请求合并为新的图数据写请求来进行图数据写入。
10.可选地,在上述方面的一个示例中,在针对所述第二图数据写请求或所述合并后的新图数据写请求进行图数据写入时,所述第二图数据写请求或所述新图数据写请求中已经加锁的目标写入对象无需再次加锁。
11.根据本说明书的实施例的另一方面,提供一种图数据写入装置,包括:行锁索引确定单元,响应于接收到用户发起的第一图数据写请求,基于所述第一图数据写请求中的目标写入对象的对象标识信息确定各个目标写入对象的对应行锁的行锁索引,所述目标写入对象包括目标写入顶点和/或目标写入边,每个目标写入对象对应一个行锁;加锁单元,基于各个目标写入对象的行锁索引,为所述第一图数据写请求中的各个目标写入对象加锁;数据写入单元,在所述第一图数据写请求中的各个目标写入对象完成加锁后,执行针对所述第一图数据写请求的图数据写入;解锁单元,在所述第一图数据写请求中的各个目标写入对象的图数据写入完成后,对所述第一图数据写请求持有的行锁进行解锁;以及写入结果提供单元,在所述第一图数据写请求持有的所有行锁完成解锁后,将图数据写入结果提供给所述用户。
12.可选地,在上述方面的一个示例中,所述加锁单元可以包括:加锁顺序确定模块,基于所述第一图数据写请求中的各个目标写入对象的行锁索引,确定各个目标写入对象的加锁顺序;加锁模块,按照所确定的加锁顺序,为所述第一图数据写请求中的各个目标写入对象加锁;以及加锁信息记录模块,将已加锁的行锁信息记录在写请求记录中,所述行锁信息至少包括行锁的行锁索引。
13.可选地,在上述方面的一个示例中,所述加锁模块针对所述第一图数据写请求循环执行下述加锁过程,直到各个目标写入对象完成加锁或者所述第一图数据写请求被放入行锁等待队列:按照所确定的加锁顺序,从所述第一图数据写请求中顺序取出当前未加锁
的目标写入对象;针对所取出的目标写入对象,根据该目标写入对象的行锁索引查询所在闩锁中是否存在对应的行锁;在所在闩锁中不存在对应的行锁时,在所在闩锁中为所取出的目标写入对象创建行锁,在所在闩锁中存在对应的行锁时,将所述第一图数据写请求放入该行锁的行锁等待队列。
14.可选地,在上述方面的一个示例中,所述解锁单元针对所述第一图数据写请求循环执行下述解锁过程,直到所述第一图数据写请求持有的所有行锁完成解锁:从所述第一图数据写请求的写请求记录中取出未解锁的行锁信息;基于所取出的行锁信息中的行锁索引,查询对应的行锁等待队列中是否存在等待写入的图数据写请求;在所述行锁等待队列中存在等待写入的图数据写请求时,将所述行锁索引所对应的行锁的持有权传递给位于所述行锁等待队列队首的第二图数据写请求,在所述行锁等待队列中不存在等待写入的图数据写请求时,从所在闩锁中删除所述行锁索引所对应的行锁。
15.可选地,在上述方面的一个示例中,所述图数据写入装置还可以包括异步重试触发单元,触发所述第二图数据写请求的异步重试来进行针对所述第二图数据写请求的图数据写入。
16.可选地,在上述方面的一个示例中,所述图数据写入装置还可以包括:可合并写请求确定单元,响应于所述第二图数据写请求被触发异步重试,访问所述第二图数据写请求所在的行锁等待队列,以确定所述行锁等待队列中是否存在可合并处理的第三图数据写请求;以及写请求合并单元,在所述行锁等待队列中存在可合并处理的第三图数据写请求时,将所述第二图数据写请求与所述第三图数据写请求合并为新的图数据写请求来进行图数据写入。
17.根据本说明书的实施例的另一方面,提供一种图数据写入装置,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器中的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上所述的图数据写入方法。
18.根据本说明书的实施例的另一方面,提供一种计算机可读存储介质,其存储有可执行指令,所述指令当被执行时使得处理器执行如上所述的图数据写入方法。
19.根据本说明书的实施例的另一方面,提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行来实现如上所述的图数据写入方法。
附图说明
20.通过参照下面的附图,可以实现对于本说明书内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。
21.图1示出了根据本说明书的实施例的图数据库中的锁结构的示例示意图。
22.图2示出了根据本说明书的实施例的图数据写入方法的示例流程图。
23.图3示出了根据本说明书的实施例的写入对象加锁过程的示例流程图。
24.图4示出了根据本说明书的实施例的写入对象顺序加锁过程的示例流程图。
25.图5示出了根据本说明书的实施例的行锁解锁过程的示例流程图。
26.图6示出了根据本说明书的实施例的图数据写入装置的示例方框图。
27.图7示出了根据本说明书的实施例的加锁单元的示例方框图。
28.图8示出了根据本说明书的实施例的基于计算机系统实现的图数据写入装置的示
例示意图。
具体实施方式
29.现在将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本说明书内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。例如,所描述的方法可以按照与所描述的顺序不同的顺序来执行,以及各个步骤可以被添加、省略或者组合。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
30.如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
31.图数据包括顶点数据和边数据。顶点数据例如可以包括顶点标识和顶点属性。在一个示例中,顶点标识可以包括顶点id和顶点类型。在另一示例中,顶点标识可以包括顶点id。顶点标识用于唯一标识图数据中的顶点。边数据可以包括边标识和边属性。边标识可以包括起点id、边类型、边时间戳和终点id。顶点标识、边标识、顶点属性和边属性可以与业务相关。比如,对于社交网络场景,顶点id可以是人的身份证号码或者人员编号等。顶点类型可以是顶点所属分类,例如,顶点分类为用户类顶点。顶点属性可以包括年龄、学历、住址、职业等。边类型用于表示边所属类型,例如,在顶点a和b之间创建一条转账边,则该转账边的边类型可以为“转账”。边属性可以包括顶点与顶点之间所形成边的属性。例如,在上述转账边中,边属性可以包括“金额”、“货币”、“操作设备”等。术语“顶点”也可以称为图节点。在本说明书中,顶点数据可以称为顶点信息,以及边数据可以称为边信息。
32.在本说明书中,术语“热点数据”可以指代图数据库中的在单位时间内频繁更新的顶点、边或者子图。术语“行锁(row lock)”可以指代用于保护数据资源的细粒度锁,每个顶点或者每条边对应一个行锁。术语“行锁等待队列(wait list)”用于指代在行锁中创建的用于存放发生锁冲突的图数据写请求的队列。
33.在将顶点/边数据写入图数据库时,为了保证数据的准确性,需要对相应的数据资源进行加锁,并且在图数据写入完成后进行解锁。在图数据的应用场景下,存在拥有大量关联边的顶点,例如,微博大v、电商头部商家等。这些顶点在一些场景下会在瞬间接收到大量并发的写请求,由此成为热点数据。在图数据中的顶点成为热点数据时,所有对应的并发写入线程中仅仅一个写入线程能够持有该顶点的资源锁,而其它写入线程必须等待该锁释放后再逐一加锁并写入。由此可见,在热点数据的场景下,图数据库内的线程池中的大部分写入线程会被阻塞,从而导致大部分数据写入被阻塞,由此造成图数据库的整体写入tps大幅下降。此外,由于热点数据本身为瞬时并发的大量写请求,而这些写请求的锁之间存在互斥性,使得热点数据的写请求无法并发执行,从而导致热点数据的写入tps较低,无法匹配热点数据的写入规模,由此发生大量热点数据写请求失败或超时。
34.鉴于此,本说明书的实施例提供一种图数据写入方案。在该图数据写入方案中,在图数据库初始化时创建的闩锁(latch)中为图数据中的每个顶点或每条边设置具有更细粒度的行锁结构,每个行锁在闩锁中是唯一的,从而在图数据写入时减少顶点/边写入时的锁竞争,由此提升图数据库的整体写入tps。此外,每个闩锁中的行锁具有可增删性,在加锁时创建行锁,以及在解锁时释放行锁,由此实现行锁的动态管理,从而可以充分利用内存空间,使得能够使用较少的内存覆盖保护超大规模的图数据。
35.下面将参照附图描述根据本说明书的实施例的图数据写入方法及图数据写入装置。
36.图1示出了根据本说明书的实施例的图数据库中的锁结构100的示例示意图。
37.如图1所示,锁结构100包括多个闩锁(latch),每个latch下具有多个行锁(row lock),以及每个row lock内创建一个行锁等待队列(wait list)。latch在图数据库初始化时创建,用于提供对其中的row lock的临界保护。在对row lock进行加锁/解锁操作时,需要对该row lock所在的latch进行加锁。锁结构100所具有的latch数量固定,但每个latch内的row lock的数量不固定。针对一个latch,可以在对目标写入对象加锁时创建row lock,以及在对目标写入对象解锁时释放(删除)row lock。row lock内可以创建wait list,用于存放发生锁冲突的图数据写请求。
38.图2示出了根据本说明书的实施例的图数据写入方法200的示例流程图。
39.如图2所示,在210,响应于接收到用户发起的第一图数据写请求,基于第一图数据写请求中的目标写入对象的对象标识信息确定各个目标写入对象的对应行锁的行锁索引,所述目标写入对象包括目标写入顶点和/或目标写入边,每个目标写入对象对应一个行锁。例如,在目标写入对象为目标写入顶点时,对象标识信息为目标写入顶点的顶点标识,比如,顶点id和顶点类型。在目标写入对象为目标写入边时,对象标识信息为目标写入边的边标识,比如,起点id、边类型、时间戳和终点id。
40.例如,在目标写入对象为顶点时,可以基于顶点标识(例如,顶点id和顶点类型)计算出对应行锁的行锁索引index。在目标写入对象为边时,可以基于边标识(例如,起点id、边类型、边时间戳和终点id)计算出对应行锁的行锁索引index。在一个示例中,行锁索引index可以通过计算哈希值的方式确定出。比如,通过使用哈希算法计算目标写入对象的对象标识信息的哈希值确定出。哈希算法的示例可以包括但不限于一致性哈希算法或完美哈希算法。
41.在本说明书中,术语“一致性哈希算法”是指普通哈希算法。对于任意给定数据,无论经过多少次一致性哈希计算,所得到的哈希计算结果都相同。此外,一致性哈希计算可能会出现哈希碰撞。换言之,对于两个给定数据,在经过一致性哈希计算后,所得到的哈希计算结果可能会相同。
42.术语“完美哈希算法”是针对给定范围内的任意数据,经过完美哈希计算后得到的完美哈希值都不相同,从而可以利用该完美哈希值唯一地映射该数据。在进行完美哈希计算时,需要基于该给定范围内的数据在完美哈希计算过程中确定出完美哈希因子,每个数据或者多个数据可以对应一个完美哈希因子。在使用完美哈希算法对数据进行完美哈希计算时,可以确保该给定范围内的数据所得到的完美哈希值是唯一值。这里,完美哈希值的唯一性相对于该给定范围内的数据,根据该给定范围之外的数据得到的哈希值可能会与该给
定范围内的数据所对应的完美哈希值相同。
43.在220,基于各个目标写入对象的行锁索引,为第一图数据写请求中的各个目标写入对象加锁。
44.图3示出了根据本说明书的实施例的写入对象加锁过程300的示例流程图。
45.如图3所示,在310,基于第一图数据写请求中的各个目标写入对象的行锁索引,确定各个目标写入对象的加锁顺序。例如,可以基于哈希计算确定的行锁索引的索引值的大小来对各个目标写入对象进行加锁排序。
46.具体地,例如,对于顶点,使用顶点id与顶点type进行哈希计算得到顶点的行锁索引,即,rowindex=hash(id,type)。对于边,使用起点id(srcid)、边类型(type)、边时间戳(timestamp)和终点id(dstid)进行哈希计算得到边的行锁索引,即,rowindex=hash(srcid,type,timestamp,dstid)。在确定出目标写入对象的行锁索引rowindex后,对rowindex进行以闩锁大小(latchsize)为模数的取模运算,由此得到该rowindex所在闩锁的闩锁索引latchindex。
47.在进行加锁排序时,首先基于rowindex所在闩锁的latchindex进行排序。接着,针对latchindex相同的rowindex,基于rowindex进行排序。例如,假设针对目标写入对象a、b、c和d,通过上述计算所得到的<latchindex,rowindex>分别为<1,6>、<2,4>、<1,5>和<2,3>,则目标写入对象a、b、c和d的加锁顺序为<c,a,d,b>。
48.在320,按照所确定的加锁顺序,为第一图数据写请求中的各个目标写入对象加锁。在进行行锁加锁处理时,可以基于latchindex获取latch并对所获取的latch进行加锁。第一图数据写请求中的各个目标写入对象加锁过程是依序进行的循环过程。
49.图4示出了根据本说明书的实施例的写入对象顺序加锁过程400的示例流程图。
50.如图4所示,在410,按照所确定的加锁顺序,从第一图数据写请求中顺序取出当前未加锁的目标写入对象。
51.针对所取出的目标写入对象,根据该目标写入对象的行锁索引查询所在闩锁中是否存在对应的行锁。具体地,在420,基于该目标写入对象的行锁索引rowindex找到所在闩锁。例如,通过对rowindex进行以latchsize为模数的取模运算得到latchindex,然后基于latchindex找到该rowindex所在闩锁latch。在找到所在闩锁latch后,在430,基于行锁索引rowindex在该闩锁中查询是否存在对应的行锁。
52.如果在所在闩锁中不存在对应的行锁时,则在440,在所在闩锁中为所取出的目标写入对象创建行锁,由此完成针对该目标写入对象的加锁。然后,流程进行到450,在450中,判断第一图数据写请求中是否存在未进行加锁处理的目标写入对象。如果存在未进行加锁处理的目标写入对象,则返回到410,执行针对下一目标写入对象的加锁处理过程。如果不存在未进行加锁处理的目标写入对象,则针对第一图数据写请求的加锁处理过程结束。
53.在所在闩锁中存在对应的行锁时,在460,将第一图数据写请求放入该行锁的行锁等待队列,由此结束针对第一图数据写请求的加锁处理过程。
54.回到图3,在如上完成针对第一图数据写请求的加锁处理过程后,在330,将已加锁的行锁信息记录在写请求记录中,所记录的行锁信息至少包括行锁的行锁索引rowindex。可选地,在一个示例中,所记录的行锁信息还可以包括行锁所在闩锁的闩锁索引latchindex。要说明的是,在其它实施例中,330的操作也可以紧接在图4中的440之后执行,
即,每当针对一个目标写入对象完成加锁,就将对应的行锁信息记录在写请求记录中。
55.在如上完成针对第一图数据写请求的加锁处理后,在230,执行针对第一图数据写请求的图数据写入。这里,图数据写入过程可以采用本领域的任何适用的数据写入方式实现,在此不进行详细描述。
56.在第一图数据写请求中的各个目标写入对象的图数据写入完成后,在240,对第一图数据写请求持有的行锁进行解锁。第一图数据写请求所持有行锁的解锁过程是循环处理过程,直到第一图数据写请求持有的所有行锁完成解锁。
57.图5示出了根据本说明书的实施例的行锁解锁过程500的示例流程图。
58.如图5所示,在每次循环时,在510,从第一图数据写请求的写请求记录中取出未解锁的行锁信息。
59.在520,基于所取出的行锁信息中的行锁索引,查询对应的行锁等待队列,并且在530,判断对应的行锁等待队列中是否存在等待写入的图数据写请求。
60.如果行锁等待队列中存在等待写入的图数据写请求,则在540,将行锁索引所对应的行锁的持有权传递给位于行锁等待队列队首的第二图数据写请求,由此完成该行锁与第一图数据写请求之间的解锁处理。然后,流程进行到560。
61.如果行锁等待队列中不存在等待写入的第二图数据写请求,则在550,从所在闩锁中删除行锁索引所对应的行锁,由此完成该行锁的解锁处理。然后,流程进行到560。
62.在560,判断写请求记录中是否存在未处理的行锁信息。如果存在未处理的行锁信息,则返回到510,针对下一行锁信息执行行锁解锁处理。如果不存在未处理的行锁信息,则针对第一图数据写请求的行锁解锁处理完成。
63.在一个示例中,写请求记录中的行锁信息还可以包括行锁所在闩锁的闩锁索引。在这种情况下,在对行锁索引所对应的行锁进行解锁处理时,可以对闩锁索引所索引的闩锁(即,行锁所在闩锁)进行加锁。
64.可选地,在一个示例中,在将行锁索引所对应的行锁的持有权传递给位于行锁等待队列队首的第二图数据写请求后,还可以触发针对第二图数据写请求的异步重试来执行针对第二图数据写请求的图数据写入过程。针对第二图数据写请求的图数据写入过程可以参照与第一图数据写请求的图数据写入过程相同的方式执行。
65.可选地,在一个示例中,在第二图数据写请求被触发异步重试后,还可以访问第二图数据写请求所在的行锁等待队列,以确定行锁等待队列中是否存在可合并处理的第三图数据写请求。如果在行锁等待队列中存在可合并处理的第三图数据写请求时,则将第二图数据写请求与第三图数据写请求合并为新的图数据写请求。然后,基于新的图数据写请求来执行图数据写入。
66.可选地,在一个示例中,在针对第二图数据写请求或者新的图数据写请求进行图数据写入时,第二图数据写请求或者新的图数据写请求中已经加锁的目标写入对象无需再次加锁。
67.回到图2,在第一图数据写请求持有的所有行锁完成解锁后,在250,将图数据写入结果提供给用户。在本说明书中,图数据写入结果的示例例如可以包括但不限于:图数据写入成功,图数据写入失败(附加失败原因)、图数据写入超时等。
68.要说明的是,在图数据写入包括多个图数据写请求的情况下,可以针对多个图数
据写请求并行执行上述图数据写入方法。
69.下面以一个示例来描述根据本说明书的实施例的图数据写入过程。在该示例中,图数据写入装置同时接收到3个图数据写请求,即,写请求1、写请求2和写请求3,其中,写请求1包括三个目标写入顶点<d,b,c>,写请求2包括三个目标写入顶点<e,f,c>,以及写请求1包括三个目标写入顶点<a,c,g>。
70.在执行图数据写入时,图数据写入装置并发执行写请求1、写请求2和写请求3。首先,图数据写入装置分别根据写请求1、写请求2和写请求3中的顶点信息计算各个顶点对应的row lock的rowindex,并根据rowindex进行加锁排序。例如,写请求1的rowindex与加锁顺序为<rowindex_b,rowindex_c,rowindex_d>,写请求2的rowindex与加锁顺序为<rowindex_c,rowindex_e, rowindex_f>,以及写请求3的rowindex与加锁顺序为<rowindex_a,rowindex_c,rowindex_g>。
71.三个写请求并发地按照各自确定出的加锁顺序对顶点进行加锁。假设写请求2首先对顶点c加锁成功,则三个写请求的加锁过程如下。
72.写请求1首先根据rowindex_b计算出对应的latchindex,由此找到对应的latch。此时该latch内没有与顶点b对应的row_lock_b,从而在latch内创建row_lock_b,顶点b加锁成功。接着,执行顶点c的加锁处理。在进行顶点c的加锁处理时,由于对应latch中已经存在row_lock_c(写请求2所创建的),从而将写请求1放入row_lock_c的wait list中等待row_lock_c释放。
73.写请求2按照顶点c、e和f的加锁顺序依次加锁,并且在加锁成功后执行图数据写入操作。
74.写请求3首先根据rowindex_a计算出对应的latchindex,由此找到对应的latch。此时该latch内没有与顶点a对应的row_lock_a,从而在latch内创建row_lock_a,顶点a加锁成功。接着,执行顶点c的加锁处理。在进行顶点c的加锁处理时,由于对应latch中已经存在row_lock_c(写请求2所创建的),从而将写请求3放入row_lock_c的wait list中等待row_lock_c释放。
75.在写请求2完成图数据写入操作后,开始执行解锁操作。在进行解锁操作时,首先释放row_lock_c。在释放row_lock_c时,发现row_lock_c的wait list中存在写请求1和写请求3,并且写请求1排在wait list的队首。在这种情况下,将row_lock_c的持有权传递到写请求1,并且触发写请求1的异步重试,由此针对写请求2完成row_lock_c释放。随后,依次释放row_lock_e和row_lock_f。由于row_lock_e和row_lock_f的wait list没有等待写入的写请求,从而从所在latch中删除row_lock_e和row_lock_f。
76.在写请求1的异步重试时,首先查看row_lock_c的wait list是否存在可与写请求1合并的写请求,例如,发现可与写请求1合并的写请求3,则将写请求1和写请求3合并为新的写请求4<a,b,c,d,g>,然后针对写请求4执行图数据写入。针对写请求4的图数据写入过程与针对写请求2的图数据写入过程相同。
77.具体地,计算写请求4中的5个顶点a,b,c,d和g的行锁索引rowindex_a,rowindex_b,rowindex_c,rowindex_d,rowindex_g,并确定加锁顺序< rowindex_a, rowindex_b,rowindex_c,rowindex_d,rowindex_g>。然后,按照上述加锁顺序对顶点a,b,c,d和g依次加锁。在一个示例中,由于顶点a、b和c已经完成加锁,从而在针对写请求4的加锁处理时,可以
不再对顶点a、b和c进行加锁,而仅仅对未加锁的顶点d和g依次加锁,在加锁成功后,针对写请求4执行后续图数据写入操作。
78.在写请求4的图数据写入完成后,释放并删除行锁row_lock_a、row_lock_b、row_lock_c、row_lock_d和row_lock_g。然后,返回写请求1和写请求2的图数据写入结果。
79.如上参照图1到图5描述了根据本说明书的实施例的图数据写入方法。
80.利用上述图数据写入方法,通过在图数据库初始化时创建的闩锁(latch)中为图数据中的每个顶点或每条边设置具有更细粒度的行锁结构来替换原有的桶锁(bucket lock)结构,每个行锁在闩锁中是唯一的并且与唯一的顶点或边对应,从而使得在图数据写入时仅仅相同的顶点或边才会发生锁冲突,由此减少顶点/边写入时的锁竞争,进而提升图数据库的整体写入tps。此外,每个闩锁中的行锁具有可增删性,由此实现行锁的动态管理,从而可以充分利用内存空间,使得能够使用较少内存覆盖保护超大规模的图数据。
81.利用上述图数据写入方法,通过在每个行锁中创建行锁等待队列来存放发生锁冲突的图数据写请求,使得由于热点数据导致的锁冲突不再阻塞图数据库内的线程池中的其它写入线程,从而大大提升存在热点数据时的图数据库的整体写入tps。
82.利用上述图数据写入方法,通过在触发第二图数据写请求的异步重试时,合并行锁等待队列中的其它可合并图数据写请求,可以解决热点数据写请求时由于无法并发执行而导致的写入tps低的问题。
83.图6示出了根据本说明书的实施例的图数据写入装置600的示例方框图。如图6所示,图数据写入装置600可以包括行锁索引确定单元610、加锁单元620、数据写入单元630、解锁单元640和写入结果提供单元650。
84.行锁索引确定单元610被配置为响应于接收到用户发起的第一图数据写请求,基于第一图数据写请求中的目标写入对象的对象标识信息确定各个目标写入对象的对应行锁的行锁索引,所述目标写入对象包括目标写入顶点和/或目标写入边,每个目标写入对象对应一个行锁。行锁索引确定单元610的操作可以参考上面参照图2的210描述的操作。
85.加锁单元620被配置为基于各个目标写入对象的行锁索引,为第一图数据写请求中的各个目标写入对象加锁。加锁单元620的操作可以参考上面参照图2的220描述的操作以及参照图3和图4描述的操作。
86.数据写入单元630被配置为在第一图数据写请求中的各个目标写入对象完成加锁后,执行针对第一图数据写请求的图数据写入。数据写入单元630的操作可以参考上面参照图2的230描述的操作。
87.解锁单元640被配置为在第一图数据写请求中的各个目标写入对象的图数据写入完成后,对第一图数据写请求持有的行锁进行解锁。解锁单元640的操作可以参考上面参照图2的240描述的操作以及参照图5描述的操作。
88.写入结果提供单元650被配置为在第一图数据写请求持有的所有行锁完成解锁后,将图数据写入结果提供给用户。写入结果提供单元650的操作可以参考上面参照图2的250描述的操作。
89.图7示出了根据本说明书的实施例的加锁单元620的示例方框图。如图7所示,加锁单元620包括加锁顺序确定模块621、加锁模块623和加锁信息记录模块625。
90.加锁顺序确定模块621被配置为基于第一图数据写请求中的各个目标写入对象的
行锁索引,确定各个目标写入对象的加锁顺序。加锁顺序确定模块621的操作可以参考上面参照图3描述的310的操作。
91.加锁模块623被配置为按照所确定的加锁顺序,为第一图数据写请求中的各个目标写入对象加锁。加锁模块623的操作可以参考上面参照图3的320描述的操作以及参照图4描述的操作。
92.加锁模块623的操作过程为循环过程。具体地,加锁模块623针对第一图数据写请求循环执行下述加锁过程,直到各个目标写入对象完成加锁或者第一图数据写请求被放入行锁等待队列。
93.在每次循环时,加锁模块623按照所确定的加锁顺序,从第一图数据写请求中顺序取出当前未加锁的目标写入对象,并且针对所取出的目标写入对象,根据该目标写入对象的行锁索引查询所在闩锁中是否存在对应的行锁。在所在闩锁中不存在对应的行锁时,加锁模块623在所在闩锁中为所取出的目标写入对象创建行锁。在所在闩锁中存在对应的行锁时,加锁模块623将第一图数据写请求放入该行锁的行锁等待队列。
94.加锁信息记录模块625被配置为将已加锁的行锁信息记录在写请求记录中,所记录的行锁信息至少包括行锁的行锁索引。加锁信息记录模块625的操作可以参考上面参照图3的330描述的操作。
95.解锁单元640针对第一图数据写请求所持有行锁执行的解锁过程是循环处理过程,直到第一图数据写请求持有的所有行锁完成解锁。具体地,在每次循环时,解锁单元640从第一图数据写请求的写请求记录中取出未解锁的行锁信息,并且基于所取出的行锁信息中的行锁索引,查询对应的行锁等待队列中是否存在等待写入的图数据写请求。在行锁等待队列中存在等待写入的图数据写请求时,解锁单元640将行锁索引所对应的行锁的持有权传递给位于行锁等待队列队首的第二图数据写请求。在行锁等待队列中不存在等待写入的图数据写请求时,解锁单元640从行锁索引所对应的行锁所在闩锁中删除该行锁。
96.此外,可选地,在一个示例中,图数据写入装置600还可以包括异步重试触发单元(未示出)。所述异步重试触发单元触发第二图数据写请求的异步重试来执行针对第二图数据写请求的图数据写入操作。
97.此外,可选地,在一个示例中,图数据写入装置600还可以包括可合并写请求确定单元和写请求合并单元。响应于第二图数据写请求被触发异步重试,可合并写请求确定单元访问第二图数据写请求所在的行锁等待队列,以确定行锁等待队列中是否存在可合并处理的第三图数据写请求。在行锁等待队列中存在可合并处理的第三图数据写请求时,写请求合并单元将第二图数据写请求与第三图数据写请求合并为新的图数据写请求来进行图数据写入。这里,第三图数据写请求可以包括一个或多个第三图数据写请求。
98.如上参照图1到图7,对根据本说明书实施例的图数据写入方法以及图数据写入装置进行了描述。上面的图数据写入装置可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。
99.图8示出了根据本说明书的实施例的基于计算机系统实现的图数据写入装置800的示意图。如图8所示,图数据写入装置800可以包括至少一个处理器810、存储器(例如,非易失性存储器)820、内存830和通信接口840,并且至少一个处理器810、存储器820、内存830和通信接口840经由总线860连接在一起。至少一个处理器810执行在存储器中存储或编码
的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
100.在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器810:响应于接收到用户发起的第一图数据写请求,基于第一图数据写请求中的目标写入对象的对象标识信息确定各个目标写入对象的对应行锁的行锁索引,所述目标写入对象包括目标写入顶点和/或目标写入边,每个目标写入对象对应一个行锁;基于各个目标写入对象的行锁索引,为第一图数据写请求中的各个目标写入对象加锁;在第一图数据写请求中的各个目标写入对象完成加锁后,执行针对第一图数据写请求的图数据写入;在第一图数据写请求中的各个目标写入对象的图数据写入完成后,对第一图数据写请求持有的行锁进行解锁;以及在第一图数据写请求持有的所有行锁完成解锁后,将图数据写入结果提供给用户。
101.应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器810进行本说明书的各个实施例中以上结合图1

图7描述的各种操作和功能。
102.根据一个实施例,提供了一种比如机器可读介质(例如,非暂时性机器可读介质)的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本说明书的各个实施例中以上结合图1

图7描述的各种操作和功能。具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
103.在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
104.可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如cd

rom、cd

r、cd

rw、dvd

rom、dvd

ram、dvd

rw、dvd

rw)、磁带、非易失性存储卡和rom。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
105.根据一个实施例,提供一种计算机程序产品,该计算机程序产品包括计算机程序,该计算机程序当被处理器执行时,使得处理器执行本说明书的各个实施例中以上结合图1

图7描述的各种操作和功能。
106.本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。
107.需要说明的是,上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
108.以上各实施例中,硬件单元或模块可以通过机械方式或电气方式实现。例如,一个硬件单元、模块或处理器可以包括永久性专用的电路或逻辑(如专门的处理器,fpga或asic)来完成相应操作。硬件单元或处理器还可以包括可编程逻辑或电路(如通用处理器或其它可编程处理器),可以由软件进行临时的设置以完成相应操作。具体的实现方式(机械方式、或专用的永久性电路、或者临时设置的电路)可以基于成本和时间上的考虑来确定。
109.上面结合附图阐述的具体实施方式描述了示例性实施例,但并不表示可以实现的或者落入权利要求书的保护范围的所有实施例。在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
110.本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献