一种基于NVM的分区Clevelhash索引结构及数据处理方法与流程

文档序号:31779999发布日期:2022-10-12 09:48阅读:88来源:国知局
一种基于NVM的分区Clevelhash索引结构及数据处理方法与流程
一种基于nvm的分区clevel hash索引结构及数据处理方法
技术领域
1.本发明涉及数据库优化技术领域,特别涉及一种基于nvm的分区clevel hash索引结构及数据处理方法。


背景技术:

2.随着计算机硬件技术的发展,非易失性存储器( nvm )具有高密度、低功耗、抗辐射等优点,未来将成为高速数据存储系统架构的核心。传统数据库索引并不适用nvm,将导致额外系统开销,阻碍性能提升。在现有nvm索引结构中,path hash基于位置共享方法,通过双路径哈希和路径缩短技术在空间利用率和请求延迟方面提供了哈希表的高性能。level hash通过较低的开销保证索引结构的一致性并且减少rehash的过程中的写操作的数量,显著提高性能。clevel hash索引结构在level hash的基础上克服了锁对并发控制的限制而减少了额外写开销。
3.现有基于nvm的哈希索引结构在性能、存储、并行上都具有较大优势。但是,在海量数据查询过程中,存在着大量的邻值数据。邻值数据按照键值对的哈希函数被映射到不同的哈希桶中均匀的分布。这使得邻值数据分布在不同位置,处理器缓存的只是同一个哈希桶内的相邻位置的数据,对于邻值数据的查询产生了较低的处理器缓存命中率。


技术实现要素:

4.针对现有技术存在的不足,本发明的目的之一在于提供一种基于nvm的分区clevel hash索引结构,在clevel hash索引结构的基础上,通过数据分区的划分把邻值数据映射到相邻位置,保证内存数据库数据一致性,在处理邻值数据查询时提高缓存命中率。
5.本发明的上述技术目的是通过以下技术方案得以实现的:一种基于nvm的分区clevel hash索引结构,包括:使用数据分区作为哈希桶的索引单元;全局指针指向全局信息块,每个处理过程中的线程都会使用该全局指针的副本指针,全局信息块包括两个指针,分别指向level list顶层信息块的top level指针和指向level list底层信息块的bottom level指针;其中,level list是用于指向当前桶数组的持久内存指针链表;每个目标键通过映射函数计算得到分区号;再通过对分区号进行哈希函数计算哈希值,并映射到每层的两个哈希桶中;将数据分区作为每个哈希桶中槽的基本单元;所述数据分区按照键值的相邻关系提前划分,相邻关系视具体业务的数据内容或类型确定,且所述数据分区是逻辑上的地址区间。
6.通过上述技术方案,通过使用数据分区作为哈希桶的索引单元,满足邻值数据的集中,使得每一个具有邻值数据特征的目标键值数据能够有效利用处理器缓存大小,存储在连续的内存区间,并映射到同一个哈希桶中,从而提高缓存命中率,高海量实时系统的处
理性能。通过全局信息快中的两个指针实现数据的快速定位查找,提高数据处理效率。并且由于数据分区是逻辑上的地址区间,它的创建和删除具有动态性,只有在新数据分区中插入具体数据时,才动态按照数据分区大小分配内存使用,对数据删除时,如果某个数据分区已经没有数据了,就可以释放掉该数据分区的内存。
7.进一步的,从top level到bottom level,当所有的槽都被占用时,通过rehash操作进行通的扩容,所述全局信息块中还包括一个用来表示rehash是否正在进行的布尔值标志位。
8.通过上述技术方案,通过布尔值标志位快速确定当前结构是否执行rehash操作。
9.进一步的,所述数据分区中的每个数据都是key-value数据,将key-value数据的最高位保存一个token值,在初始化分区并分配内存时,置所有的token为0,表示key-value数据并不存在;在key-value数据插入时,将对应token置1;当key-value数据删除时,将token置0。
10.通过上述技术方案,通过token值对当前数据分区中是否插入数据进行快速判断,无论海量数据处理哪种操作,搜索过程针对映射到整个哈希桶遍历会影响性能,所以字哈希桶的前端对所有槽的关键信息进行提前记录,这样搜索到哈希桶内具体分区信息时,不需要对整个哈希桶内信息进行完整的遍历,cpu仅通过读取1-2个高速缓存行大小数据,就可以快速确定当前哈希桶中槽的分区数据信息。
11.进一步的,所述哈希桶的前端针对每个槽的value,利用2个字节表示当前哈希桶内其中一个槽的数据分区信息。
12.通过上述技术方案,快速实现对哈希桶中每个槽内特征信息的判断,提高数据处理效率,减少cpu资源损耗。
13.进一步的,在通过利用2个字节表示当前哈希桶内其中一个槽的数据分区信息时,包括:通过4个二进制位作为槽的标识;通过14个二进制位作为目标键映射计算得到的分区号标识。
14.通过上述技术方案,利用4个二进制位作为槽的标识可以进行无需定位快速查找,利用14个二进制位作为数据分区内有效数据的计数器。
15.进一步的,每个所述数据分区的大小以cpu缓存大小作为标准。
16.通过上述技术方案,使得每个数据分区的键值对数据数量可根据数据分区目标而灵活调整。
17.针对现有技术存在的不足,本发明的目的之二在于提供一种基于nvm的分区clevel hash索引结构的无锁插入方法,在clevel hash索引结构的基础上,通过数据分区的划分把邻值数据映射到相邻位置,保证内存数据库数据一致性,在处理邻值数据查询时提高缓存命中率。
18.一种基于nvm的分区clevel hash索引结构的无锁插入方法,包括:步骤i1:根据要插入的目标键值计算所在数据分区的分区号;步骤i2:利用不同的哈希函数计算要插入的分区号的哈希值,映射到top层中的两个桶号;
步骤i3:创建当前全局指针的本地指针,用于判断rehash情况是否并行发生;步骤i4:判断插入操作是否第一次执行,如果是则执行算法seek,返回空槽指针,或哈希桶号、分区地址指针;如果不是则执行算法seekagain,返回空槽指针;步骤i5:如果没有找到空槽,需要对索引结构进行rehash的操作;如果空槽指针所在桶是在level list的bottom层,而且全局信息块中布尔值标志位的标志为1,表示通过扩容操作bottom层的桶已经通过rehash释放;为了避免数据的插入带来数据丢失显现,需要重新执行插入操作;步骤i6:根据返回的空槽指针,在内存中初始化分区地址空间,并且,同时初始化该空槽相对应的分区号信息和计数器信息;步骤i7:如确定插入的分区,根据分区首地址计算目标数据在分区中的地址偏移量,即实际物理地址,并校验该位置的数据token是否为0,如果为0则修改为1,并进行数据赋值,分区数据计数器值进行加1的修改处理,如果为1则已经有数据存在,返回插入失败。
19.针对现有技术存在的不足,本发明的目的之三在于提供一种基于nvm的分区clevel hash索引结构的无锁查询方法,在clevel hash索引结构的基础上,通过数据分区的划分把邻值数据映射到相邻位置,保证内存数据库数据一致性,在处理邻值数据查询时提高缓存命中率。
20.一种基于nvm的分区clevel hash索引结构的无锁查询方法,包括:步骤q1:通过输入查询目标数据值计算数据分区号;步骤q2:利用不同的哈希函数计算要插入的分区号的hash值,映射到top层中的两个桶号;步骤q3:创建当前全局指针的本地指针;步骤q4:从bottom层到top层顺序扫描索引结构中的桶号,遍历满足两个哈希函数的所有哈希桶,使用每个桶中第一个高速缓存行中的分区号来匹配搜索分区目标;步骤q5:若遍历所有层满足映射的哈希桶都没有发现目标分区,对比本地指针和当前全局指针是否相同,如果相同返回查询失败,如果不相同说明执行过程中有其他线程发起过rehash,产生新的top层使得全局信息块发生改变,需重新执行上述步骤。
21.针对现有技术存在的不足,本发明的目的之四在于提供一种基于nvm的分区clevel hash索引结构的数据删除方法,在clevel hash索引结构的基础上,通过数据分区的划分把邻值数据映射到相邻位置,保证内存数据库数据一致性,在处理邻值数据查询时提高缓存命中率。
22.一种基于nvm的分区clevel hash索引结构的数据删除方法,包括:步骤d1:创建全局指针的本地指针,并通过所述基于分区clevel hash索引结构的无锁查询算法查找待删除数据的物理地址,即所在分区的槽内指针加上地址偏移;步骤d2:删除目标物理地址的数据内容;
步骤d3:若所在分区数据被清空,则删除数据分区;步骤d4:对比本地指针和此时全局指针是否相同,如果不相同说明执行过程中有其他线程发起过rehash,产生新的top层使得全局信息块发生改变,需要重新执行上述步骤。
23.针对现有技术存在的不足,本发明的目的之五在于提供一种基于nvm的分区clevel hash索引结构的数据更新方法,在clevel hash索引结构的基础上,通过数据分区的划分把邻值数据映射到相邻位置,保证内存数据库数据一致性,在处理邻值数据查询时提高缓存命中率。
24.一种基于nvm的分区clevel hash索引结构的数据更新方法,包括:步骤u1:根据要更新的目标key值计算所在数据分区的分区号,利用两个哈希函数计算要更新的分区号的hash值,确定要更新的数据所在的桶;步骤u2:记录当前正在执行的rehash桶号;步骤u3:遍历满足哈希值的桶,计算分区号地址偏移,查询到目标数据的物理地址,并进行具体数据删除操作;步骤u4:利用比较替换的乐观锁机制方法将更新值插入当前目标物理地址,并记录正在执行的rehash桶号;步骤u5:如果更新操作的哈希桶号介于两次记录的哈希桶号之间,重新执行更新操作,在top层中再次查找目标数据,重新进行更新操作,以防rehash影响到当前更新,否则更新操作成功。
25.综上所述,本发明具有以下有益效果:通过使用数据分区作为哈希桶的索引单元,满足邻值数据的集中,使得每一个具有邻值数据特征的目标键值数据能够有效利用处理器缓存大小,存储在连续的内存区间,并映射到同一个哈希桶中,从而提高缓存命中率,高海量实时系统的处理性能。通过全局信息快中的两个指针实现数据的快速定位查找,提高数据处理效率。
附图说明
26.图1是本发明实施例一中提供的一种基于nvm的分区clevel hash索引结构的示意图;图2为本发明实施例一中提供的一种基于nvm的分区clevel hash索引结构中哈希桶的结构示意图;图3为本发明实施例二中提供的一种基于nvm的分区clevel hash索引结构的无锁插入方法流程图;图4为本发明实施例二中提供的一种基于nvm的分区clevel hash索引结构的无锁插入方法过程中,目标分区及空槽查找方法的流程图,其中(a)为查找分区及空槽算法seek流程图,(b)为直接查找空槽算法seekagain的流程图;图5为本发明实施例三中提供的一种基于nvm的分区clevel hash索引结构的无锁查询方法流程图;图6为本发明实施例四中提供的一种基于nvm的分区clevel hash索引结构的数据删除方法流程图;
图7为本发明实施例五中提供的一种基于nvm的分区clevel hash索引结构的数据更新方法流程图。
具体实施方式
27.以下结合附图对本发明作进一步详细说明。
28.本实施例提供的缩略语和关键术语定义如下所述:nvm:英文全称为non-volatile memory,中文为失性存储器;cow:英文全称为copy on write,中文为写入时复制机制;cas:英文全称为compare and swap,中文为比较并替换的乐观锁机制;处理器缓存:处理器和内存之间用来保存最近所访问的内存数据,缓存读取数据比内存读取数据要快十几到上百倍;dcpmm:英文全称为intel optane datacenter persistent memory module,中文为英特尔傲腾非易失内存模块;hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
29.实施例一:一种基于nvm的分区clevel hash索引结构,首先,clevel hash是一种通过改进level hash的高性能hash索引结构,主要解决了数据重复和数据丢失问题,在保证索引结构一致情况下优化rehash的写操作。首先,通过管理整个索引结构的全局信息块支持多层hash。其次,基于无锁并发的算法优化了rehash锁对并发控制的限制,减少额外写开销。索引结构的rehash交给后台线程,不会阻塞其他的线程操作。
30.本实施例在clevel hash索引结构基础上,为了满足邻值数据的集中,使用数据分区(data patition)作为哈希桶(可简称为桶)的索引单元。这样每一个具有邻值数据特征的键值对数据能够有效利用处理器缓存大小,存储在连续内存区间,并映射到同一个哈希桶中,从而提高缓存命中率,高海量实时系统的处理性能。
31.如图1所示,全局指针(global pointer)指向了全局信息块,每个处理过程的线程都会使用该指针的副本指针。
32.全局信息块中包含两个指针,分别为指向level list顶层信息块的top level指针和指向level list底层信息块的bottom level指针。此外,还有一个用来标识rehash是否正在进行的布尔值标志位(rehashing)。
33.level list是一个用于指向当前桶(bucket)数组的持久内存指针链表。clevel hash索引结构支持多层桶数组。
34.在本发明中,每个目标键(key)通过映射函数计算得到分区号(partition no.),再通过哈希函数(hash1和hash2)计算哈希值并映射到每层的两个桶中,参见图1中101。从top到bottom,当所有的槽(slot)都被占用时考虑rehash操作进行桶的扩容。链表包含两部分,分别指向各自层的桶数组首地址,以及指向上层的持久内存指针。
35.为了提高缓存命中率,需要将频繁在一起查询的邻值键值对数据划分在同一个桶里。本发明将数据分区作为每个桶中槽的基本单元,参见图1中的102。数据分区按照键值的相邻关系提前划分,相邻关系视具体业务的数据内容或类型而定。
36.为了提高缓存效率,需要保证一个分区中的邻值数据都能够移入缓存。因此,每个分区的大小尽量以cpu缓存大小作为标准,每个分区的键值对数据数量可根据分区目标而灵活调整。
37.数据分区是逻辑上的地址区间,它的创建和删除具有动态性。只有在新分区中插入具体数据时,才动态按照分区大小分配内存使用。对数据删除时,如果某个数据分区已经没有数据了,就可以释放掉该分区的内存。
38.数据分区中的具体键值对数据大小根据数据内容和类型灵活构造。如图1中103,数据分区中的每个数据都是key-value数据,为了标识当前位置数据的有效性,数据的最高位保存了一个token值。在初始化分区并分配内存时,置所有的token为0,表示这些数据并不真的存在;数据插入时,会将对应数据token置为1,而当数据删除时,会将token置为0。
39.无论海量数据处理哪种操作,搜索过程针对映射到的整个桶遍历会影响性能。因此,在桶的前端对所有槽的关键信息进行提前记录,这样在搜索到桶内具体分区信息时,不需要对整个桶内信息进行完整的遍历,cpu仅通过读取1-2个高速缓存行大小数据,就可以快速确定当前桶中各槽的分区数据信息。
40.如图2所示,哈希桶的前端针对每个槽的value(数据分区首地址指针),利用2个字节描述当前桶内的某个槽的数据分区基本信息。具体包括:4个二进制位作为槽的标识;14个二进制位作为目标key映射计算得到的分区号标识(当槽内目前还没创建新的分区时该标识为00000000000000),利用该标识可以进行无序定位快速查找;利用14个二进制位作为分区内有效数据的计数器,在内存中初始化分区时该计数器被置0,数据的插入和删除使其增加或减少。
41.每个桶中槽的个数可以根据具体数据库而设定。桶的大小如果设计为dcpmm中内存块大小的整数倍将更好的利用dcpmm有限的带宽,所以一般设计为256字节整数倍。每个槽中为对应数据分区的持久内存首地址指针,可以灵活适应不同数量不同大小的数据分区,并且利用cow算法保证写入过程中索引结构的一致性。
42.在实际应用的实施例中,以某单位员工体检数据中的脉搏数据键值对为例,员工编号id作为key,脉搏数pulse作为value建立该数据分区,该数据分区共包含键值对数据500组,代表500名员工的id和脉搏数key-value数据,其中key所占空间16字节,value所占空间16字节,32字节为一名员工脉搏数的搜索目标。那么这个数据分区所占的空间为32*500=16000字节=16k字节。所述分区大小可以一次性拷贝到一个20k的cpu一级缓存中,以支持对该数据的邻值频繁访问。
43.在实际应用的实施例中,为了有效利用dcpmm带宽,将单个桶占用的持久内存大小设为256字节。其中,每个槽能够容纳的分区号首地址指针大小为16字节,针对每个槽(分区信息)的桶前端描述信息占2个字节。因此,每个分区信息占用的空间为2字节(区号)+2字节(计数器)+16字节(分区首地址)=20字节,设计slot=12满足20*12=240字节。即每个桶包含12个槽,可支持12个分区信息的存储。
44.在基于nvm的分区clevel hash索引结构基础上,每一个线程都存储一个全局指针的本地副本。当需要对索引结构进行扩容时基于该索引结构的无锁rehash方法与clevel hash的rehash方法相同。
45.实施例二:
一种基于nvm的分区clevel hash索引结构的无锁插入方法,基于实施例一提及的一种基于nvm的分区clevel hash索引结构,如图3所示,包括如下步骤:步骤i1:根据要插入的目标键值(key)计算所在数据分区的分区号(partition no.);步骤i2:利用不同的哈希函数计算要插入的分区号的哈希值,映射到top层中的两个桶号;步骤i3:创建当前全局指针的本地指针,用于判断rehash情况是否并行发生;步骤i4:判断插入操作是否第一次执行,如果是则执行算法seek,返回空槽指针,或哈希桶号、分区地址指针;如果不是则执行算法seekagain,返回空槽指针;步骤i5:如果没有找到空槽,需要对索引结构进行rehash的操作;如果空槽指针所在桶是在level list的bottom层,而且全局信息块中布尔值标志位的标志为1,表示通过扩容操作bottom层的桶已经通过rehash释放;为了避免数据的插入带来数据丢失显现,需要重新执行插入操作;步骤i6:根据返回的空槽指针,在内存中初始化分区地址空间,并且,同时初始化该空槽相对应的分区号信息和计数器信息;步骤i7:如确定插入的分区,根据分区首地址计算目标数据在分区中的地址偏移量,即实际物理地址,并校验该位置的数据token是否为0,如果为0则修改为1,并进行数据赋值,分区数据计数器值进行加1的修改处理,如果为1则已经有数据存在,返回插入失败。
46.在步骤i1时,需要预先定义数据分区划分规则及定义数据分区映射函数,具体步骤为:步骤i1-1:根据对业务数据的详细分析,定义好所有键值对数据与数据分区的关系。
47.步骤i1-2:采用分段函数的方式建立数据与分区之间的映射函数,函数不局限于key-partition之间的映射,还可以是value-partition之间的映射。而且每个分区的映射函数并不统一,根据各分区的具体数据内容和类型而确定。
48.在步骤i4中的seek算法为查找分区及空槽算法(sk算法),如图4(a)所示,输入参数为要查找的分区号,存储空槽对应的首地址指针sptr和指向某空槽指针eptr。如果找到的是空槽则返回eptr,如果找到了目标数据返回对应的桶号和sptr,详细步骤为:步骤sk1:从bottom层到top层顺序扫描索引结构中的桶号,遍历满足两个哈希函数的所有桶,使用每个桶中第一个高速缓存行中的分区号来匹配搜索分区目标;步骤sk2:当匹配到该分区号时,进行匹配数据的操作,计算待查找数据的物理地址偏移与其key或value的线性关系进行数据匹配,如果无匹配数据,则返回所在的桶号及对应分区号的槽内指针eptr,如果存在匹配数据,同样返回桶号及分区号对应槽内指针eptr;步骤sk3:如果未匹配到该分区号,则计算并返回最适合的空槽指针sptr;步骤sk4:检验步骤i3中线程保存的本地指针与当前全局指针是否相同,从而检测是否发生了rehash操作,如果执行时发生了rehash操作则需要通过seekagain算法进一步
查找更接近top层的空槽。
49.在步骤sk3中,在确定当前所有层次中没有桶匹配目标分区号时,进一步通过查找得到更适合的空槽目标,具体步骤为:步骤sk3-1:从bottom层向top层扫描所有可能的桶号,当存在空槽时(对应槽的分区号为00000000000000),就对指向空槽的指针进行更新,从而,将数据插入到更接近top层,避免rehash操作频繁移动bottom层的内容;步骤sk3-2:对于相同层内的桶,通过扫描桶内空槽的个数以及分区数据计数器的值确定插入目标桶的选择,以此均衡桶内资源或节点资源的负载问题。
50.在步骤i4中的seekagain算法为直接查找空槽算法(sa算法),如图4(b),具体步骤为:步骤sa1:从top层到bottom层顺序扫描索引结构中的桶号,遍历满足两个哈希函数的所有桶,使用每个桶中第一个高速缓存行中的分区号来匹配搜索分区目标;步骤sa2:当扫描到空槽时,返回指向空槽的指针sptr,并且不再进行下一层的遍历查找;步骤sa3:对于相同层内的桶,同样通过扫描桶内空槽的个数以及分区数据计数器的值确定插入目标桶的选择,以此均衡桶内资源或节点资源的负载问题;步骤sa4:同样,检验步本地指针与当前全局指针是否相同,检测是否发生了rehash操作,如果发生了则重新执行算法来寻找更接近top层的空槽。
51.以所述某单位员工体检脉搏数的实际应用为实施例,设待插入数据key为员工id为100787,value为85次/分。首先,根据步骤i1按照分段映射函数计算key值为100787的员工id的分区号

00000011010110’;其次,利用哈希函数计算分区号

00000011010110’的hash值,映射到top层中的两个桶号,为b7和b13。接着,根据步骤i3创建当前全局指针的本地指针lptr。然后,如果本实施例所述插入操作是第一次执行,根据所述步骤i4执行算法seek。依次遍历各个层次满足哈希值的桶号(b7、b13等),分别在各个桶的高速缓存行内匹配分区号

00000011010110’。如果匹配到分区号,则进一步通过计算key值(100787)在分区号的偏移量确定物理地址,地址无论是否存在目标key值,都将当前槽内指针地址eptr,即返回分区号首地址。如果所有桶遍历后都没有匹配到该分区号,则从bottm层向top层扫描上述桶号。当桶高速缓存行中存在分区号为00000000000000的槽时,迭代的更新当前空槽指针。选择空槽所在目标桶若越接近top层,越满足桶间负载平衡,则越满足插入新分区的需要。
52.根据所述步骤i3线程保存的本地指针lptr与当前全局指针进行比较。如果发现发生了rehash操作。则执行seekagain算法查找更接近top层的空槽,这两个seek算法的最大区别就是seekagain算法从top层向bottom层遍历桶,一旦发现满足两个哈希值,且具有空槽,则返回该空槽指针。如果无论采用哪种seek算法都没有找到空槽,表示当前索引结构需要扩容,执行rehash的操作。如果遍历后空槽指针所在桶是在level list的bottom层,且rehashing的标志为1,表示该桶已经被释放,重新执行插入操作。
53.最后,若算法返回空槽指针,则在内存中初始化分区号为

00000011010110’的分区物理地址空间写入返回的空槽指针eptr。同时初始化该桶内前端对应分区号信息和计数器信息。进一步根据分区首地址计算目标数据在分区中的地址偏移量,即实际物理地址。并
校验该位置的数据token是否为0,如果为0则将key

100787’和value

85’,写入,并将分区数据计数器值进行加1处理。
54.实施例三:一种基于nvm的分区clevel hash索引结构的无锁查询方法,基于实施例一提及的一种基于nvm的分区clevel hash索引结构,如图5所示:包括如下步骤:步骤q1:通过输入查询目标数据值计算数据分区号;步骤q2:利用不同的哈希函数计算要插入的分区号的hash值,映射到top层中的两个桶号;步骤q3:创建当前全局指针的本地指针;步骤q4:从bottom层到top层顺序扫描索引结构中的桶号,遍历满足两个哈希函数的所有哈希桶,使用每个桶中第一个高速缓存行中的分区号来匹配搜索分区目标;步骤q5:若遍历所有层满足映射的哈希桶都没有发现目标分区,对比本地指针和当前全局指针是否相同,如果相同返回查询失败,如果不相同说明执行过程中有其他线程发起过rehash,产生新的top层使得全局信息块发生改变,需重新执行上述步骤。
55.在步骤q4中采用从bottom层到top层的顺序进行遍历。从而避免开始查询时就已经执行了rehash,使得bottom层数据扩容到新的top层。否则,查询没有从真正的top层开始进行,将带来查询不全的问题。
56.在步骤q4中,还可进一步细化为:步骤q4-1:扫描每个桶存储在第一个高速缓存行中的分区号;步骤q4-2:若匹配到目标分区号,计算待查询key在该分区中的地址偏移量;步骤q4-3:访问桶中对应分区号的槽内指针eptr,并计算偏移后的物理地址;步骤q4-4:若发生邻值查询,频繁访问到某个分区的数据时,就把整个分区移入处理器缓存。
57.这样,在访问邻值数据时直接从缓存读取可以提高数据库访问效率。
58.在实际应用的实施例中,仍然以所述某单位员工体检脉搏数的实际应用为例。设待查询的数据为前面操作已插入的键值对,key员工id为

100787’,value脉搏次数为

85’。根据所述步骤q1、q2和q3计算分区号为

00000011010110’,计算hash值,映射到b7和b13两个桶,并创建该线程全局指针的本地副本。根据所述步骤q4,遍历bottom层到top层满足哈希值的桶。扫描每个桶存储在第一个高速缓存行中的分区号是否匹配

00000011010110’。若匹配到则计算key的物理地址。若单位所有员工的体检数据频繁的被查询,则将分区号为

00000011010110’的500组键值对数据移入cpu缓存。这样,如后续查询邻值数据时可以直接从缓存中查询,如查询key值(员工id)为

100788
’‘
100791’的体检脉搏数值。最后,如果遍历所有层都没有发现分区

00000011010110’,对比lptr和此时的全局指针。相同则返回查询失败,不相同则表示有rehash发生,需要重新执行查询。
59.实施例四:一种基于nvm的分区clevel hash索引结构的数据删除方法,基于实施例一提及的一种基于nvm的分区clevel hash索引结构以及实施例三提及的无锁查询方法,本实施例的
删除方法包括如下步骤:步骤d1:创建全局指针的本地指针,并通过所述基于分区clevel hash索引结构的无锁查询算法查找待删除数据的物理地址,即所在分区的槽内指针加上地址偏移;步骤d2:删除目标物理地址的数据内容;步骤d3:若所在分区数据被清空,则删除数据分区;步骤d4:对比本地指针和此时全局指针是否相同,如果不相同说明执行过程中有其他线程发起过rehash,产生新的top层使得全局信息块发生改变,需要重新执行上述步骤。
60.在步骤d2中,目标物理地址中数据的具体删除操作还可以细化步骤为:步骤d2-1:令所在分区的数据计数器减1;步骤d2-2:并删除对应物理地址的数据内容。
61.而在步骤d3中,所在分区具体删除操作还可以细化步骤为:步骤d3-1:检测对应分区的数据计数器;步骤d3-2:若数据计数器为0,则所在分区数据已清空,将对应槽的分区号置为00000000000000,此时该分区对应槽中存储的地址对其他线程不可见;步骤d3-3:释放该分区目标地址所占用的内存空间。
62.在实际应用的实施例中,以删除所述key员工id为

100787’,value脉搏次数为

85’的数据为例。根据所述步骤d1和d2创建全局指针的本地指针lptr,查找到待删除数据的所在分区

00000011010110’的物理地址。进一步计算得到目标数据的物理地址。将该物理地址下数据最高位token置为0,并删除数据内容

100787’和

85’。更新分区数据计数器500-1=499。如果涉及到删除分区

00000011010110’,则根据所述步骤d3检测分区号为

00000011010110’的数据计数器。当数据计数器为0时修改分区号为

00000000000000’,释放该分区内存空间。
63.实施例五:一种基于nvm的分区clevel hash索引结构的数据更新方法,基于实施例一提及的一种基于nvm的分区clevel hash索引结构以及实施例三提及的无锁查询方法,本实施例的数据更新方法包括如下步骤:步骤u1:根据要更新的目标key值计算所在数据分区的分区号,利用两个哈希函数计算要更新的分区号的hash值,确定要更新的数据所在的桶;步骤u2:记录当前正在执行的rehash桶号;步骤u3:遍历满足哈希值的桶,计算分区号地址偏移,查询到目标数据的物理地址,并进行具体数据删除操作;步骤u4:利用比较替换的乐观锁机制方法将更新值插入当前目标物理地址,并记录正在执行的rehash桶号;步骤u5:如果更新操作的哈希桶号介于两次记录的哈希桶号之间,重新执行更新操作,在top层中再次查找目标数据,重新进行更新操作,以防rehash影响到当前更新,否则更新操作成功。
64.在实际应用的实施例中,以所述key员工id为

100787’,value脉搏次数

85’需要更新为

90’为例。根据所述步骤u1和u2计算分区号为

00000011010110’,计算hash值,确定
目标桶。并记录当前正在执行rehash的桶号,假设为b13。根据所述骤u3遍历所有目标桶的高速缓存行,匹配分区号

00000011010110’。如匹配到桶b17,则获取对应槽内指针eptr的分区首地址,并计算目标数据的物理地址。进一步删除数据

85’。根据所述步骤u4采用cas方法将

90’插入目标物理地址对应的value中,记录正在执行rehash的桶号,假设为b71。最后,根据所述步骤u5,更新操作的桶号b17介于两次记录的桶号b13和b7之间,更新操作需要重新执行。否则更新操作成功。
65.本具体实施例仅仅是对本发明的解释,其并不是对本发明的限制,本领域技术人员在阅读完本说明书后可以根据需要对本实施例做出没有创造性贡献的修改,但只要在本发明的权利要求范围内都受到专利法的保护。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1