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

一种以部分散列Key为索引的Kv数据库存储与查询方法

文献发布时间:2023-06-19 11:29:13


一种以部分散列Key为索引的Kv数据库存储与查询方法

技术领域

本发明涉及数据库技术领域,尤其涉及一种以部分散列Key为索引的Kv数据库存储与查询方法。

背景技术

Kv数据库是指Key-value数据库,是一种以键值对存储数据的一种数据库,查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询,其辅以实时搜索引擎进行复杂条件检索、全文检索,就可以替代并发性能较低的MySQL等关系型数据库,达到高并发、高性能,节省几十倍服务器数量的目的。

目前主流的Kv数据库以BerkeleyDB和LevelDB为代表。

BerkeleyDB通过使用多种存储结构来解决不同的存储需求。但无论采用哪种存储结构,对千万级别数据量的数据读写需求都得不到足够优秀的性能保证。

LevelDB以高性能著称。但实际测试表明,在单机存储超过1亿条以上的数据时,由于LSM Tree数据结构特性而导致的数据块整理而导致性能陡降,会导致数据库阻塞很长时间无法工作。

发明内容

为此,本发明提供一种以部分散列Key为索引的Kv数据库存储与查询方法,用以克服现有技术中因单机存储数据量过大时,数据库稳定性下降,导致数据库数据库长时间阻塞问题。

为实现上述目的,本发明提供一种以部分散列Key为索引的Kv数据库存储与查询方法,包括:

步骤S1,当存储数据时,写入原始Key,将原始Key转换为散列Key并从散列Key中提取索引Key和校验Key,用索引Key检测索引项中对应的位置是否存在数据,若不存在数据,则直接将数据写入索引项,若存在数据,则获取索引项的冲突状态,当索引项从无冲突变为有冲突时,则新建一个地址列表,将原有数据写入第一条冲突项,将新的数据写入第二条冲突项,当索引项中已经存在冲突数据时,则检测对应地址列表中是否有空闲空间,当检测结果为有空闲空间时在地址列表中增加一条冲突数据,当检测结果为没有空闲空间时将新的数据写入第三方存储项;

步骤S2,当查询数据时,写入所述原始Key,将原始Key转换为散列Key并从散列Key中提取索引Key和校验Key,将索引Key写入索引项并判定索引项的冲突状态,若所述索引项为无冲突索引项,则初步判定命中并进行校验,当校验结果匹配时判定查询命中,当校验不匹配,则判定查询无命中,若所述索引项为有冲突索引项,则获取所述索引Key对应的地址列表,获取完成时,遍历地址列表中的冲突项,并在遍历过程中,通过与所述索引Key对应的校验Key和原始Key的辅助校验算法对冲突项中每个数据进行校验,当校验结果匹配时判定查询命中,当无匹配结果时查询第三方存储项中是否存在索引Key,若存在判定查询命中,若不存在判定查询无命中;

在上述步骤中,当完成对所述索引Key的提取时,根据散列Key的字节长度选取对应的拆分级数对所述索引Key进行拆分,设定拆分级数为N级,其中N≥2,所述索引Key为所述散列Key中的3-8个字节;

在遍历过程中,对每个冲突项的存储地址进行校验,当遇到一条记录校验结果匹配时初步判定查询命中,从存储地址中获取数据地址,并对数据地址中的Key进行校验,校验完成时,提取数据,当无匹配存储地址时,

在所述步骤S1中,所述索引项中设有预设冲突次数的记录数占比组B0和预设前m次实际冲突次数的记录数占比之和Ba0,设定B0(B1,B2,B3,…Bn),其中,B1为所述索引项中存在2次冲突的记录数占比,B2为所述索引项中存在3次冲突的记录数占比,B3为所述索引项中存在4次冲突的记录数占比,Bn为所述索引项中存在n次冲突的记录数占比,当存储数据时,获取索引项中实际冲突次数的记录数占比B,并将该实际冲突次数的记录数占比B与预设冲突次数的记录数占比组B0中对应的冲突次数的记录数占比进行比对,若至少有一条实际冲突次数的记录数占比B小于预设冲突次数的记录数占比组B0中对应的预设冲突次数的记录数占比,则将前m次实际冲突次数的记录数占比之和Ba与预设前m次实际冲突次数的记录数占比之和Ba0进行比对,当Ba>Ba0时,将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项,若实际冲突的记录数占比B均大于预设冲突次数的记录数占比组B0中对应的预设冲突次数的记录数占比,则将校验Key中x个字节移动至索引Key以进行检索,设定0.5≤x<2,并重复该过程以使至少一条实际冲突次数的记录数占比B小于预设冲突次数的记录数占比组B0中对应的预设冲突次数的记录数占比。

进一步地,当所述索引项中对应的位置不存在数据,将数据写入磁盘的过程包括:

步骤S201,将Key和val写入content_db中,取得写入地址val_addr;

步骤S202,将校验Key、val_addr以及原始Key的辅助校验算法写入full_Key;

步骤S203,将full_Key的地址写入索引项;

进一步地,将所述数据写入所述索引项且索引项从无冲突变为有冲突状态时,按如下步骤处理:

步骤S211,将原始Key和val写入content_db中,取得写入地址val_addr;

步骤S212,将校验Key、所述地址val_addr以及原始Key的辅助校验算法写入full_Key,取得地址full_Key_addr;

步骤S213,创建一个fast_content结构,将所述索引项中原有full_Key的地址写入第一条冲突项,将所述full_Key_addr写入第二条冲突项;

步骤S214,将创建的所述fast_content结构的地址写入索引项。

进一步地,在步骤S1中,当将所述数据写入所述索引项、索引项已有冲突数据且对应的地址列表中还有空闲空间可以继续容纳冲突数据时,则在fast_content地址列表中增加一条冲突数据,包括如下步骤:

步骤S301,将原始Key和val写入content_db中,取得写入地址val_addr;

步骤S302,将校验Key、val_addr以及Key的辅助校验算法写入full_Key;

步骤S303,将full_Key的地址追加到fast_content中已有冲突项的末尾;

当所述索引项已经存在冲突数据且对应的fast_content中没有空闲空间可以继续追加冲突数据时,直接将原始Key和val写入conflict_db。

进一步地,在所述步骤S2中,当查询数据时,对无冲突索引项初步确定命中并进行校验的过程包括:通过取得的full_Key地址,查询到数据的校验Key以及Key的辅助校验算法,执行校验,若校验不匹配,则认为查询无命中,若校验匹配初步认为查询命中,则根据从full_Key数据项中取得的存储在content_db中的数据地址继续读取数据内容。

进一步地,在所述步骤S2中,当查询数据时,若所述索引项为有冲突索引项,则获取所述索引Key对应的地址列表,获取完成时,遍历地址列表中的冲突项的过程包括:通过取得的fast_conflict地址,查询到数据在对应的fast_conflict数据,查询完成时,遍历fast_conflict中的所有冲突项,每个冲突项存储的是full_Key地址,并在遍历的过程中,对每个full_Key地址查询数据的校验Key以及原始Key的辅助校验算法,执行校验,只要遇到一条记录校验匹配则判定查询命中,根据从当前full_Key数据项中取得的存储在content_db中的数据地址继续读取数据内容。

进一步地,在所述步骤S2,当遍历过程中没有匹配的full_Key地址时,通过BloomFilter算法在conflict_db查询所述原始Key,若原始Key不存在,则判定查询无命中。

进一步地,当通过Bloom Filter算法查询原始Key不存在时,判定查询无命中,结束查询任务,当通过Bloom Filter算法查询原始Key存在时,在conflict_db中直接通过Key查询val。

进一步地,所述数据地址为指向content_db中数据的地址,从数据地址中获取数据,并对数据中的Key进行校验,校验完成时,提取数据,具体过程包括:在content_db中,通过一次磁盘读取获得val和原始Key,并最后一次校验从content_db中取得的原始Key与用户指定的原始Key是否匹配,若匹配,则查询命中,并且取得了数据,结束查询,若不匹配,则查询未命中。

进一步地,所述索引项还设有预设最大重复次数Cmax,当移动字节至索引Key时,获取实际移动字节至索引Key次数C,并将实际重新选取次数C与预设最大选取次数Cmax进行比对,当C=Cmax时,移动终止并将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项。

与现有技术相比,本发明的有益效果在于,本发明通过将Key经Hash函数算法转换成散列Key,使得数据库的读写开销与Key的长度无关,且在存储和查询时,只需将散列Key的一部分做为真正的存储索引和查询索引进行数据存储和查询,用最短的索引Key覆盖绝大多数查询请求,提高了写入和查询速度,并在存储时对数据冲突次数在控制在一定范围之内,针对绝大多数读写操作,只需进行一次物理磁盘I/O即可完成,当写入的较大的数据量时,不对现有数据块进行大规模合并或者分裂等操作,极大提升写入数量的同时,进一步提高了存储和查询速度。

尤其,通过在索引项设置预设冲突次数的记录数占比组B0,进一步地根据比对结果确定是否将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项以降低了冲突,从而进一步提高了数据库的稳定性。

尤其,通过在索引项设置预设前m次实际冲突次数的记录数占比之和Ba0,并进一步获取前m次实际冲突次数的记录数占比之和Ba,并当前m次实际冲突次数的记录数占比之和Ba大于预设前m次实际冲突次数的记录数占比之和Ba0时,将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项,进一步降低了数据库的冲突,从而进一步提高了数据库的稳定性。

进一步地,当向索引项写入数据时,通过获取索引项是否已经存在数据,并根据获取的结果选取不同的处理方式,进一步提高了数据库对数据的处理速度,从而进一步提高了数据库的稳定性。

进一步地,通过在索引项中设置最大重复次数Cmax,并在实际重复次数等于预设重复次数时,终止向索引Key移动字节,在保证了索引Key字节相对短的情况下进一步降低了冲突,从而进一步提高了数据库的稳定性。

进一步地,通过将不同占比的冲突数据用不同的方法分别处理,进一步提升存储和查询效率,从而进一步提高了数据库的处理效率。

附图说明

图1为本发明所述一种以部分散列Key为索引的Kv数据库存储方法的流程图;

图2为本发明所述一种以部分散列Key为索引的Kv数据库查询方法的流程图;

图3为本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法的整体流程图。

具体实施方式

为了使本发明的目的和优点更加清楚明白,下面结合实施例对本发明作进一步描述;应当理解,此处所描述的具体实施例仅仅用于解释本发明,并不用于限定本发明。

请参阅图1-3所示,图1为本发明所述一种以部分散列Key为索引的Kv数据库存储方法的流程图,图2为本发明所述一种以部分散列Key为索引的Kv数据库查询方法的流程图,图3为本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法的整体流程图。

本发明实施例提供的一种以部分散列Key为索引的Kv数据库存储方法,其包括:

步骤S1,当存储数据时,写入原始Key,将原始Key转换为散列Key并从散列Key中提取索引Key和校验Key,用索引Key检测索引项中对应的位置是否存在数据,若不存在数据,则直接将数据写入索引项,若存在数据,则获取索引项的冲突状态,当索引项从无冲突变为有冲突时,则新建一个地址列表,将原有数据写入第一条冲突项,将新的数据写入第二条冲突项,当索引项中已经存在冲突数据时,则检测对应地址列表中是否有空闲空间,当检测结果为有空闲空间时在地址列表中增加一条冲突数据,当检测结果为没有空闲空间时将新的数据写入第三方存储项;

步骤S2,当查询数据时,写入所述原始Key,将原始Key转换为散列Key并从散列Key中提取索引Key和校验Key,将索引Key写入索引项并判定索引项的冲突状态,若所述索引项为无冲突索引项,则初步判定命中并进行校验,当校验结果匹配时判定查询命中,当校验不匹配,则判定查询无命中,若所述索引项为有冲突索引项,则获取所述索引Key对应的地址列表,获取完成时,遍历地址列表中的冲突项,并在遍历过程中,通过与所述索引Key对应的校验Key和原始Key的辅助校验算法对冲突项中每个数据进行校验,当校验结果匹配时判定查询命中,当无匹配结果时查询第三方存储项中是否存在索引Key,若存在判定查询命中,若不存在判定查询无命中;

在上述步骤中,当完成对所述索引Key的提取时,根据散列Key的字节长度选取对应的拆分级数对所述索引Key进行拆分,设定拆分级数为N级,其中N≥2,所述索引Key为所述散列Key中的3-8个字节;

在遍历过程中,对每个冲突项的存储地址进行校验,当遇到一条记录校验结果匹配时初步判定查询命中,从存储地址中获取数据地址,并对数据地址中的Key进行校验,校验完成时,提取数据,当无匹配存储地址时,

在所述步骤S1中,所述索引项中设有预设冲突次数的记录数占比组B0和预设前m次实际冲突次数的记录数占比之和Ba0,设定B0(B1,B2,B3,…Bn),其中,B1为所述索引项中存在2次冲突的记录数占比,B2为所述索引项中存在3次冲突的记录数占比,B3为所述索引项中存在4次冲突的记录数占比,Bn为所述索引项中存在n次冲突的记录数占比,当存储数据时,获取索引项中实际冲突次数的记录数占比B,并将该实际冲突次数的记录数占比B与预设冲突次数的记录数占比组B0中对应的冲突次数的记录数占比进行比对,若至少有一条实际冲突次数的记录数占比B小于预设冲突次数的记录数占比组B0中对应的预设冲突次数的记录数占比,则将前m次实际冲突次数的记录数占比之和Ba与预设前m次实际冲突次数的记录数占比之和Ba0进行比对,当Ba>Ba0时,将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项,若实际冲突的记录数占比B均大于预设冲突次数的记录数占比组B0中对应的预设冲突次数的记录数占比,则将校验Key中x个字节移动至索引Key以进行检索,设定0.5≤x<2,并重复该过程以使至少一条实际冲突次数的记录数占比B小于预设冲突次数的记录数占比组B0中对应的预设冲突次数的记录数占比。

具体而言,通过将Key经Hash函数算法转换成散列Key,以使数据库读写开销与Key的长度无关连,且在存储和查询时,只需将散列Key的一部分做为真正的存储索引和查询索引进行数据存储和查询,用最短的索引Key覆盖绝大多数查询请求,提高了写入和查询速度,并在存储时对数据冲突次数在控制在一定范围之内,针对绝大多数读写操作,只需进行一次物理磁盘I/O即可完成,当写入的较大的数据量时,不对现有数据块进行大规模合并或者分裂等操作,极大提升写入数量的同时,进一步提高了存储和查询速度。

尤其,通过在索引项设置预设冲突次数的记录数占比组B0,进一步地根据比对结果确定是否将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项以降低了冲突,从而进一步提高了数据库的稳定性。

尤其,通过在索引项设置预设前m次实际冲突次数的记录数占比之和Ba0,并进一步获取前m次实际冲突次数的记录数占比之和Ba,并当前m次实际冲突次数的记录数占比之和Ba大于预设前m次实际冲突次数的记录数占比之和Ba0时,将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项,进一步降低了数据库的冲突,从而进一步提高了数据库的稳定性。

优选地,本实施例中,所述索引Key为3个字节或3.5个字节或4个字节、5个字节或6个字节,所述索引Key的拆分级数N为根据数据库中已有数据量和数据库容量的比值进行确定,当该比值为0-0.5时,设定拆分级数为两级,当该比值为0.51-0.6时,设定拆分级数为三级,当该比值为0.61-0.7时,设定拆分级数为四级,当该比值为0.91-0.99时,设定拆分级数为七级。

优选地,本实施例中,将校验Key中x字节移动至索引Key的移动方式之一为每次移动0.5个字节;移动方式二为每次移动1个字节;移动方式三为每次移动2个字节。

请继续参阅图1所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,在所述步骤S1中,当所述索引项中对应的位置不存在数据,将数据写入磁盘的过程包括:

步骤S201,将原始Key和val写入content_db中,取得写入地址val_addr;

步骤S202,将校验Key、val_addr、原始Key的长度以及原始Key的辅助校验算法写入full_Key;

步骤S203,将full_Key的地址写入索引项。

本实施例中,所述content_db为在磁盘中存储没有冲突或者冲突量小于一定程度的val和key的位置,这部分数据的查询效率是最高的,整个读写过程只需要一次访问content_db的磁盘操作即可完成;所述每个full_Key能唯一地表示一条记录;所述记录为原始Key和Val(用户数据)。

请继续参阅图1所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,在所述步骤S1中,将所述数据写入所述索引项且索引项从无冲突变为有冲突状态时,按如下步骤处理:

步骤S211,将原始Key和val写入content_db中,取得写入地址val_addr;

步骤S212,将校验Key、所述地址val_addr、所述原始Key的长度以及原始Key的辅助校验算法写入full_Key,取得写入地址full_Key_addr;

步骤S213,创建一个fast_content结构,将所述索引项中原有full_Key的地址写入第一条冲突项,将所述full_Key_addr写入第二条冲突项;

步骤S214,将创建的所述fast_content结构的地址写入索引项。

本实施例中,所述fast_content为在内存中存储冲突量小于一定程度的full_key的地址列表,每个冲突项会存储多个full_key地址。

请继续参阅图1所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,在步骤S1中,当将所述数据写入所述索引项、索引项已有冲突数据且对应的地址列表中还有空闲空间可以继续容纳冲突数据时,则在fast_content地址列表中增加一条冲突数据,包括如下步骤:

步骤S301,将原始Key和val写入content_db中,取得写入地址val_addr;

步骤S302,将校验Key、val_addr以及原始Key的辅助校验算法写入full_Key;

步骤S303,将full_Key的地址追加到fast_content中已有冲突项的末尾;

当所述索引项已经存在冲突数据且对应的fast_content中没有空闲空间可以继续追加冲突数据时,直接将原始Key和val写入conflict_db。

本实施例中,所述conflict_db为在磁盘中存储冲突数量大于一定程度的val和key。这部分数据的查询效率较慢,通常会使用第三方存储来做为低层存储。由于这部分数据占比极小、访问量也极少,所以不会影响总体读写性能。

请继续参阅图1所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,所述索引项还设有预设最大重复次数Cmax,当移动字节至索引Key时,获取实际移动字节至索引Key次数C,并将实际重新选取次数C与预设最大选取次数Cmax进行比对,当C=Cmax时,移动终止并将前m次冲突对应的重复数据写入所述索引项,将其余重复数据写入第三方存储项。

具体而言,本发明实施方式本发明以MD5做Hash,采用双级索引的方式对索引Key进行拆分索引,首先对原始Key进行一次Hash获得散列Key,1亿条记录取前3.5个字节为索引Key,用一级索引覆盖索引Key的第一个字节的值,并将二级索引的地址存储在一级索引中,用二级索引覆盖索引Key的剩余字节的值,并从一级索引直接定位至二级索引,检测二级索引对应的地址是否存在数据,若不存在数据,则直接将数据写入二级索引,若存在数据,则获取二级索引的冲突状态;冲突情况如下表:

具体而言,在上表中,无冲突的占比约90.67%,2次和3次冲突的重复数据占比约9.27%,大于3次冲突的占比约0.06%。将2次和3次的冲突索引数据放入内存中,可覆盖99.94%的查询数据。为了节省内存空间,将占比约0.06%的大于3次冲突索引的数据存入conflict_db。本发明将占比大的冲突数据和占比小的冲突数据用不同的方法分别处理,以提升存储和查询效率。

本实施例中,所述一级索引为在内存中针对索引Key的第一字节所建立的第一级索引。它是用一个数组来实现的,数组元素数是256,数组项的值存储的是二级索引的地址。所述二级索引为在内存中,每个一级索引项对应一个二级索引表,用于存储索引Key从第二字节开始的数据索引,当对应的索引项没有冲突时,每个二级索引项中存储full_key的地址,当对应的索引项有冲突时,每个二级索引项中存储fast_conflict的地址,每个二级索引项用一个type字段来区别当前是否为冲突索引项。

优选地,本实施例中所述Hash算法还可以是SHA1、SHA2以及SHA256;所述冲突次数m=3;

优选地,本实施例中,所述原始Key的辅助校验算法包括原始Key的长度和原始key的CRC32或者其他辅助校验算法,本实施例对此不做限定。

具体而言,当向索引项写入数据时,通过获取索引项是否已经存在数据,并根据获取的结果选取不同的处理方式,进一步提高了数据库对数据的处理速度,从而进一步提高了数据库的稳定性。

具体而言,通过在索引项中设置最大重复次数Cmax,并在实际重复次数等于预设重复次数时,终止向索引Key移动字节,在保证了索引Key字节相对短的情况下进一步降低了冲突,从而进一步提高了数据库的稳定性。

具体而言,通过将不同占比的冲突数据用不同的方法分别处理,进一步提升存储和查询效率,从而进一步提高了数据库的处理效率。

请继续参阅图2所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,在所述步骤S2中,当查询数据时,对无冲突索引项初步确定命中并进行校验的过程包括:通过取得的所述full_Key地址,查询到该条数据的校验Key以及Key的辅助校验算法,执行校验,若校验不匹配,则认为查询无命中,若校验匹配初步认为查询命中,则根据从full_Key数据项中取得的存储在content_db中的数据地址继续读取数据内容。

请继续参阅图2所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,在所述步骤S2中,当查询数据时,若所述索引项为有冲突索引项,则获取所述索引Key对应的地址列表,获取完成时,遍历地址列表中的冲突项的过程包括:通过取得的fast_conflict地址,查询到该条数据在对应的fast_conflict数据,查询完成时,遍历fast_conflict中的所有冲突项,每个冲突项存储的是full_Key地址,并在遍历的过程中,对每个full_Key地址查询数据的校验Key以及原始Key的辅助校验算法,执行校验,只要遇到一条记录校验匹配则判定查询命中,根据从当前full_Key数据项中取得的存储在content_db中的数据地址继续读取数据内容。

请继续参阅图2所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,在所述步骤S2,当遍历过程中没有匹配的full_Key地址时,通过Bloom Filter算法在conflict_db查询所述原始Key,若原始Key不存在,则判定查询无命中。

请继续参阅图2所示,本发明所述一种以部分散列Key为索引的Kv数据库存储与查询方法,所述数据地址为指向content_db中数据的地址,从数据地址中获取数据,并对数据中的Key进行校验,校验完成时,提取数据,具体过程包括:在content_db中,通过一次磁盘读取获得val和原始Key,并最后一次校验从content_db中取得的原始Key与用户指定的原始Key是否匹配,若匹配,则查询命中,并且取得了数据,结束查询,若不匹配,则查询未命中。

请参阅图2所示,本发明实施例所述一种以部分散列Key为索引的Kv数据库查询方法,在所述步骤S2中,当查询数据时,通过索引Key第一个字节的值,在一级索引中进行查询,一级索引可以是拥有256个下标的数组,所以一次内存定位即可完成查询,如果在一级索引中未查询到有效的二级索引地址,则认为查询无命中;否则通过二级索引地址,取得二级索引的起始位置继续查询。

具体而言,通过索引Key中从第2字节开始的剩余2.5字节值,在二级索引中进行查询。每个二级索引可以是拥有1048576个下标的数组,所以一次内存定位即可完成查询,如果在二级索引中未查询到有效数据项,则认为查询未命中;否则通过命中的二级索引数据项继续判断。

具体而言,在二级索引数据项中,如果表明当前是一个无冲突的索引项,则记录的是full_Key的地址,或表明当前是一个有冲突的索引项,则记录的是fast_conflict结构的地址。

请参阅图2所示,本发明实施例所述一种以部分散列Key为索引的Kv数据库查询方法,在所述步骤S3中,当查询数据时,对无冲突索引项初步确定命中并进行校验包括:通过取得的full_Key地址,查询到该条数据的校验Key以及Key的辅助校验算法,执行校验,若校验不匹配,则认为查询无命中,若校验匹配认为查询命中,则根据从full_Key数据项中取得的存储在content_db中的数据地址继续装载记录内容;

当查询数据时,对有冲突索引项,在多个冲突数据中查询包括:通过取得的fast_conflict地址,查询到该条数据在内存中存储的fast_conflict数据,查询完成时,遍历fast_conflict中的所有冲突项,每个冲突项存储的是full_Key地址,并在遍历的过程中,对每一个full_Key地址查询该条数据的校验Key以及Key的辅助校验算法,执行校验,只要遇到一条记录校验匹配则认为查询命中,根据从当前full_Key数据项中取得的存储在content_db中的数据地址继续装载记录内容,执行步骤S4,若遍历过程中没有匹配的full_Key,则通过Bloom Filte算法在在conflict_db查询Key,若Key不存在,则判定查询无命中。

具体而言,在内存中的fast_conflict并未命中任何记录时,首先在conflict_db的Bloom Filter中查询,如果确定查询Key并不存在,则认为查询无命中,这极大的防止查询逻辑落入较慢的conflict_db的查询中而影响性能。

请继续参阅图2所示,本发明实施例所述一种以部分散列Key为索引的Kv数据库查询方法,若通过Bloom Filte算法在在conflict_db查询Key不存在,判定查询无命中时,则在conflict_db中直接通过Key查询val,查询成功则命中,查询失败则无命中,结束查询任务。

请继续参阅图2所示,本发明实施例所述一种以部分散列Key为索引的Kv数据库查询方法,在所述步骤S2中,所述数据地址为从存储地址指向content_db中的数据地址,从存储地址中获取数据地址,并对数据地址中的原始Key进行校验,校验完成时,提取数据包括:在content_db中,通过一次磁盘读取获得val和原始Key,并最后一次校验从content_db中取得的原始Key与用户指定的原始Key是否匹配,若匹配,则查询命中,并且取得了数据,结束查询;若不匹配,则说明遇到了极其罕见的Hash冲突,但不影响查询的准确性,认为查询未命中。

具体而言,当在内存中的fast_conflict并未命中任何记录时,在conflict_db中直接通过原始Key查询val,查询成功则命中,查询失败则无命中。这一步是最慢的环节,直接采用第三方Kv存储来完成查询任务,结束查询。

本发明所述的以部分散列Key为索引的Kv数据库存储与查询方法采用以下设备来实现:

硬件配置:

CPU型号:Intel Xeon E7520

CPU 主频:1866MHz

CPU 核心数:4核心

CPU线程数:8线程

操作系统:Linux x86_64、内核版本号:3.10.0

GCC版本:4.8.3 20140911

测试数据:1000个TCP长连接并发写入,Key和val部分从100字节到1M字节不等,也就是说单条记录最大长度是2M。

实施例一、单机写入数据7.5亿条。这属于极限测试,LevelDB的极限记录条数是1亿条左右。顺利完成写入后,具体存储情况如下:

在本实施例中,用4.5小时入库7.5亿条数据,平均每秒钟4.6万条。

在本实施例中,当写入7.5亿条后,本发明各模块的工作状态如下:

冲突次数统计如下:

如上表,冲突主要集中在2次到5次之间。针对这次极限测试,从数据上看,fast_conflict的条数为5次比较合适,但实际测试只是用3.5字节做为索引Key。考虑到这是一次极限测试,参数没有调优的情况下性能表现也能如此,已经比较理想了,同时也说明性能还有很大的提升空间。

实施例二、写入1亿条记录,每秒插入5.21万条,总耗时1920秒,也就是32分钟;写入3亿条记录,每秒插入3.78万条,总耗时7940秒,也就是132分钟。

在本实施例中,写入1亿条后,本发明各模块的工作状态如下:

冲突次数统计如下:

如上表,冲突完全集中在2次到3次之间,与设计非常吻合。上表也表现出系统处理1亿条规模的数据比较轻松。

实施例三、1000个TCP长连接并发查询前面写入的记录,每秒查询11.1万条,测试进行了900秒,也就是15分钟;3亿条记录,每秒查询10.7万条,测试进行了1200秒,也就是20分钟。

本实施例中,对已经写入5亿数据的库进行查询,各模块工作状态如下:

如上表所见,由fast_conflict和content_db承担了绝大部分查询次数的开销,而在conflict_db查询的次数被压缩到了比较少的调用次数。这是与设计预期相符的。

对比例一、Oracle:单表只用100个并发入库,性能拐点在5千万条左右。单表超过5千万条就会频繁出现假死情况,8、9千万条以上就已经慢到完全不可用,无法继续测试。

LevelDB:单机插入1亿条记录开始,性能从每秒钟3万条记录陡降到每秒钟几千条记录,并频繁出现假死情况,数据存储文件陷落在LSM Tree节点的整理过程中,整个数据库实例都被阻塞很长时间,甚至能达到半小时以上,无法继续测试。遇到这种情况时,LevelDB会输出很多日志如:“Too many L0 files; waiting...”。遇到这种日志时,如果还继续写入就是灾难了。申请人实际测试写入了约 1.7 亿条数据,第一次 leveldb 阻塞了 10 分钟,第二次 leveldb 阻塞了 44 分钟。

至此,已经结合附图所示的优选实施方式描述了本发明的技术方案,但是,本领域技术人员容易理解的是,本发明的保护范围显然不局限于这些具体实施方式。在不偏离本发明的原理的前提下,本领域技术人员可以对相关技术特征做出等同的更改或替换,这些更改或替换之后的技术方案都将落入本发明的保护范围之内。

以上所述仅为本发明的优选实施例,并不用于限制本发明;对于本领域的技术人员来说,本发明可以有各种更改和变化。 凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 一种以部分散列Key为索引的Kv数据库存储与查询方法
  • 一种以部分散列Key为索引的Kv数据库存储与查询方法
技术分类

06120112941786