掌桥专利:专业的专利平台
掌桥专利
首页

基于范围分区的跳跃表的处理方法及装置

文献发布时间:2023-06-19 18:58:26


基于范围分区的跳跃表的处理方法及装置

技术领域

本申请涉及计算机技术领域,具体涉及一种基于范围分区的跳跃表的处理方法及装置。

背景技术

现有区块链的底层KV库使用跳跃表存储数据。对于跳跃表,新元素的插入和存量元素的更新、删除一样,均需定位到具体元素位置,然后插入、更新或删除元素。按跳跃表的定义,跳跃表支持一写多读,写会阻塞其他写和其他读。

由于跳跃表一写多读的特点,虽然跳跃表更新的时间复杂度是O(logn),但当跳跃表较大时,更新跳跃表仍会导致其他读写请求阻塞,降低读写并发度。

发明内容

针对现有技术中的问题,本申请实施例提供一种基于范围分区的跳跃表的处理方法及装置,能够至少部分地解决现有技术中存在的问题。

一方面,本申请提出一种基于范围分区的跳跃表的处理方法,包括:

获取针对目标元素的操作请求,所述请求中包括所述目标元素的信息;

根据所述目标元素的信息,确定所述目标元素所在的分区,其中,每个分区按照元素键值的范围划分;

根据所述操作请求的请求类型,利用所述目标元素的信息对所述分区所对应的跳跃表执行相应操作。

在一些实施例中,所述根据所述操作请求的请求类型,利用所述目标元素的信息对所述分区所对应的跳跃表执行相应操作包括:

若所述操作请求为读请求,则利用所述目标元素的键值,在所述分区所对应的跳跃表中查找并读取所述目标元素的值;和/或

若所述操作请求为写请求,则根据所述目标元素的键值将所述目标元素插入所述分区所对应的跳跃表,得到所述分区所对应的新的跳跃表。

在一些实施例中,所述方法还包括:

若所述分区所对应的跳跃表的元素总记录数大于第一预设阈值,则将所述跳跃表拆分成至少两个新的跳跃表。

在一些实施例中,所述若所述分区所对应的跳跃表的元素总记录数大于预设阈值,则将所述跳跃表拆分成至少两个新的跳跃表包括:

若所述分区所对应的跳跃表的元素总记录数大于第一阈值,则在所述跳跃表的最底层链表中查找在所述跳跃表的元素总记录数的二分之一位置处的第一元素以及位于所述第一元素之后的第二元素;

根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表;

根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表。

在一些实施例中,所述根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第一元素,则将所述第一元素的后继元素修改为尾元素,否则,则将该层链表中键值小于所述第一元素的键值且位置最靠后的元素的后继元素修改为尾元素,得到第一跳跃表。

在一些实施例中,所述根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第二元素,则将所述第二元素的前驱元素修改为头元素,否则,则将该层链表中键值大于所述第二元素的键值且位置最靠前的元素的前驱元素修改为头元素,得到第二跳跃表。

在一些实施例中,所述方法还包括:

若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则将所述跳跃表与相邻分区的跳跃表合并,生成新的跳跃表。

在一些实施例中,所述若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则将所述跳跃表与相邻分区的跳跃表合并,生成新的跳跃表包括:

若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则获取相邻分区中跳跃表的元素总记录数较小的跳跃表;

若所述分区中的键值小于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述元素总记录数较小的跳跃表的对应层链表除头元素之外的第一个元素;

对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述跳跃表的对应层链表除尾元素之外的最后一个元素,得到新的跳跃表。

在一些实施例中,所述方法还包括:

若所述分区中的键值大于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述元素总记录数较小的跳跃表的对应层链表除尾元素之外的最后一个元素;

对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述跳跃表的对应层链表除头元素之外的第一个元素,得到新的跳跃表。

第二方面,本申请提出一种基于范围分区的跳跃表的处理装置,包括:

获取模块,用于获取针对目标元素的操作请求,所述请求中包括所述目标元素的信息;

确定模块,用于根据所述目标元素的信息,确定所述目标元素所在的分区,其中,每个分区按照元素键值的范围划分;

执行模块,用于根据所述操作请求的请求类型,利用所述目标元素的信息对所述分区所对应的跳跃表执行相应操作。

在一些实施例中,所述执行模块具体用于:

若所述操作请求为读请求,则利用所述目标元素的键值,在所述分区所对应的跳跃表中查找并读取所述目标元素的值;和/或

若所述操作请求为写请求,则根据所述目标元素的键值将所述目标元素插入所述分区所对应的跳跃表,得到所述分区所对应的新的跳跃表。

在一些实施例中,所述装置还包括:

拆分模块,用于若所述分区所对应的跳跃表的元素总记录数大于第一预设阈值,则将所述跳跃表拆分成至少两个新的跳跃表。

在一些实施例中,所述拆分模块具体用于:

若所述分区所对应的跳跃表的元素总记录数大于第一阈值,则在所述跳跃表的最底层链表中查找在所述跳跃表的元素总记录数的二分之一位置处的第一元素以及位于所述第一元素之后的第二元素;

根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表;

根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表。

在一些实施例中,所述拆分模块根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第一元素,则将所述第一元素的后继元素修改为尾元素,否则,则将该层链表中键值小于所述第一元素的键值且位置最靠后的元素的后继元素修改为尾元素,得到第一跳跃表。

在一些实施例中,所述拆分模块根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第二元素,则将所述第二元素的前驱元素修改为头元素,否则,则将该层链表中键值大于所述第二元素的键值且位置最靠前的元素的前驱元素修改为头元素,得到第二跳跃表。

在一些实施例中,所述装置还包括:

合并模块,用于若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则将所述跳跃表与相邻分区的跳跃表合并,生成新的跳跃表。

在一些实施例中,所述合并模块具体用于:

若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则获取相邻分区中跳跃表的元素总记录数较小的跳跃表;

若所述分区中的键值小于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述元素总记录数较小的跳跃表的对应层链表除头元素之外的第一个元素;

对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述跳跃表的对应层链表除尾元素之外的最后一个元素,得到新的跳跃表。

在一些实施例中,所述合并模块还用于:

若所述分区中的键值大于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述元素总记录数较小的跳跃表的对应层链表除尾元素之外的最后一个元素;

对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述跳跃表的对应层链表除头元素之外的第一个元素,得到新的跳跃表。

本申请实施例还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一实施例所述的基于范围分区的跳跃表的处理方法的步骤。

本申请实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述任一实施例所述的基于范围分区的跳跃表的处理方法的步骤。

本申请实施例提供的基于范围分区的跳跃表的处理方法及装置,针对跳跃表只能一写多读的特点,按键值范围将某一大容量的跳跃表拆分为多个跳跃表,拆分后的某一跳跃表更新时,其他跳跃表仍可以正常读写,避免了因跳跃表容量过大导致跳跃表更新时长时间阻塞其他读写请求的问题。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:

图1是本申请一实施例提供的跳跃表的结构示意图。

图2是本申请一实施例提供的跳跃表的结构示意图。

图3是本申请一实施例提供的跳跃表的结构示意图。

图4是本申请一实施例提供的基于范围分区的跳跃表的处理方法的流程示意图。

图5是本申请一实施例提供的跳跃表分区的划分方法示意图。

图6是本申请一实施例提供的跳跃表的结构示意图。

图7是本申请一实施例提供的基于范围分区的跳跃表的处理方法的部分流程示意图。

图8是本申请一实施例提供的跳跃表的结构示意图。

图9是本申请一实施例提供的跳跃表的结构示意图。

图10是本申请一实施例提供的跳跃表的结构示意图。

图11是本申请一实施例提供的基于范围分区的跳跃表的处理方法的部分流程示意图。

图12是本申请一实施例提供的基于范围分区的跳跃表的处理方法的部分流程示意图。

图13是本申请一实施例提供的基于范围分区的跳跃表的处理装置的流程示意图

图14是本申请一实施例提供的电子设备的实体结构示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本申请实施例做进一步详细说明。在此,本申请的示意性实施例及其说明用于解释本申请,但并不作为对本申请的限定。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意排序。

关于本文中所使用的“第一”、“第二”、……等,并非特别指称次序或顺位的意思,亦非用以限定本申请,其仅为了区别以相同技术用语描述的元件或操作。

关于本文中所使用的“包含”、“包括”、“具有”、“含有”等等,均为开放性的用语,即意指包含但不限于。

关于本文中所使用的“及/或”,包括所述事物的任一或全部排序。

为更好地理解本申请,以下先对本申请的研究背景进行详细说明。

跳跃表有多层,每一层均是一个有序单向链表,包含头元素Head和尾元素Tail,可以升序也可以降序。最底层Level1的链表包含所有元素,其余层链表包含的元素少于下一层。每一个元素存在于多少层链表,由给定的概率决定。若给定概率为i,则某个元素存在于第i层链表的概率为p(i)=k

举例而言,如图1所示,Level1链表包含所有元素A、C、E、F,每个元素存在于第i层链表的概率为50%。Level2链表包含2个元素A和E,Level3链表包含1个元素E。

跳跃表新元素的新增过程如下:假设链表是升序排序,层高为h,元素存在于第i层链表的概率为p(i)=k

举例而言,如图2所示,需往跳跃表插入元素D,跳跃表层高为3,元素存在于第i层链表的概率为50%。对于待插入元素D,先从Level3链表开始查找,在该层链表找到第1个key值大于或等于给定元素D的key值的元素E,记录下其前驱元素Head。然后Level2的Head元素开始查找,找到第1个key值大于或等于给定元素D的key值的元素E,记录下其前驱元素A。然后继续在Level1的元素A开始查找,找到第1个key值大于或等于给定元素D的key值的元素E,记录下其前驱元素C。最终得到各层待插入位置的前驱元素[Head,A,C]。按50%概率确定待插入元素D插入的链表层数,如元素D占用Level1和Level2。依据各层待插入位置前驱元素[Head,A,C],对于Level1,把元素C的后继元素改为D,元素D的后继元素改为E;对于Level2,把元素A的后继元素改为D,元素D的后继元素改为E。最终得到图2所示的跳跃表结构。

跳跃表元素删除过程如下:假设链表是升序排序,层高为h,元素存在于第i层链表的概率为p(i)=k

举例而言,如图3所示:需在跳跃表删除元素E,跳跃表层高为3,元素存在于第i层链表的概率为50%。对于待删除元素E,先从Level3链表开始查找,在该层链表找到第1个大于或等于待删除元素E的元素E,记录下其前驱元素Head。然后Level2的Head元素开始查找,找到第1个key值大于或等于待删除元素E的key值的元素E,记录下其前驱元素A。然后继续在Level1的元素A开始查找,找到第1个key值大于或等于待删除元素E的key值的元素E,记录下其前驱元素C。最终得到各层待删除元素E的前驱元素[Head,A,C]。元素E占用了3层,依据各层待前驱元素[Head,A,C],对于Level1,把元素C的后继元素改为F;对于Level2,把元素A的后继元素改为元素Tail;对于Level3,把元素Head的后继元素改为元素Tail,因Level3已无其他元素,因此跳跃表的高度改为2。最终得到图3所示的跳跃表结构。

跳跃表元素更新过程和元素删除过程类似,若Level1层里面没有找到待更新元素,则更新失败;否则更新待更新元素。

图4是本申请一实施例提供的基于范围分区的跳跃表的处理方法的流程示意图,本申请实施例提供的基于范围分区的跳跃表的处理方法的执行主体包括但不限于计算机。如图4所示,本申请实施例提供的基于范围分区的跳跃表的处理方法,包括:

S101、获取针对目标元素的操作请求,所述请求中包括所述目标元素的信息;

S102、根据所述目标元素的信息,确定所述目标元素所在的分区,其中,每个分区按照元素键值的范围划分;

S103、根据所述操作请求的请求类型,利用所述目标元素的信息对所述分区所对应的跳跃表执行相应操作。

本申请针对跳跃表只能一写多读的特点,提出一种按键值范围划分跳跃表的方法,将某一大容量的跳跃表拆分为多个跳跃表,拆分后的某一跳跃表更新时,其他跳跃表仍可以正常读写,避免了因跳跃表容量过大导致跳跃表更新时长时间阻塞其他读写请求的问题。

在一些实施例中,所述根据所述操作请求的请求类型,利用所述目标元素的信息对所述分区所对应的跳跃表执行相应操作包括:

若所述操作请求为读请求,则利用所述目标元素的键值,在所述分区所对应的跳跃表中查找并读取所述目标元素的值;和/或

若所述操作请求为写请求,则根据所述目标元素的键值将所述目标元素插入所述分区所对应的跳跃表,得到所述分区所对应的新的跳跃表。

具体来讲,每个元素以键值对表示,在操作请求为读请求时,该请求中包括目标元素的key值,利用该key值确定所述目标元素所在的分区,并在该分区所对应的跳跃表中查找并读取所述目标元素的value值。在操作请求为写请求时,该请求中包括目标元素的key值和value值,利用该key值确定所述目标元素所在的分区,并将该目标元素(键值对)插入到该分区所对应的跳跃表中,得到该分区所对应的新的跳跃表,此外,写操作完成后,更新跳跃表的总记录数。举例而言,图5为一基于范围分区的跳跃表结构,每个分区按key值的范围划分,每个分区对应一个跳跃表;图6为每个分区的跳跃表结构,相对于传统的跳跃表,每个元素增加了双向指针,指向其前驱元素。

在一些实施例中,所述方法还包括:若所述分区所对应的跳跃表的元素总记录数大于第一预设阈值,则将所述跳跃表拆分成至少两个新的跳跃表。

具体来讲,在跳跃表添加新元素后,跳跃表的容量增大,在跳跃表的容量过大时,可通过扩容的方式将跳跃表拆分为多个新的跳跃表,以避免跳跃表容量过大导致跳跃表更新时长时间阻塞其他读写请求。

如图7所示,在一些实施例中,所述若所述分区所对应的跳跃表的元素总记录数大于预设阈值,则将所述跳跃表拆分成至少两个新的跳跃表包括:

S104、若所述分区所对应的跳跃表的元素总记录数大于第一阈值,则在所述跳跃表的最底层链表中查找在所述跳跃表的元素总记录数的二分之一位置处的第一元素以及位于所述第一元素之后的第二元素;

S105、根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表;

S106、根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表。

具体来讲,扩容的目标,是将容量过大的跳跃表拆分为2个大小大致相等的跳跃表。举例而言,若待扩容的跳跃表为A,分区范围为[F

在一些实施例中,所述根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第一元素,则将所述第一元素的后继元素修改为尾元素,否则,则将该层链表中键值小于所述第一元素的键值且位置最靠后的元素的后继元素修改为尾元素,得到第一跳跃表。

具体来讲,以将上述待扩容的跳跃表A拆分为跳跃表A1和A2为例。

跳跃表A1的构造方法为:在跳跃表A中,从Level1层的元素X

第1步,若在当前层找出的所述最后一个元素为X

第2步,判断当前层的元素X

第3步,对元素X″

第4步,把[X

第5步,把跳跃表A1挂到分区[F

举例而言,如图8所示,待扩容的跳跃表A,分区范围为[A,F],总记录数为4,最大层高为3。先在Level1层遍历元素,找到位置为跳跃表A总记录数/2的元素C,然后记录下C的后继元素E。把跳跃表A的分区拆成2个跳跃表A1和A2,分别对应分区[A,C]和[E,F]。跳跃表A1得构造过程如下:

在跳跃表A中,从Level1层的元素C开始,寻找每一层作为跳跃表A1除Tail元素之外的最后一个元素,然后把这些元素的后继元素改为Tail元素。具体的:

1、Level1层的所述最后一个元素为元素C。

2、元素C没有Level2层,找到元素C的前驱元素A。

3、元素A有Level2层,则Level2层的所述最后一个元素为A。

4、元素A没有Level3层,找到元素A的前驱元素Head。

5、元素Head有Level3层,找到Level3层的所述最后一个元素Head。

6、Level3层已是最高层,最终得到每层链表的所述最后一个元素[Head,A,C]。

7、把[Head,A,C]的后继元素改为Tail元素,把Tail元素的前驱元素设为[Head,A,C]。跳跃表A1的总记录数设置为跳跃表A总记录数/2,即2。

8、把跳跃表A1挂到分区[A,C]下,得到如图9所示的跳跃表A1。

在一些实施例中,所述根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第二元素,则将所述第二元素的前驱元素修改为头元素,否则,则将该层链表中键值大于所述第二元素的键值且位置最靠前的元素的前驱元素修改为头元素,得到第二跳跃表。

具体来讲,以将上述待扩容的跳跃表A拆分为跳跃表A1和A2为例。

跳跃表A2的构造方法为:在跳跃表A中,从Level1层的元素X

第1步,若在当前层找出的所述第一个元素为X

第2步,判断当前层的元素X

第3步,对元素X″

第4步,把[X

第5步,把跳跃表A2挂到分区[X

举例而言,如图8所示,待扩容的跳跃表A,分区范围为[A,F],总记录数为4,最大层高为3。先在Level1层遍历元素,找到位置为跳跃表A总记录数/2的元素C,然后记录下C的后继元素E。把跳跃表A的分区拆成2个跳跃表A1和A2,分别对应分区[A,C]和[E,F]。跳跃表A2的构造过程如下:

在跳跃表A中,从Level1层的元素E开始,寻找每一层作为跳跃表A2除Head元素之外的第一个元素,然后把这些元素的前驱元素改为Head元素。具体的:

1、Level1层的所述第一个元素为元素E。

2、元素E有Level2层,则Level2层的所述第一个元素也为元素E。

3、元素E有Level3层,则Level3层的所述第一个元素也为元素E。

4、Level3层已是最高层,最终得到每层链表的所述第一个元素[E,E,E]。

5、把[E,E,E]的前驱元素改为Head元素,把Head元素的后继元素设为[E,E,E]。跳跃表A2的总记录数设置为跳跃表A总记录数-跳跃表A总记录数/2,即2。

6、把跳跃表A2挂到分区[E,F]下,得到如图10所示的跳跃表A2。

在一些实施例中,所述方法还包括:若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则将所述跳跃表与相邻分区的跳跃表合并,生成新的跳跃表。

具体来讲,在从跳跃表删除元素后,跳跃表的容量会变小,在跳跃表的容量过小时,可通过缩容的方式合并其他跳跃表,避免跳跃表过多降低读写性能。

如图11所示,在一些实施例中,所述若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则将所述跳跃表与相邻分区的跳跃表合并,生成新的跳跃表包括:

S107、若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则获取相邻分区中跳跃表的元素总记录数较小的跳跃表;

S108、若所述分区中的键值小于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述元素总记录数较小的跳跃表的对应层链表除头元素之外的第一个元素;

S109、对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述跳跃表的对应层链表除尾元素之外的最后一个元素,得到新的跳跃表。

具体来讲,若待合并的跳跃表为A,跳跃表A升序排序,跳跃表A对应的分区范围为[F

从跳跃表A的最高层开始,找到各层元素Tail的前驱元素[Y

如图12所示,在一些实施例中,所述方法还包括:

S110、若所述分区中的键值大于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述元素总记录数较小的跳跃表的对应层链表除尾元素之外的最后一个元素;

S111、对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述跳跃表的对应层链表除头元素之外的第一个元素,得到新的跳跃表。

具体来讲,若待合并的跳跃表为A,跳跃表A升序排序,跳跃表A对应的分区范围为[F

从跳跃表A1的最高层开始,找到各层元素Tail的前驱元素[Y

以图9中的跳跃表A1和图10中的跳跃表A2为例,举例说明如何把跳跃表A1和跳跃表A2合并成如图8所示的跳跃表A:

1、跳跃表为A1和A2,其分区范围为[A,C]和[E,F]。若[E,F]>[A,C],故应把跳跃表A2添加到跳跃表A1的末尾。

2、跳跃表A1各层元素Tail的前驱元素为[Head,A,C]。

3、跳跃表A2各层元素Head的后继元素为[E,E,E]。

4、跳跃表A1和A2高度一样,则把[Head,A,C]的后继元素设置为[E,E,E]。

5、将跳跃表A1和A2的分区范围[A,C]和[E,F]合并为[A,F]。

6、最终跳跃表A1和A2合并为跳跃表A。

本申请提出的基于范围分区的跳跃表扩容和缩容方法,可平衡子跳跃表体积,降低子跳表本身的读写阻塞耗时。同时基于范围分区的跳跃表扩容和缩容方法仅需修改跳跃表指针,不需要大量拷贝数据,可在短时间内完成扩容和缩容,不会长时间阻塞读写请求。

图13是本申请一实施例提供的基于范围分区的跳跃表的处理装置的流程示意图,如图13所示,本申请实施例提供的基于范围分区的跳跃表的处理装置,包括:

获取模块21,用于获取针对目标元素的操作请求,所述请求中包括所述目标元素的信息;

确定模块22,用于根据所述目标元素的信息,确定所述目标元素所在的分区,其中,每个分区按照元素键值的范围划分;

执行模块23,用于根据所述操作请求的请求类型,利用所述目标元素的信息对所述分区所对应的跳跃表执行相应操作。

本申请提供的基于范围分区的跳跃表的处理装置,针对跳跃表只能一写多读的特点,按键值范围将某一大容量的跳跃表拆分为多个跳跃表,拆分后的某一跳跃表更新时,其他跳跃表仍可以正常读写,避免了因跳跃表容量过大导致跳跃表更新时长时间阻塞其他读写请求的问题。

在一些实施例中,所述执行模块具体用于:

若所述操作请求为读请求,则利用所述目标元素的键值,在所述分区所对应的跳跃表中查找并读取所述目标元素的值;和/或

若所述操作请求为写请求,则根据所述目标元素的键值将所述目标元素插入所述分区所对应的跳跃表,得到所述分区所对应的新的跳跃表。

在一些实施例中,所述装置还包括:

拆分模块,用于若所述分区所对应的跳跃表的元素总记录数大于第一预设阈值,则将所述跳跃表拆分成至少两个新的跳跃表。

在一些实施例中,所述拆分模块具体用于:

若所述分区所对应的跳跃表的元素总记录数大于第一阈值,则在所述跳跃表的最底层链表中查找在所述跳跃表的元素总记录数的二分之一位置处的第一元素以及位于所述第一元素之后的第二元素;

根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表;

根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表。

在一些实施例中,所述拆分模块根据所述跳跃表的各层链表中的所述第一元素及位于所述第一元素之前的元素生成第一跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第一元素,则将所述第一元素的后继元素修改为尾元素,否则,则将该层链表中键值小于所述第一元素的键值且位置最靠后的元素的后继元素修改为尾元素,得到第一跳跃表。

在一些实施例中,所述拆分模块根据所述跳跃表的各层链表中的所述第二元素及位于所述第二元素之后的元素生成第二跳跃表包括:

对于所述跳跃表的每一层链表,若该层链表中包括所述第二元素,则将所述第二元素的前驱元素修改为头元素,否则,则将该层链表中键值大于所述第二元素的键值且位置最靠前的元素的前驱元素修改为头元素,得到第二跳跃表。

在一些实施例中,所述装置还包括:

合并模块,用于若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则将所述跳跃表与相邻分区的跳跃表合并,生成新的跳跃表。

在一些实施例中,所述合并模块具体用于:

若所述分区所对应的跳跃表的元素总记录数小于第二阈值,则获取相邻分区中跳跃表的元素总记录数较小的跳跃表;

若所述分区中的键值小于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述元素总记录数较小的跳跃表的对应层链表除头元素之外的第一个元素;

对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述跳跃表的对应层链表除尾元素之外的最后一个元素,得到新的跳跃表。

在一些实施例中,所述合并模块还用于:

若所述分区中的键值大于所述元素总记录数较小的跳跃表所对应的分区中的键值,则对于所述跳跃表的每层链表,若所述元素总记录数较小的跳跃表具有对应层链表,则将所述跳跃表的该层链表除头元素之外的第一个元素的前驱元素修改为所述元素总记录数较小的跳跃表的对应层链表除尾元素之外的最后一个元素;

对于所述元素总记录数较小的跳跃表的每层链表,若所述跳跃表具有对应层链表,则将所述元素总记录数较小的跳跃表的该层链表除尾元素之外的最后一个元素的后继元素修改为所述跳跃表的对应层链表除头元素之外的第一个元素,得到新的跳跃表。

本申请实施例提供的装置的实施例具体可以用于执行上述各方法实施例的处理流程,其功能在此不再赘述,可以参照上述方法实施例的详细描述。

需要说明的是,本申请实施例提供的基于范围分区的跳跃表的处理方法及装置可用于金融领域,也可用于除金融领域之外的任意技术领域,本申请实施例对基于范围分区的跳跃表的处理方法及装置的应用领域不做限定。

图14为本申请一实施例提供的电子设备的实体结构示意图,如图14所示,该电子设备可以包括:处理器(processor)301、通信接口(Communications Interface)302、存储器(memory)303和通信总线304,其中,处理器301,通信接口302,存储器303通过通信总线304完成相互间的通信。处理器301可以调用存储器303中的逻辑指令,以执行上述任一实施例所述的方法。

此外,上述的存储器303中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法。

本实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储计算机程序,所述计算机程序使所述计算机执行上述各方法实施例所提供的方法。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在本说明书的描述中,参考术语“一个实施例”、“一个具体实施例”、“一些实施例”、“例如”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。

以上所述的具体实施例,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的具体实施例而已,并不用于限定本申请的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

相关技术
  • 基于拍摄装置的表情检测装置及数据处理方法
  • 基于数据分区的语种转换方法、装置、设备及存储介质
  • 高动态范围图像分区处理方法、装置及计算机可读存储介质
  • 高动态范围图像分区处理方法、装置及计算机可读存储介质
技术分类

06120115757668