一种基于键值数据库的层次化存储与查询方法

文档序号:6630695阅读:459来源:国知局
一种基于键值数据库的层次化存储与查询方法
【专利摘要】本发明公开了一种基于键值数据库的层次化存储与查询方法,实施步骤如下:预先构建层次化键码命名规则并确定键码间的比较方法;执行数据存储请求时,根据键码比较方法来确定数据存储请求的键码排序位置并将数据插入键值数据库;执行数据查询请求时,查找第一个大于或等于目标键码目录下所有可能键码的下确界作为起始键码,从起始键码开始,将所有以目标键码开头的键值对以及子目录作为数据查询请求的结果返回。本发明能够在键值数据库的传统特性的基础上具备高速层次化数据的存储和查询能力,能够有效地组织和存储类似树状的复杂数据,可作为轻型分布式网络文件系统支持海量文件的目录方式数据存储。
【专利说明】-种基于键值数据库的层次化存储与查询方法

【技术领域】
[0001] 本发明涉及键值数据库(Key-Value数据库)【技术领域】,具体涉及一种基于键值数 据库的层次化存储与查询方法。

【背景技术】
[0002] 对比典型SQL数据库,键值数据库(Key-Value数据库)用于存储无结构的键值数 据,即以键码(即Key)作为索引,对Key对应的数据记录(即Value)进行读、写、删除等操 作。由于键值数据库只关心通过Key索引Value的过程,不关心Value中存储的具体数据 的结构和内容,因此键值数据库相较于SQL数据库而言,具有功能专一、平面化存取数据性 能高、分布式处理的可扩展性强的优点。
[0003] 目前,键值数据库对数据本身的结构表达能力较弱,整个数据库可以被简单地看 成一张扁平的一维数组形式的大表,使用key作为数组的索引,value是数组中对应元素的 数据。这种扁平化的一对一存储查询模式存在以下不足。
[0004] 一、现实生活中的数据往往是具有一定属性层次的。以图1所示的班级学生的考 试成绩为例,1班包括小王和小李等学生节点,每一位学生又分别包括语文、数学等科目节 点,每一个科目节点对应一个考试成绩的数值,例如小王的语文成绩为91分。如果想按照 图1所示的数据组织,分层分类存储各个同学的分数数据,则键值数据库现有的扁平化的 一对一〈key, value〉存储模式很难满足该存储需求。
[0005] 二、现有的键值数据库很难对某同一层次的数据进行查询并迭代。参见图1,若键 值数据库存储各个人的考试成绩的话,通常的key-value对描述可能是:〈"1班的小王的 语文成绩",91>,若我们想从中查询1班都有哪几位学生时,尽管上述键值数据库中key的 信息包含了该问题的答案,但现有的键值数据库将很难做出查询。这是因为现有的键值数 据库不存在层次化的存储结构,所以只能够通过迭代整个数据库中所有的Key的方式来逐 一查询并提取信息,整体效率相对较低,耗时长。


【发明内容】

[0006] 本发明要解决的技术问题是:针对现有技术的上述技术问题,提供一种能够在键 值数据库的传统特性的基础上具备高速层次化数据的存储和查询能力,能够有效地组织和 存储类似树状的复杂数据,可作为轻型分布式网络文件系统支持海量文件的目录方式数据 存储的基于键值数据库的层次化存储与查询方法。
[0007] 为了解决上述技术问题,本发明采用的技术方案为:
[0008] 一种基于键值数据库的层次化存储与查询方法,其实施步骤如下:
[0009] 1)预先在有序存储的键值数据库中构建层次化键码命名规则,所述层次化键码命 名规则将键码定义为以分隔符开头、且由分隔符和子串交替组合组成,分隔符的数量表示 键码的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的 键码则根据字符串比较确定大小;
[0010] 2)接收键值数据库的访问请求,如果访问请求为数据存储请求,则跳转执行步骤 3),如果访问请求为数据查询请求,则跳转执行步骤4);
[0011] 3)根据所述两个合法的键码之间的大小比较方法来确定数据存储请求的键码排 序位置,然后按照排序位置将数据存储请求的数据插入键值数据库,返回执行步骤2);
[0012] 4)在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的 目标键码k ey<to目录下所有可能键码的下确界作为起始键码keystart,从起始键码keystart开 始,按照从小到大的顺序将所有以目标键码key-开头的键值对以及子目录作为数据查询 请求的结果返回。
[0013] 优选地,所述步骤1)中确定的两个合法的键码之间的大小比较方法如下:
[0014] 1. 1)接收由key 1和key2组成的两个合法的键码;
[0015] 1. 2)比较key 1和key2之间的级数大小,如果key 1和key2的级数不同,则跳转执 行步骤1. 3),否则跳转执行步骤1. 4);
[0016] 1. 3)判断key 1的级数大于key2的级数是否成立,如果成立则判定key 1比key2 大,否则判定key2比key 1大,返回比较结果并退出;
[0017] 1.4)初始化 i 为 1;
[0018] 1. 5)判断keyl的级数大于或等于i是否成立,如果成立则跳转执行步骤1. 6);否 则判定keyl等于key2,返回比较结果并退出;
[0019] 1. 6)判断keyl和key2的前i级子串是否相等,如果相等则将i增加1,跳转执行 步骤1. 5);否则,判断keyl的第i级子串大于key2的第i级子串是否成立,如果成立则判 定keyl比key2大,否则判定key2比key 1大,返回比较结果并退出。
[0020] 优选地,所述步骤3)的详细步骤如下:
[0021] 3. 1)接收用户的数据存储请求〈newKey, newValue〉,其中newKey表不数据存储请 求的键码,newValue表示数据存储请求的键值;
[0022] 3. 2)判定所述键值数据库是否为空,如果键值数据库为空,则直接将所述数据存 储请求的键值对〈newKey,newValue〉存入键值数据库并退出;如果键值数据库非空,则跳 转执行下一步; _
[0023] 3. 3)顺序查找第一个大于或等于所述数据存储请求的键码newKey的目标键码 existed_key ;
[0024] 3. 4)判断所述数据存储请求的键码newKey是否等于目标键码existed_key,如果 所述数据存储请求的键码newKey等于目标键码existed_key,则判定所述数据存储请求的 键码newKey在键值数据库中是否己经存在,将目标键码existed_key对应的键值替换为数 据存储请求的键值对〈newKey, newValue〉中的新键值newValue并退出;否则,将所述数据 存储请求的键值对〈newKey, newValue〉插入保存在目标键码existed_key对应的键值对 、貧- 刖。
[0025] 优选地,所述步骤4)的详细步骤如下:
[0026] 4_ 1)初始化查询结果集合SMt ;在键值数据库中按照从小到大的顺序查找第一个 大于或等于数据查询请求的目标键码key&目录下所有可能键码的下确界作为起始键码 keystart,将起始键码keystart作为当前指针键码keynMt ;所述数据查询请求的目标键码ke?r 满足式(1)所示字符串形式,所述目标键码keyto目录下所有可能键码的下确界符合式(2) 所示字符串形式;
[0027] fmkke)^ / mbkey^ /./ Slibkey{t, Cl)
[0028]式⑴中,.vw/如·>?,表示目标键码keydir的第i级子串,i表示目标键码 keyd的 级数,/表示分隔符; 11:
[0029] fsubkeylv/subkey2^ /..,/smbkeyll /α (2)
[0030]式(2)中,5表示目标键码keydir的第i-1级子串; α表示构成键码子串的 字符串全集中排序规则最小的字符串;/表示分隔符;
[0031] 4· 2)判断当前指针键码keynra!t以式(1)所示字符串开头、匹配式所示字符串 形式的第i+Ι层目录两个条件是否同时成立,如果同时成立则将当前指针键码key对应 的键值对<keyn ext, Value〉加入到查询结果集合Sr(;t,后移查找指针得到新的当前指针键码 keynext,跳转执行步骤4.2);否则跳转执行步骤4.3);
[0032] 4subkeyly i siAke^ f f 端 (力
[0033]式⑶中,祕轉表示目标键码keydir的第i级子串,表示当前指针 键码keynext的弟i+Ι级子串,/表不分隔符;
[0034] 4. 3)判断当前指针键码keynext以字符串式(1)开头、同时匹配式(4)所示字符串 形式的η层结构两个条件是否仍然成立,如果成立则判定当前指针键码匕%#位于目标键 码keydir下的某一级子目录中,跳转执行步骤4. 4),否则跳转执行步骤4. 6)ne;Xt
[0035] Jsuhkey^ i·,./rnMey1^ isubkey^ /../subkey^ ¢4)
[0036] 式⑷中,如施土表示目标键码keydlr的第i级子串,踢,表示当前指针 键码keynMt的第i+Ι级子串,?t表示当前指针键码key_ t的第n级子串,z表示分 隔符;
[0037] 一 4.4)判定式(3)所示字符串形式的子目录为目标键码keydir的下一级目录,将式 (3)所示字符串作为键码和子目录标识生成式(5)所示形式的键值对并加入到查询结果集 合 Sret ;
[0038] i/mbk^efJsM^y i^Jsmbkey^ ,[dir]> (5?
[0039] 式(5)所示形式的键值对中,键码为式(3)所示的字符串,键值[dir]表示子目录 标识,/表不分隔符;
[0040] 4· 5)跳过当前指针键码keyMxt对应目录下的所有键码,从当前指针键码keyMxt开 始,按照从小到大的顺序查找第一个大于式(6)所示字符串形式的键码作为新的当前指针 键码keynext,判断新的当前指针键码keynext以式(1)所示字符串开头是否成立,如果成立则 跳转执行步骤4. 3),否则跳转执行步骤4. 6); _] (6) _2]式⑹中,*表示目标键码keydir的第i级子串,表示当前指针键 码keynMt的第i+1级子串,α表示构成键码子串的字符串全集中排序规则最小的字符串, /表示分隔符;表示对于当前指针键码keynext中使用Next方法返回一个字 符串subkeynext,所述Next方法具体是指针对当前指针键码keynMt下所有子串可能构成的 字符串全集中的任意字符串s,如果该字符串s大于或等于目标键码keydir的第i级子串 ,则将大于目标键码keydir的第i级子串抑驗^且小于或等于该字符串s之间 的子串subkeynexJt为结果返回;
[0043] 4_ 6)判断当前指针键码keynext大于如式⑵所示字符串形式的键码是否成立,如 果成立,则代表当前指针键码keynext所代表的如式(8)所示字符串形式的第n层键码中已 无以式(1)所示字符串开头的键值对数据,从当前指针键码keynfSt开始,按照从小到大的 顺序查找第一个大于如式( 9)所示字符串形式的键码作为当前指针键码keynfStjn果不成 立,则按照从小到大的顺序查找第一个等于或大于如式(7)所示字符串形式的键码作为当 前指针键码key next ;
[0044] /subkeyltiy /subkey^J..J
[0045] 式(7)中,表示目标键码keydir的第i级子串;α i+1表示第i+l级字符串 为构成键码子串的字符串全集中排序规则最小的字符串的子串,α n表示第n级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
[0046] hubkey]iey subkey2^ L,J suhke^j (g)
[0047] 式⑶中,表示目标键码keydir的第n级子串,/表示分隔符;
[0048] /subkeyly / subkey2^, /./ subkey'key / α? / / / (9)
[0049] 式(9)中,_%4^表示目标键码keydir的第i级子串;a i+1表示第i+1级字符串 为构成键码子串的字符串全集中排序规则最小的字符串的子串,a n表示第η级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串;a 11+1表示第η+1级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
[0050] 4. 7)检测当前指针Key键码否已经到达键值数据库的文件尾部,如果尚 未到达文件尾部则跳转执行步骤4· 3);否则跳转执行步骤4· 8);
[0051] 4. 8)将查询结果集合SMt的内容作为数据查询请求的结果返回。
[0052] 优选地,所述步骤4· 1)和4. 5)中按照从小到大的顺序查找具体是指从小到大的 顺序进行逐一顺序查找、二分查找或者SkipList查找。
[0053] 本发明基于键值数据库的层次化存储与查询方法具有下述优点:本发明通过预先 在有序存储的键值数据库中构建层次化键码命名规则以及确定两个合法的键码之间的大 小比较方法,针对数据存储请求,根据两个合法的键码之间的大小比较方法来确定数据存 储请求的键码排序位置,然后按照排序位置将数据存储请求的数据插入键值数据库;针对 数据查询请求,在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求 的目i键码目录下所有可能键码的下确界作为起始键码,从起始键码开始,按照从小到大 的顺序将所有以目标键码开头的键值对以及子目录作为数据查询请求的结果返回,因此使 得一个已存在的有序存储键值数据库(比如:LevelDB等),在不改变已有的简单有效的 Key-Value平面化一对一存储的前提下,同时具备层次化数据的存储能力与查询能力,使得 键值数据库不但具有功能专一、平面化存取数据性能高、分布式处理的可扩展性强等传统 特性,也同时具备了高速层次化数据的存储能力与查询能力,从而可以有效组织存储类似 树状的复杂数据,还可以作为轻型分布式网络文件系统,支持海量文件的目录方式的数据 存储。

【专利附图】

【附图说明】
[0054] 图1为常见的具有属性层次的学生考试成绩数据结构示意图。
[0055] 图2为本发明实施例的基本方法流程示意图。
[0056] 图3为本发明实施例中两个合法的Key之间的大小比较方法的流程示意图。
[0057] 图4为本发明实施例中步骤3)执行数据存储请求的流程示意图。
[0058] 图5为本发明实施例中步骤4)执行数据查询请求的流程示意图。
[0059] 图6为本发明实施例中键值数据库已存储数据的层次结构示意图。
[0060] 图7为本发明实施例中键值数据库已存储数据的初始数据实例示意图。
[0061] 图8为本发明实施例中键值数据库执行数据存储请求的过程示意图。
[0062] 图9为本发明实施例中键值数据库执行数据存储请求后的数据实例示意图。
[0063] 图10为本发明实施例中执行数据查询请求时针对keynext = /a/b的查询过程示意 图。
[0064] 图11为本发明实施例中执行数据查询请求时针对keynfSt二/a/e的查询过程示意 图。
[0065] 图12为本发明实施例中执行数据查询请求时针对keynra£t = /b/c的查询过程示意 图。
[0066] 图13为本发明实施例中执行数据查询请求时针对keyMXt = /a/c/f/g的查询过程 示意图。
[0067] 图14为本发明实施例中执行数据查询请求时针对keyn6Xt二/b/d/e/f的查询过程 示意图。

【具体实施方式】
[0068] 如图2所示,本实施例基于键值数据库的层次化存储与查询方法的实施步骤如 下:
[0069] 1)预先在有序存储的键值数据库中构建层次化键码命名规则,层次化键码命名规 则将键码定义为以分隔符开头、且由分隔符和子串交替组合组成,分隔符的数量表示键码 的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键码 则根据字符串比较确定大小;
[0070] 2)接收键值数据库的访问请求,如果访问请求为数据存储请求,则跳转执行步骤 3),如果访问请求为数据查询请求,则跳转执行步骤4);
[0071] 3)根据两个合法的键码之间的大小比较方法来确定数据存储请求的键码排序位 置,然后按照排序位置将数据存储请求的数据插入键值数据库,返回执行步骤2);
[0072] 4)在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的 目标键码keydir目录下所有可能键码的下确界作为起始键码keystart,从起始键码key start开 始,按照从小到大的顺序将所有以目标键码keydir开头的键值对以及子目录作为数据查询 请求的结果返回。
[0073] 本实施例中层次化键码命名规则如下:键码定义为以分隔符开头、且由分隔符和 子串交替组合组成,其形式类似…//,分隔符的数量表示键 码的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键 码则根据字符串比较确定大小。本实施例中分隔符使用" / "表示,键码的子串是指除了最 小字符串外其他所有某类字符任意组合的字符串,层次化key是由规定的分隔符与key子 串相互交替组合在一起的字符串,必须以分隔符开头。键码的级数为分隔符"/,,的数目,用 Level (key)表示。本实施例中,定义从键码key字符串的起始位置开始,第n个分隔符与 第η+1个分隔符中间所夹着的字符串称为键码key的第η级子串,表示为甜(为阐 述方便,下文中η从1开始计算)。对于字符串形式为論匕./的 键码而言,字符串称为key的第i层目录;而起完整的字 符串则称为第η层的key。上图所示的层次化数据,层次化查询数据库中以/a目录层次下 的所有key与子目录,应该得到如下key-value列表:</a/b2, 100>,</a/bl, [dir] >。其中 [dir]表示/a/bl是目录。
[0074] 如图3所示,步骤1)中确定的两个合法的键码之间的大小比较方法如下:
[0075] 1. 1)接收由keyl和key2组成的两个合法的键码;
[0076] 1.2)比较 keyl 和 key2 之间的级数大小(判断 Level (keyl) == Level (key2)是 否成立),如果keyl和key2的级数不同,则跳转执行步骤1· 3),否则跳转执行步骤1. 4);
[0077] 1. 3)判断 keyl 的级数大于 key2 的级数(Level (keyl) >LeVel (key2))是否成立, 如果成立则判定keyl比key2大(keyl>key2),否则判定key2比keyl大(keyl<key2),返 回比较结果并退出;
[0078] 1. 4)初始化 i 为 1 ;
[0079] 1. 5)判断keyl的级数大于或等于i (i< = Level (keyl))是否成立,如果成立则跳 转执行步骤1.6);否则判定keyl等于key2,返回比较结果并退出;
[0080] 1· 6)判断keyl和key2的前i级子串是否相等(乂,vl == .wMd.2:),如果相 等则将i增加1,跳转执行步骤1. 5);否则,判断keyl的第i级子串大于key2的第i级子 串(^^乂(.1, 1>.?^^^2)是否成立,如果成立则判定1^1比1^2大〇^1>1^2),否则 判定key2比keyl大(keyl<key2),返回比较结果并退出。
[0081] 本实施例中,判断keyl的第i级子串大于key2的第i级子串是否成立时采用常 规字符串大小比较方法:将等长度不同的两个key子串,从前至后顺序地逐个比较每个字 符的ASCII编码值,比较过程中,首次出现ASCII值大的那个字符串为较大字符串,另一个 为较小字符串;若两个字符串的每个字符ASCII编码值都完全相同,则两字符串相等。 [0082]需要说明的是,比较每个字符的ASCII编码值的具体算法不受限制,但必须在字 符串集合上满足全序关系(比如常见的按字母编码逐个进行比较的字符串比较方法)。
[0083] 如图4所示,步骤3)的详细步骤如下:
[0084] 3. 1)接收用户的数据存储请求〈newKey, newValue〉,其中newKey表示数据存储请 求的键码,newValue表示数据存储请求的键值;
[0085] 3. 2)判定键值数据库是否为空,如果键值数据库为空,则直接将数据存储请求的 键值对〈newKey, newValue〉存入键值数据库并退出;如果键值数据库非空,则跳转执行下 一步;
[0086] 3. 3)顺序查找第一个大于或等于数据存储请求的键码newKey的目标键码 existed-key ;
[0087] 3· 4)判断数据存储请求的键码newKey是否等于目标键码existed_key(existed_ key == newKey),如果数据存储请求的键码newKey等于目标键码existed_key,则判定 数据存储请求的键码newKey在键值数据库中是否已经存在,将目标键码existecLkey对 应的键值替换为数据存储请求的键值对〈newKey, newValue〉中的新键值newValue并退 出;否则,将数据存储请求的键值对〈newKey,newValue〉插入保存在目标键码existed^ key对应的键值对前。需要说明的是,若目标键码existed_key不满足existed_key == newKey,则一定能够找到这样一个目标键码existed_key,它满足newKey〈existed_key,并 且在当前数据库中,任何小于目标键码existed_key的less_existed_key,都满足less_ existed_key<newKey (即在数据库已有键值对中,一定存在一个第一个比数据存储请求的 键码newKey大的目标键码existed_key),因此本实施例中只需要将〈newKey, newValue〉键 值对插入保存到目标键码existecLkey对应的键值对前即可。
[0088] 如图5所示,步骤4)的详细步骤如下:
[0089] 4· 1)初始化查询结果集合Sret ;在键值数据库中按照从小到大的顺序查找第一个 大于或等于数据查询请求的目标键码keydir目录下所有可能键码的下确界 作为起始键码keystart,将起始键码keystart作为当前指针键码keynfSt ;数据查询请求的目 标键码keydir满足式(1)所示字符串形式,目标键码keyfc目录下所有可能键码的下确界 ?符合式⑵所示字符串形式;
[0090] tsubkey1^ / mibke^^ I ". . / stMey^, C:l)
[0091] 式⑴中,沖表示目标键码keydir的第i级子串,i表示目标键码key dir的 级数,/表示分隔符;
[0092] fsubkeyl^ Imbkm^ 1.. Jmbkey^ / α :(2)
[0093] 式(2)中,表示目标键码keydir的第i-l级子串; α表示构成键码子串的 字符串全集中排序规则最小的字符串;/表示分隔符;本实施例中,构成键码子串的字符串 为小写字母,因此构成键码子串的字符串全集中排序规则最小的字符串为a ;
[0094] 4. 2)判断当前指针键码keynext以式⑴所示字符串开头、匹配式⑶所示字符串 形式的第i+Ι层目录两个条件是否同时成立,如果同时成立则将当前指针键码key next对应 的键值对<keynext,Value〉加入到查询结果集合S"t,后移查找指针得到新的当前指针键码 keynext,跳转执行步骤4· 2);否则跳转执行步骤4· 3);
[0095] isuhkcy)^ / s^keyly /,, Jmbk^ f subkey^ ^ (|)
[00%]式⑶中,爲表示目标键码keydir的第i级子串,處!表示当前指针 键码keynMt的第i+Ι级子串,/表示分隔符;
[0097] 4· 3)判断当前指针键码keynext以字符串式⑴开头、同时匹配式⑷所示字符串 形式的η层结构两个条件是否仍然成立,如果成立则判定当前指针键码key_t位于目标键 码keydir下的某一级子目录中,跳转执行步骤4. 4),否则跳转执行步骤4. 6)7
[0098] !subkeylm t subkeyliy /,/ subkey'w f mbkey'^ /... isubkeynk {4)
[0099] 式⑷中,表示目标键码keydir的第i级子串,表示当前指针 键码keynrait的第i+l级子串表示当前指针键码key_ t的第η级子串,/表示分 隔符;
[0100] 4.4)判定式(3)所示字符串形式的子目录为目标键码keydir的下一级目录,将式 (3)所不字符串作为键码和子目录标识生成式(5)所示形式的键值对并加入到查询结果集 合 Sret ;
[0101] <:/ smbke^i smlAe^ L.J sMe^L· fmibke^\ ,[dir] (5)
[0102]式(5)所不形式的键值对中,键码为式(3)所示的字符串,键值[dir]表示子目录 标识,/表示分隔符;
[0103] 4· 5)跳过当前指针键码keynexji应目录下的所有键码,从当前指针键码 始,按照从小到大的顺序查找第一个大于式(6)所示字符串形式的键码作为新的当前指针 键码key^t,判断新的当前指针键码keyn(st以式 (1)所示字符串开头是否成立,如果成立则 跳转执行步骤4. 3),否则跳转执行步骤4. 6);
[0104] !subkeylv ; subke^ f.,J subkeyiy / subhey;^ 1,.. / NextL 1 f a (0)
[0105]式(6)中,麵表示目标键码keydir的第i级子串,.W/命v(.;; w表示当前指针 键码keynMt的第i+l级子串,a表示构成键码子串的字符串全集中排序规则最小的字符 串,/表示分隔符;表示对于当前指针键码key_中使用Next方法返回一 个字符串subkeynext,Next方法具体是指针对当前指针键码keynext下所有子串可能构成的 字符串全集中的任意字符串S,如果该字符串S大于或等于目标键码keydir的第i级子串 ",则将大于目标键码keydir的第丨级子串如秘響?且小于或等于该字符串s之间 的子串SubkeynexJt为结果返回;
[0106^ 4. 6)判断当前指针键码keynext大于如式⑵所示字符串形式的键码是否成立,如 果成立,则代表当前指针键码keynext所代表的如式(8)所示字符串形式的第η层键码中已 无以式(1)所示字符串开头的键值对数据,从当前指针键码 keynMt开始,按照从小到大的 顺序查找第一个大于如式(9)所示字符串形式的键码作为当前指针键码 keynsxt;如果不成 立,则按照从小到大的顺序查找第一个等于或大于如式(7)所示字符串形式的键码作为当 前指针键码keynra£t ;
[0107] isubkey{^ / siibheyl^, /./ subkey'^ / α?Η' /., J tf' 〇
[0108] 式(7)中,鄭錄)ir表不目标键码keydir的第i级子串;α i+i表示第i+1级字符串 为构成键码子串的字符串全集中排序规则最小的字符串的子串,αη表示第η级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
[0109] lsubkey{ev / subke^ $... f / 轉)
[0110] 式⑶中,表示目标键码keydir的第η级子串,/表示分隔符;
[0111] /mbke^ imMe^i..Jmbk^ /?w /./of /#+1 (齡
[0112] 式(9)中,表示目标键码keydir的第i级子串;α w表示第i+1级字符串 为构成键码子串的字符串全集中排序规则最小的字符串的子串,a n表示第η级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串;a n+1表示第η+1级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串;/表示分隔符;
[0113] 4. 7)检测当前指针Key键码keynextS否已经到达键值数据库的文件尾部,如果尚 未到达文件尾部则跳转执行步骤4. 3);否则跳转执行步骤4.8);
[0114] 4. 8)将查询结果集合Sret的内容作为数据查询请求的结果返回。
[0115] 本实施例中,将表示目标键码keydir目录下所有可能键码的下确界。 由层次化排序规则,易证明:一个数据库中,式(1)所示字符串形式的Key&目录下的所有 可能的键码K1 一定满足式(1〇)。
[0116] !subkey\ey / subkeyly /./ subkey1^ / a < K1 (lO j
[0117] 即键码f大于或等于式(2)所示字符串。因此,将式(2)所示字符串使用目标键 码keydir目录下所有可能键码的下确η。:由于键值数据库中的键码是按序存 储的,因此1的定义允许查询方法迅速定位数据库中第i层的key的起始位置。
[0118] 本实施例中定义了 Next ()方法,则Λ^λΥ(λ'μ/^:£〈γ^ )的含义如下:构造一个比 略大,并且最接近于的subkeynext字符串。该字符串subkey MXt满足: VsE {所食f串可能构成的卞符串全集〗,若似则必有彡知 对于式⑴所示字符串形式的Keydir,其目录下的最小键码应为式⑵所示字符串,且 Nexib^key1-)满足Next(mbkeyley) = $ι?Ι(β}^+ *M"。:
[0119] 本实施例中,步骤4· 1)和4·5)中按照从小到大的顺序查找具体是指从小到大的 顺序进行逐一顺序查找、二分查找或者SkipList查找。其中,使用二分查找或者SkipList 查找能够有效提升查找的效率,使得查找速度更快,从而能够有效提升键值数据库的查询 性能。
[0120] 本实施例中,针对键码Key的任何子串subkeykey均为仅由小写字母组成的字符 串。假设键值数据库已存储如图 6所示的数据,其中虚线表示键值对(Key-Value对),实线 表示键码(Key)的层次结构,则该数据在键值数据库中顺序存储的key-value数据实例如 图7所示。下面将结合上述数据以及具体的数据存储请求或数据查询请求来对本实施例执 行数据存储请求或者数据查询请求的过程进行详细说明。
[0121] (一)数据存储请求。假设数据存储请求的数据〈newKey,newValue〉为</b/d,5>, 即需要将</b/d,5>层次化存储进键值数据库,如图8所示,其操作步骤如下:①、根据步骤 3. 1),接收用户的数据存储请求求</b/d, 5>,其中newKey为/b/d, newValue为5 ;②、根据 步骤3. 2),判定键值数据库是否为空,如果键值数据库为空,则直接将数据存储请求的键值 对存入键值数据库并退出;如果键值数据库非空,则跳转执行下一步;③、根据步骤3. 3), 顺序查找第一个大于或者等于数据存储请求的newKey (/b/d)的目标键码existed_key,查 找得到的目标键码existed_key的值为/a/c/d ;④、根据步骤3. 4),将数据存储请求的键值 对</b/d,5>插入保存在目标键码existecLkey对应的键值对</a/c/d,4>前。键值数据库 在执行上述数据存储请求后,最终得到的的数据实例如图9所示。
[0122] (二)数据查询请求。假设数据查询请求的目标键码key&为/a,即查询/a目录 层次下的键码与子目录情况,则操作步骤如下:
[0123] 第一步:在键值数据库中按照顺序搜索第一个大于或者等于数据查询请求目标键 码key dir目录下所有可能键码的下确界MinKeyi+1作为起始键码keystart,将起始键码key start 作为当前指针键码keynext ;由于目标键码keydir的字符串为/a,则目标键码keyi目录下所 有可能键码的下确界?为/a/a,第一个大于或者等于的起始键码 keystart 为 /a/b。
[0124] 第二步:从起始键码keystart开始从数据库顺序获取当前指针键码keyMxt。
[0125] 如图10所示,针对当前指针键码keynMt = /a/b的查询过程如下:①、由于/a目录 下所有可能键码的下确界MinKeyi+1为/a/a,根据步骤4. 1),顺序查找数据库中第一个大于 等于/a/a的起始键码keystart,查找指针指向/a/b ;②、根据步骤4. 2),从起始键码keystart =/a/b开始进行查询操作;③、根据步骤4. 2),由于/a/b以/a开头、满足 式两个条件同时成立,所以将当前指针键码keynMt对应的键值对</a/b,1>加入到查询结果 集合SMt。
[0126]如图11所示,针对keynext = /a/e的查询过程如下:①、结束上一个当前指针键码 keynext(/a/b)的查询过程,查找指针指向新的当前指针键码keyMxt(/ a/e);②、根据前述的 查询过程步骤4. 2),由于/a/e以/a开头、满足/a./形式两个条件同时成立,所以 将当前指针键码keyMxt对应键值对</a/e,2>加入到查询结果集合S#。
[0127]如图I2所示,针对keynra£t = /b/c的查询过程如下:①、结束上一个当前指针键码 keynext(/a/e)的查询过程,查找指针指向当前指针键码keyMxt(/b/c);②、根据前述的查询 过程步骤1 2),由于/b/c以/b形式开头,不符合/a形式开头,则需要跳转执行步骤4. 6), 式(7)所示字符串为/a/a,式(8)所示的字符串为/a/a/ a,由于/b/c>/a/a,那么从几久开 始顺序快速搜索出第一个大于/a/a/a的键码(即/ a/c/d)作为当前指针键码keyn6Xt ;③、 由于当前指针键码keynf;xt(/a/c/d)没有到达键值数据库的文件尾部,因此跳转执行步骤 4.2),然后由于当前指针键码1^711_(/^(1)以/^形式开头符合步骤4.4)的条件,判定当 前指针键码key nfSt能匹配式(4)所示字符串形式的n层结构,式(3)所示字符串/a/c为目 标键码key dir的下一级目录,将式(3)所示字符串形式的键码以及子目录标识[dir]生成 键值</a/c, [dir]>对加入到查询结果集合SMt。
[0128] 如图I3所示,针对当前指针键码keym;xt = /a/c/f/g的查询过程如下:①、承接前 面的操作,根据步骤4.3)查找指针从上一个当前指针键码keynext(/a/C/d)开始,顺序获取 下一个当前指针键码keyMxt 、根据步骤4. 5),式(6)所示字符串为/a/c/a,因此顺序查 找在本数据库中第一个大于/a/c/a的当前指针键码keynext (即/a/c/f/g);③、由于当前指 针键码keynfSt/a/c/f/g以/a形式开头符合步骤4. 4)的条件,即当前指针键码keynra£t以字 符串式(1)开头、同时能匹配式(4)所示字符串形式的η层结构,因此跳转步骤4. 4)。根 据步骤4. 4),判定式(3)所示字符串/a/c为目标键码keydir的下一级目录,将式⑶所示 字符串形式的键码以及子目录标识[dir]生成键值</a/c, [dir]>对加入到查询结果集合 Sret。
[0129] 如图14所示,针对keynMt = /b/d/e/f的查询过程如下:①、查找指针移动到当前 指针键码key_(/b/d/e/f),顺序获取key next :②、根据查找步骤4. 2)和4. 6),当前指针键 码key_t(/b/d/e/f)以/b形式开头,则不符合/a形式开头,式(7)所示字符串为/ a/a/a/ a,式(8)所不的字符串为/a/a/a/a/a,且/b/d/e/f>/a/a/a/a,那么从/b/c开始顺序快速 搜索出第一个大于/a/a/a/a/a的key,此时可知当前指针键码key next (/b/d/e/f)相邻的键 码到达数据库文件尾部;③、执行步骤4. 7),将查询结果集合返回给用户。
[0130] 以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施 例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本【技术领域】 的普通技术人员来说,在不脱离本发明原理前提下的若千改进和润饰,这些改进和润饰也 应视为本发明的保护范围。
【权利要求】
1. 一种基于键值数据库的层次化存储与查询方法,其特征在于实施步骤如下: 1) 预先在有序存储的键值数据库中构建层次化键码命名规则,所述层次化键码命名规 则将键码定义为以分隔符开头、且由分隔符和子串交替组合组成,分隔符的数量表示键码 的级数;确定两个合法的键码之间的大小比较方法,级数越大则键码越大,级数相同的键码 则根据字符串比较确定大小; 2) 接收键值数据库的访问请求,如果访问请求为数据存储请求,则跳转执行步骤3), 如果访问请求为数据查询请求,则跳转执行步骤4); 3) 根据所述两个合法的键码之间的大小比较方法来确定数据存储请求的键码排序位 置,然后按照排序位置将数据存储请求的数据插入键值数据库,返回执行步骤2); 4) 在键值数据库中按照从小到大的顺序查找第一个大于或等于数据查询请求的目标 键码Iceytto目录下所有可能键码的下确界作为起始键码keystart,从起始键码keystart开始, 按照从小到大的顺序将所有以目标键码keyto开头的键值对以及子目录作为数据查询请求 的结果返回。
2. 根据权利要求1所述的基于键值数据库的层次化存储与查询方法,其特征在于,所 述步骤1)中确定的两个合法的键码之间的大小比较方法如下: I. 1)接收由keyl和key2组成的两个合法的键码; 1. 2)比较keyl和key2之间的级数大小,如果keyl和key2的级数不同,贝U跳转执行步 骤1.3),否则跳转执行步骤1.4); 1. 3)判断keyl的级数大于key2的级数是否成立,如果成立则判定keyl比key2大,否 则判定key2比keyl大,返回比较结果并退出; 1. 4)初始化i为1 ; 1. 5)判断keyl的级数大于或等于i是否成立,如果成立则跳转执行步骤1. 6);否则判 定keyl等于key2,返回比较结果并退出; 1. 6)判断keyl和key2的前i级子串是否相等,如果相等则将i增加1,跳转执行步 骤1. 5);否则,判断keyl的第i级子串大于key2的第i级子串是否成立,如果成立则判定 keyl比key2大,否则判定key2比keyl大,返回比较结果并退出。
3. 根据权利要求2所述的基于键值数据库的层次化存储与查询方法,其特征在于,所 述步骤3)的详细步骤如下: 3. 1)接收用户的数据存储请求<newKey,newValue>,其中newKey表示数据存储请求的 键码,newValue表示数据存储请求的键值; 3. 2)判定所述键值数据库是否为空,如果键值数据库为空,则直接将所述数据存储请 求的键值对〈newKey,newValue〉存入键值数据库并退出;如果键值数据库非空,则跳转执 行下一步; 3.3)顺序查找第一个大于或等于所述数据存储请求的键码newKey的目标键码existed-key; 3. 4)判断所述数据存储请求的键码newKey是否等于目标键码existed_key,如果所述 数据存储请求的键码newKey等于目标键码existed_key,则判定所述数据存储请求的键码 newKey在键值数据库中是否已经存在,将目标键码existed_key对应的键值替换为数据存 储请求的键值对〈newKey,newValue〉中的新键值newValue并退出;否则,将所述数据存储 请求的键值对〈newKey,newValue〉插入保存在目标键码existed_key对应的键值对前。
4.根据权利要求1或2或3所述的基于键值数据库的层次化存储与查询方法,其特征 在于,所述步骤4)的详细步骤如下: 4. 1)初始化查询结果集合SMt ;在键值数据库中按照从小到大的顺序查找第一个大 于或等于数据查询请求的目标键码keyto目录下所有可能键码的下确界作为起始键码 keystart,将起始键码keystart作为当前指针键码keynrart ;所述数据查询请求的目标键码keyto 满足式(1)所示字符串形式,所述目标键码keyto目录下所有可能键码的下确界符合式(2) 所示字符串形式; /Siibkey1kev /subkeyl^.I...ISubkey1kr (1) 式⑴中,表示目标键码keyto的第i级子串,i表示目标键码keydi,W级数, /表不分隔符; Isubkeyley /SiibkeyleyI...ISitbkeVi^/a (2) 式(2)中,表示目标键码keyto的第i-1级子串;a表示构成键码子串的字符 串全集中排序规则最小的字符串;/表不分隔符; 4.2) 判断当前指针键码keynra£t以式(1)所示字符串开头、匹配式(3)所示字符串形 式的第i+1层目录两个条件是否同时成立,如果同时成立则将当前指针键码keynext对应 的键值对<keynra£t,Value〉加入到查询结果集合SMt,后移查找指针得到新的当前指针键码 keynext,跳转执行步骤4.2);否则跳转执行步骤4.3); Isubkey1ley /SiibkeyleyI...ISiibkey1iey /subkey'^ (3) 式⑶中,-L0,表示目标键码keydi,的第i级子串,?^表示当前指针键码keynext的第i+1级子串,/表不分隔符; 4.3) 判断当前指针键码keyn6Xt以字符串式(1)开头、同时匹配式(4)所示字符串形 式的n层结构两个条件是否仍然成立,如果成立则判定当前指针键码keynext位于目标键码 keyfc下的某一级子目录中,跳转执行步骤4. 4),否则跳转执行步骤4. 6); /subkeyhImbkeyl。/?」subkeyUsubkey:Yi…ISubkeyniA) "- " *" ^c>'next^ceJnext 式⑷中,表示目标键码keydi,的第i级子串,表示当前指针键码 keyMxt的第i+1级子串,表示当前指针键码keyMxt的第n级子串,/表示分隔符; 4.4) 判定式(3)所示字符串形式的子目录为目标键码keyto的下一级目录,将式(3) 所示字符串作为键码和子目录标识生成式(5)所示形式的键值对并加入到查询结果集合 C ? k^ret; < /Suhkcylcx !suhkcyl^ !...!suhkcy'^ !Siihkcy1!1,[dir] > (5 ) ? - ~ ' ^eJnext 式(5)所示形式的键值对中,键码为式(3)所示的字符串,键值[dir]表示子目录标 识,/表不分隔符; 4. 5)跳过当前指针键码keyn6Xt对应目录下的所有键码,从当前指针键码keyn6Xt开始, 按照从小到大的顺序查找第一个大于式(6)所示字符串形式的键码作为新的当前指针键 码keynext,判断新的当前指针键码keynext以式(1)所示字符串开头是否成立,如果成立则跳 转执行步骤4. 3),否则跳转执行步骤4. 6); Isuhkev^/Subkevley /..JSubkev1k /subkev1"1 /…INextisubkevn^)/a (6) "? "y * ^eJnexl * 人%?1 式(6)中,表示目标键码keyto的第i级子串,表示当前指针键码keynra£t的第i+1级子串,a表不构成键码子串的字符串全集中排序规则最小的字符串,/ 表示分隔符;表示对于当前指针键码keymxt中使用Next方法返回一个字 符串Subkeynext,所述Next方法具体是指针对当前指针键码keynext下所有子串可能构成的 字符串全集中的任意字符串s,如果该字符串s大于或等于目标键码keyto的第i级子串 ,则将大于目标键码keyto的第i级子串小于或等于该字符串s之间的 子串Subkeynext作为结果返回; 4.6)判断当前指针键码keyMxt大于如式(7)所示字符串形式的键码是否成立,如果成 立,则代表当前指针键码keynext所代表的如式(8)所示字符串形式的第n层键码中已无以 式(1)所示字符串开头的键值对数据,从当前指针键码keyMxt开始,按照从小到大的顺序查 找第一个大于如式(9)所示字符串形式的键码作为当前指针键码keyMxt;如果不成立,则按 照从小到大的顺序查找第一个等于或大于如式(7)所示字符串形式的键码作为当前指针 键码keynext; /Subkey1tey /SubkeyleyI./subkev'key /a!+1 /./a? (7) 式(7)中,表示目标键码keyto的第i级子串;ai+1表示第i+1级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串,an表不第n级字符串为构成键 码子串的字符串全集中排序规则最小的字符串的子串;/表不分隔符; Isubkey1key./SiibkeyleyI...ISitbkeynker/ (8) 式⑶中,表示目标键码keydi,的第n级子串,/表示分隔符; /Siibkey1ky /SiibkeyleyI...ISubkey1ksty /a,+1 /.., /a? /aB+1 (9) 式(9)中,表示目标键码keyto的第i级子串;ai+1表示第i+1级字符串为构 成键码子串的字符串全集中排序规则最小的字符串的子串,an表不第n级字符串为构成键 码子串的字符串全集中排序规则最小的字符串的子串;an+1表不第n+1级字符串为构成键 码子串的字符串全集中排序规则最小的字符串的子串;/表不分隔符; 4. 7)检测当前指针Key键码keynext是否已经到达键值数据库的文件尾部,如果尚未到 达文件尾部则跳转执行步骤4.3);否则跳转执行步骤4.8); 4.8)将查询结果集合SMt的内容作为数据查询请求的结果返回。
5. 根据权利要求4所述的基于键值数据库的层次化存储与查询方法,其特征在于:所 述步骤4. 1)和4. 5)中按照从小到大的顺序查找具体是指从小到大的顺序进行逐一顺序查 找、二分查找或者SkipList查找。
【文档编号】G06F17/30GK104268280SQ201410552673
【公开日】2015年1月7日 申请日期:2014年10月17日 优先权日:2014年10月17日
【发明者】李 根, 卢凯, 王双喜, 迟万庆, 周旭, 唐宏伟, 刘勇鹏, 冯华, 王小平, 蒋杰, 高颖慧, 王睿伯, 张英, 樊葆华 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1