CN112269786B - 一种内存数据库kv存储引擎索引的创建方法 - Google Patents
一种内存数据库kv存储引擎索引的创建方法 Download PDFInfo
- Publication number
- CN112269786B CN112269786B CN202011201566.2A CN202011201566A CN112269786B CN 112269786 B CN112269786 B CN 112269786B CN 202011201566 A CN202011201566 A CN 202011201566A CN 112269786 B CN112269786 B CN 112269786B
- Authority
- CN
- China
- Prior art keywords
- node
- variable
- curnode
- key value
- key
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
- G06F16/2343—Locking methods, e.g. distributed locking or locking implementation details
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
- G06F16/2471—Distributed queries
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Software Systems (AREA)
- Computing Systems (AREA)
- Fuzzy Systems (AREA)
- Mathematical Physics (AREA)
- Probability & Statistics with Applications (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明特别涉及一种内存数据库KV存储引擎索引的创建方法。该内存数据库KV存储引擎索引的创建方法,首先在CockroachDB数据库插入ART树,并在ART树的叶子节点增加双向链表,然后基于ART树获取大于某key的节点,并计算出待插入key值对应的插入位置,将待插入key值对应的节点插入到双向链表中,最后遍历Key值范围即可。该内存数据库KV存储引擎索引的创建方法,通过在ART树的叶子节点增加双向链表,实现了key值范围遍历的快速响应以及对CockroachDB的排序规则的支持;通过ART树使用乐观锁机制、双向链表使用CAS无锁算法的方式保证了插入/查询操作时的高性能以及数据的一致性。
Description
技术领域
本发明涉及数据库技术领域,特别涉及一种内存数据库KV存储引擎索引的创建方法。
背景技术
近年来,随着动态随机存储器(DRAM)容量的上升和单位价格的下降,使大量数据在内存中的存储和处理成为可能,Redis、Memcached等内存数据库管理软件逐渐成熟,应用范围越来越广。
内存数据库(MMDB:Main Memory Database,也叫主存数据库),就是将数据全部或者大部分放在内存中进行操作的数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU周期和内存。由于内存数据库与传统的磁盘数据库在设计和架构上都大不相同,所以传统的数据库索引不适用于内存数据库。
CockroachDB是一款开源的分布式数据库,具有NoSQL对海量数据的存储管理能力,又保持了传统数据库支持的ACID和SQL等,还支持跨地域、去中心、高并发、多副本强一致和高可用等特性。支持OLTP场景,同时支持轻量级OLAP场景。
CockroachDB使用rocksdb作为KV存储引擎,rocksdb不是内存存储引擎。如果将CockroachDB改造成内存数据库,需要研发替代rocksdb的KV内存存储引擎。ART树在目前流行的几种内存数据库索引中,具备最好的性能。因此,使用基于ART树构建的KV 内存存储引擎会具备很好的性能优势。
存储引擎主要用作存储数据、为存储的数据建立索引、更新、查询数据等技术的实现方法。KV存储引擎是专门用于存储KV类型表数据的一种存储机制。
KV内存存储引擎是指使用内存作为存储数据介质的KV存储引擎。
ART(Adaptive Radix Tree,自适应基数/前缀树),是以二进制位串为关键字的trie 树,是一种多叉树形结构,同时又类似多层索引表,每个中间节点包含指向多个子节点的指针数组,叶子节点包含指向实际的对象的指针。中间节点根据长度的不同分成若干种不同类型,随着数据的变化而自行调整。
ART树节点所在层数:指从根节点开始每往下一移一层计数加一。根节点为第0层,根节点的子节点们为第1层。
ART树使用字节序作为key的排序规则,而CockroachDB使用自定义的key值排序规则,因此不能直接使用ART树的排序作为输出。并且在CockroachDB中大量使用scan 函数扫描特定范围内的所有key值,并通过迭代器循环获取,ART树的深度遍历不能直接提供对这种操作的支撑。具体来说,如果ART树叶子节点的迭代器使用树的深度遍历算法,需要从根节点到该叶子节点的路径信息。由于ART树不断更新,内部节点可能会扩展前缀成两层内部节点,如果迭代器一直保存着路径的每个内部节点,会导致迭代产生的下一个叶子节点不正确。因此,迭代器每次next时都需要重新计算根节点到叶子节点的路径,但这样产生大量的计算,性能较低。
同时,在高并发的场景下,如何保证并发插入/查询数据一致性和处理性能,都是在创建KV存储引擎索引时亟待解决的难题。
基于上述情况,本发明提出了一种内存数据库KV存储引擎索引的创建方法。
发明内容
本发明为了弥补现有技术的缺陷,提供了一种简单高效的内存数据库KV存储引擎索引的创建方法。
本发明是通过如下技术方案实现的:
一种内存数据库KV存储引擎索引的创建方法,其特征在于:首先在CockroachDB数据库插入ART树,并在ART树的叶子节点增加双向链表,然后基于ART树获取大于某key的节点,并计算出待插入key值对应的插入位置,将待插入key值对应的节点插入到双向链表中,最后遍历Key值范围即可。
所述双向链表按照CockroachDB定义的key排序规则进行排序,叶子节点的先后顺序可能会与ART树的不一致。双向链表的前后顺序与ART树定义的顺序不一致,其原因是CockroachDB使用自己定义的key排序规则,而不是基于字节序的排序规则。
用curnode变量表示当前处理节点,用leaf表示记录封装到新建的叶子节点,所述ART树插入流程,包括以下步骤:
第一步,将curnode变量设为ART树根节点;
第二步,将curnode变量指向节点加锁,判断curnode变量指向节点中是否存在key值的相应子节点,即curnode变量指向节点所在层数作为key值的byte数组下缀,得到的byte值在该节点是否有指针;
第三步,如果curnode变量指向节点所在层数与key值byte数组长度一致,先将curnode 变量指向节点加锁,将leaf挂载到curnode变量指向节点相应的子节点指针位置,最后将 curnode变量指向节点解锁,跳转到第六步;
第四步,如果curnode变量指向节点存在相应子节点,将curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点对应的子节点,返回第二步;
第五步,如果curnode变量指向节点不存在相应子节点,先将curnode变量指向节点加锁,创建内部节点inode,并将inode节点挂载到curnode变量指向节点相应子节点指针位置,最后将curnode变量指向节点解锁的同时将curnode变量指向节点置为inode节点,返回第二步;
第六步,结束并返回。
所述ART树插入是在ART树上创建该记录对应的叶子节点,且ART树使用乐观锁机制,每次curnode变量指向节点解锁失败都返回第一步开始重新执行。
用curnode变量表示当前处理节点,ART树获取大于某key的节点算法,包括以下步骤:
第一步,将curnode变量指向节点设为ART树根节点;
第二步,将curnode变量指向节点以及curnode变量指向节点所在层数作为key值的 byte数组下缀得到的byte值存入栈中,并将curnode变量指向节点加锁;
第三步,如果curnode变量指向节点为叶子节点,比较叶子节点key值与查询key值的大小,如果叶子节点key值大于查询key值,则解锁curnode变量指向节点并返回该叶子节点,流程结束;否则,跳转到第六步;
第四步,如果curnode变量指向节点所在层数与key值byte数组长度一致,则跳转到第六步;
第五步,判断curnode变量指向节点中是否存在key值的相应前缀,即curnode变量指向节点所在层数作为key值的byte数组下缀,得到的byte值;
如果curnode变量指向节点存在相应前缀,将curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点对应的子节点,返回第二步;
如果curnode变量指向节点不存在相应前缀,将curnode变量指向节点以及curnode 变量指向节点所在层数作为key值的byte数组下缀得到的byte值存入栈中,解锁curnode 变量指向节点;
第六步,从栈中弹出curnode变量指向节点和byte值,并将curnode变量指向节点加锁;
第七步,在curnode变量指向节点中查找大于该byte值的子节点,如果没有找到,则 curnode变量指向节点解锁并返回第八步;如果找到,则curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点的该子节点;
第八步,判断curnode变量指向节点是否为叶子节点,若是,则返回该叶子节点,流程结束;若不是,则返回第七步。
所述双向链表插入前要先基于ART树计算出待插入key值对应的插入位置,即找到待插入key值在链表中的后节点;
将新插入的key值称为kc,根据ART树获取大于某key的节点算法获得kc对应的后节点的key设为kn,kc真正的后节点即为待插入key值的插入位置:
如果业务key不一致,则kn就是kc真正的后节点;
如果业务key一致,并且kc的时间戳为空,则kn是kc真正的后节点;
如果业务key一致,并且kc的时间戳不为空,则kn的时间戳不可能为空(字节序排序规则),那么kn实际上要小于kc;通过双向链表获取kn的后节点key值设为knn,knn 是kc真正的后节点。
将待插入的节点称为kc,kc的后节点称为kn,基于CAS无锁算法将待插入key值对应的节点kc插入到双向链表中,包括以下步骤:
第一步:通过双向链表得到kn的前节点,赋值变量为kp;
第二步:保存kn的前节点指针设为knp,kp的后节点指针设为kpn;
第三步:使用cockroachDB的排序规则分别计算并比较kn与kc的大小以及kp与kc的大小;
如果kn大于kc并且kp小于kc,kc的前节点指针指向kp,kc的后节点指针指向kn,则调用函数compare_and_swap(kn的前节点指针,knp,kc),比对kn的前节点指针与 knp,如果相同,则将kn赋值为kc,如果返回成功则跳转到第四步,如果失败则跳转到第二步;
如果kn大于kc并且kp大于kc,则kn等于kp,跳转到第一步;
如果kn小于kc,则kn等于kn的后节点,跳占到第一步;
第四步:调用函数compare_and_swap(kp的后节点指针,kpn,kc),比对和替换函数原子操作函数,先比对kn的后节点指针与knp是否相同,如果相同,则将kp赋值为 kc,结束返回。
将key值范围的最小值key设为minkey,最大值设为maxkey,Key值范围遍历,包括以下步骤:
第一步,基于ART树查询当前minkey是否存在,如果存在则获取到ART树的叶子节点作为遍历的起始节点;如果ART树不存在minkey节点,使用ART树获取大于某key 的节点的算法获得minkey的后节点作为遍历的起始节点;
第二步,通过起始节点,使用双向链表的后节点指针,快速获取到CockroachDB自定义排序后的后一个节点,再通过节点中key值与maxkey值比较,如果大于或等于则停止遍历。
本发明的有益效果是:该内存数据库KV存储引擎索引的创建方法,通过在ART树的叶子节点增加双向链表,实现了key值范围遍历的快速响应以及对CockroachDB的排序规则的支持;通过ART树使用乐观锁机制、双向链表使用CAS无锁算法的方式保证了插入/查询操作时的高性能以及数据的一致性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
附图1为本发明ART树的叶子节点上增加双向链表后的数据结构示意图。
附图2为本发明CockroachDB数据库定义的key值排序规则示意图。
具体实施方式
为了使本技术领域的人员更好的理解本发明中的技术方案,下面将结合本发明实施例,对本发明实施例中的技术方案进行清楚,完整的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
该内存数据库KV存储引擎索引的创建方法,首先在CockroachDB数据库插入ART树,并在ART树的叶子节点增加双向链表,然后基于ART树获取大于某key的节点,并计算出待插入key值对应的插入位置,将待插入key值对应的节点插入到双向链表中,最后遍历Key值范围即可。
所述双向链表按照CockroachDB定义的key排序规则进行排序,叶子节点的先后顺序可能会与ART树的不一致。双向链表的前后顺序与ART树定义的顺序不一致,其原因是CockroachDB使用自己定义的key排序规则,而不是基于字节序的排序规则。
CockroachDB数据库以"业务Key+时间戳"作为存储Key,其编码规则如下:
cockroachDB自定义了Key排序规则:
1).首先拆分rocksdb key为业务key和时间戳;
2).按字母从小到大的顺序,比较业务Key;
3).如果业务Key相同,则按照时间戳从从大到小的顺序比较。并且如果时间戳=0,则排在最前。
用curnode变量表示当前处理节点,用leaf表示记录封装到新建的叶子节点,所述ART树插入流程,包括以下步骤:
第一步,将curnode变量设为ART树根节点;
第二步,将curnode变量指向节点加锁,判断curnode变量指向节点中是否存在key值的相应子节点,即curnode变量指向节点所在层数作为key值的byte数组下缀,得到的byte值在该节点是否有指针;
第三步,如果curnode变量指向节点所在层数与key值byte数组长度一致,先将curnode 变量指向节点加锁,将leaf挂载到curnode变量指向节点相应的子节点指针位置,最后将curnode变量指向节点解锁,跳转到第六步;
第四步,如果curnode变量指向节点存在相应子节点,将curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点对应的子节点,返回第二步;
第五步,如果curnode变量指向节点不存在相应子节点,先将curnode变量指向节点加锁,创建内部节点inode,并将inode节点挂载到curnode变量指向节点相应子节点指针位置,最后将curnode变量指向节点解锁的同时将curnode变量指向节点置为inode节点,返回第二步;
第六步,结束并返回。
所述ART树插入是在ART树上创建该记录对应的叶子节点,且ART树使用乐观锁机制,每次curnode变量指向节点解锁失败都返回第一步开始重新执行。
乐观锁机制包含:一个锁和一个版本计数。每个ART树的节点都有一个乐观锁。实现时将锁和锁的版本信息放入ART节点头部一个64bit的空间内。
写操作:对于写操作来说,乐观锁与普通锁一样,lock时通过互斥竞争获取锁,unlock 时释放锁。与普通锁不同的是在unlock时会将这个锁的版本计数加一。
读操作:没有加锁和解锁操作。Readlock时获取当期节点锁的版本计数值,readunlock 时传入这个锁的版本计数值,并判断锁是否依然可用并且锁版本是否发生变化。如果锁不可用或锁版本有变化,整个查询过程会被重新执行,从readlock地方开始,一直再到readunlock的判断。
用curnode变量表示当前处理节点,ART树获取大于某key的节点算法,包括以下步骤:
第一步,将curnode变量设为ART树根节点;
第二步,将curnode变量指向节点以及curnode变量指向节点所在层数作为key值的 byte数组下缀得到的byte值存入栈中,并将curnode变量指向节点加锁;
第三步,如果curnode变量指向节点为叶子节点,比较叶子节点key值与查询key值的大小,如果叶子节点key值大于查询key值,则解锁curnode变量指向节点并返回该叶子节点,流程结束;否则,跳转到第六步;
第四步,如果curnode变量指向节点所在层数与key值byte数组长度一致,则跳转到第六步;
第五步,判断curnode变量指向节点中是否存在key值的相应前缀,即curnode变量指向节点所在层数作为key值的byte数组下缀,得到的byte值;
如果curnode变量指向节点存在相应前缀,将curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点对应的子节点,返回第二步;
如果curnode变量指向节点不存在相应前缀,将curnode变量指向节点以及curnode 变量指向节点所在层数作为key值的byte数组下缀得到的byte值存入栈中,解锁curnode 变量指向节点;
第六步,从栈中弹出curnode变量指向节点和byte值,并将curnode变量指向节点加锁;
第七步,在curnode变量指向节点中查找大于该byte值的子节点,如果没有找到,则 curnode变量指向节点解锁并返回第八步;如果找到,则curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点的该子节点;
第八步,判断curnode变量指向节点是否为叶子节点,若是,则返回该叶子节点,流程结束;若不是,则返回第七步。
所述双向链表插入前要先基于ART树计算出待插入key值对应的插入位置,即找到待插入key值在链表中的后节点;
将新插入的key值称为kc,根据ART树获取大于某key的节点算法获得kc对应的后节点的key设为kn,kc真正的后节点即为待插入key值的插入位置:
如果业务key不一致,则kn就是kc真正的后节点;
如果业务key一致,并且kc的时间戳为空,则kn是kc真正的后节点;
如果业务key一致,并且kc的时间戳不为空,则kn的时间戳不可能为空(字节序排序规则),那么kn实际上要小于kc;通过双向链表获取kn的后节点key值设为knn,knn 是kc真正的后节点。
将待插入的节点称为kc,kc的后节点称为kn,基于CAS无锁算法将待插入key值对应的节点kc插入到双向链表中,包括以下步骤:
第一步:通过双向链表得到kn的前节点,赋值变量为kp;
第二步:保存kn的前节点指针设为knp,kp的后节点指针设为kpn;
第三步:使用cockroachDB的排序规则分别计算并比较kn与kc的大小以及kp与kc的大小;
如果kn大于kc并且kp小于kc,kc的前节点指针指向kp,kc的后节点指针指向kn,则调用函数compare_and_swap(kn的前节点指针,knp,kc),比对kn的前节点指针与 knp,如果相同,则将kn赋值为kc,如果返回成功则跳转到第四步,如果失败则跳转到第二步;
如果kn大于kc并且kp大于kc,则kn等于kp,跳转到第一步;
如果kn小于kc,则kn等于kn的后节点,跳占到第一步;
第四步:调用函数compare_and_swap(kp的后节点指针,kpn,kc),比对和替换函数原子操作函数,先比对kn的后节点指针与knp是否相同,如果相同,则将kp赋值为 kc,结束返回。
将key值范围的最小值key设为minkey,最大值设为maxkey,Key值范围遍历,包括以下步骤:
第一步,基于ART树查询当前minkey是否存在,如果存在则获取到ART树的叶子节点作为遍历的起始节点;如果ART树不存在minkey节点,使用ART树获取大于某key 的节点的算法获得minkey的后节点作为遍历的起始节点;
第二步,通过起始节点,使用双向链表的后节点指针,快速获取到CockroachDB自定义排序后的后一个节点,再通过节点中key值与maxkey值比较,如果大于或等于则停止遍历。
以上所述的实施例,只是本发明具体实施方式的一种,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。
Claims (7)
1.一种内存数据库KV存储引擎索引的创建方法,其特征在于:首先在CockroachDB数据库插入ART树,并在ART树的叶子节点增加双向链表,然后基于ART树获取大于某key的节点,并计算出待插入key值对应的插入位置,将待插入key值对应的节点插入到双向链表中,最后遍历Key值范围即可;
用curnode变量表示当前处理节点,用leaf表示记录封装到新建的叶子节点,所述ART树插入流程,包括以下步骤:
第一步,将curnode变量设为ART树根节点;
第二步,将curnode变量指向节点加锁,判断curnode变量指向节点中是否存在key值的相应子节点,即curnode变量指向节点所在层数作为key值的byte数组下缀,得到的byte值在该节点是否有指针;
第三步,如果curnode变量指向节点所在层数与key值byte数组长度一致,先将curnode变量指向节点加锁,将leaf挂载到curnode变量指向节点相应的子节点指针位置,最后将curnode变量指向节点解锁,跳转到第六步;
第四步,如果curnode变量指向节点存在相应子节点,将curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点对应的子节点,返回第二步;
第五步,如果curnode变量指向节点不存在相应子节点,先将curnode变量指向节点加锁,创建内部节点inode,并将inode节点挂载到curnode变量指向节点相应子节点指针位置,最后将curnode变量指向节点解锁的同时将curnode变量指向节点置为inode节点,返回第二步;
第六步,结束并返回。
2.根据权利要求1所述的内存数据库KV存储引擎索引的创建方法,其特征在于:所述双向链表按照CockroachDB定义的key排序规则进行排序,而不是基于字节序的排序规则。
3.根据权利要求1所述的内存数据库KV存储引擎索引的创建方法,其特征在于:所述ART树插入是在ART树上创建该记录对应的叶子节点,且ART树使用乐观锁机制,每次curnode变量指向节点解锁失败都返回第一步开始重新执行。
4.根据权利要求3所述的内存数据库KV存储引擎索引的创建方法,其特征在于:用curnode变量表示当前处理节点,ART树获取大于某key的节点算法,包括以下步骤:
第一步,将curnode变量设为ART树根节点;
第二步,将curnode变量指向节点以及curnode变量指向节点所在层数作为key值的byte数组下缀得到的byte值存入栈中,并将curnode变量指向节点加锁;
第三步,如果curnode变量指向节点为叶子节点,比较叶子节点key值与查询key值的大小,如果叶子节点key值大于查询key值,则解锁curnode变量指向节点并返回该叶子节点,流程结束;否则,跳转到第六步;
第四步,如果curnode变量指向节点所在层数与key值byte数组长度一致,则跳转到第六步;
第五步,判断curnode变量指向节点中是否存在key值的相应前缀,即curnode变量指向节点所在层数作为key值的byte数组下缀,得到的byte值;
如果curnode变量指向节点存在相应前缀,将curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点对应的子节点,返回第二步;
如果curnode变量指向节点不存在相应前缀,将curnode变量指向节点以及curnode变量指向节点所在层数作为key值的byte数组下缀得到的byte值存入栈中,解锁curnode变量指向节点;
第六步,从栈中弹出curnode变量指向节点和byte值,并将curnode变量指向节点加锁;
第七步,在curnode变量指向节点中查找大于该byte值的子节点,如果没有找到,则curnode变量指向节点解锁并返回第八步;如果找到,则curnode变量指向节点解锁的同时将curnode变量设为curnode变量指向节点的该子节点;
第八步,判断curnode变量指向节点是否为叶子节点,若是,则返回该叶子节点,流程结束;若不是,则返回第七步。
5.根据权利要求4所述的内存数据库KV存储引擎索引的创建方法,其特征在于:所述双向链表插入前要先基于ART树计算出待插入key值对应的插入位置,即找到待插入key值在链表中的后节点;
将新插入的key值称为kc,根据ART树获取大于某key的节点算法获得kc对应的后节点的key设为kn,kc真正的后节点即为待插入key值的插入位置:
如果业务key不一致,则kn就是kc真正的后节点;
如果业务key一致,并且kc的时间戳为空,则kn是kc真正的后节点;
如果业务key一致,并且kc的时间戳不为空,则kn的时间戳不可能为空,那么kn实际上要小于kc;通过双向链表获取kn的后节点key值设为knn,knn是kc真正的后节点。
6.根据权利要求5所述的内存数据库KV存储引擎索引的创建方法,其特征在于:将待插入的节点称为kc,kc的后节点称为kn,基于CAS无锁算法将待插入key值对应的节点kc插入到双向链表中,包括以下步骤:
第一步:通过双向链表得到kn的前节点,赋值变量为kp;
第二步:保存kn的前节点指针设为knp,kp的后节点指针设为kpn;
第三步:使用cockroachDB的排序规则分别计算并比较kn与kc的大小以及kp与kc的大小;
如果kn大于kc并且kp小于kc,kc的前节点指针指向kp,kc的后节点指针指向kn,则调用函数compare_and_swap(kn的前节点指针,knp,kc),比对kn的前节点指针与knp,如果相同,则将kn赋值为kc,如果返回成功则跳转到第四步,如果失败则跳转到第二步;
如果kn大于kc并且kp大于kc,则kn等于kp,跳转到第一步;
如果kn小于kc,则kn等于kn的后节点,跳占到第一步;
第四步:调用函数compare_and_swap(kp的后节点指针,kpn,kc),比对和替换函数原子操作函数,先比对kn的后节点指针与knp是否相同,如果相同,则将kp赋值为kc,结束返回。
7.根据权利要求6所述的内存数据库KV存储引擎索引的创建方法,其特征在于:将key值范围的最小值key设为minkey,最大值设为maxkey,Key值范围遍历,包括以下步骤:
第一步,基于ART树查询当前minkey是否存在,如果存在则获取到ART树的叶子节点作为遍历的起始节点;如果ART树不存在minkey节点,使用ART树获取大于某key的节点的算法获得minkey的后节点作为遍历的起始节点;
第二步,通过起始节点,使用双向链表的后节点指针,快速获取到CockroachDB自定义排序后的后一个节点,再通过节点中key值与maxkey值比较,如果大于或等于则停止遍历。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011201566.2A CN112269786B (zh) | 2020-11-02 | 2020-11-02 | 一种内存数据库kv存储引擎索引的创建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011201566.2A CN112269786B (zh) | 2020-11-02 | 2020-11-02 | 一种内存数据库kv存储引擎索引的创建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112269786A CN112269786A (zh) | 2021-01-26 |
CN112269786B true CN112269786B (zh) | 2023-02-03 |
Family
ID=74344550
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011201566.2A Active CN112269786B (zh) | 2020-11-02 | 2020-11-02 | 一种内存数据库kv存储引擎索引的创建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112269786B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113094449B (zh) * | 2021-04-09 | 2023-04-18 | 天津大学 | 基于分布式键值库的大规模知识图谱存储方法 |
CN113626433B (zh) * | 2021-08-03 | 2024-01-19 | 上海沄熹科技有限公司 | 一种基于两层art树的数据存储方法 |
CN113626432B (zh) * | 2021-08-03 | 2023-10-13 | 上海沄熹科技有限公司 | 一种支持任意Key值的自适应基数树的改进方法 |
CN113688130B (zh) * | 2021-08-05 | 2023-10-13 | 上海沄熹科技有限公司 | 一种内存数据库存储引擎管理方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104424222B (zh) * | 2013-08-23 | 2019-09-13 | 华为技术有限公司 | 数据库索引方法及装置 |
CN110928882B (zh) * | 2019-11-27 | 2023-08-25 | 上海金仕达软件科技股份有限公司 | 一种基于改进红黑树的内存数据库索引方法及系统 |
CN111339382B (zh) * | 2020-03-11 | 2023-09-22 | 腾讯科技(深圳)有限公司 | 字符串数据检索方法、装置、计算机设备及存储介质 |
-
2020
- 2020-11-02 CN CN202011201566.2A patent/CN112269786B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN112269786A (zh) | 2021-01-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112269786B (zh) | 一种内存数据库kv存储引擎索引的创建方法 | |
CN110990404B (zh) | 一种索引数据的处理方法、装置及电子设备 | |
JP2670383B2 (ja) | 部分キー分岐機能を備えたプレフィックス探索ツリー | |
EP1234258B1 (en) | System for managing rdbm fragmentations | |
WO2009089505A1 (en) | Spatial sieve tree | |
CN113961514B (zh) | 数据查询方法及装置 | |
CN111400306B (zh) | 基于rdma与非易失性内存的基数树访问系统 | |
CN112000847B (zh) | 基于gpu并行的自适应基数树动态索引方法 | |
CN111190904A (zh) | 一种图-关系数据库混合存储的方法和装置 | |
JP2003501749A (ja) | トリー構造に基づく機能的メモリ | |
CN114706848A (zh) | 区块链数据存储、更新、读取方法及装置、电子设备 | |
Ghanem et al. | Bulk operations for space-partitioning trees | |
CN111625543B (zh) | 一种基于HBase表实现全局单调递增的序列的方法 | |
Nicolae | Scalable Multi-Versioning Ordered Key-Value Stores with Persistent Memory Support | |
CN113468080A (zh) | 一种全闪元数据的缓存方法、系统及相关装置 | |
Petrov | Algorithms behind modern storage systems | |
US20110066638A1 (en) | Bit strings search apparatus, search method, and program | |
CN111274456B (zh) | 基于nvm主存的数据索引方法及数据处理系统 | |
CN114416741A (zh) | 基于多级索引的kv数据写入读取方法、装置及存储介质 | |
CN114398373A (zh) | 应用于数据库存储的文件数据存储读取方法及装置 | |
Petrov | Algorithms behind modern storage systems: Different uses for read-optimized b-trees and write-optimized lsm-trees | |
CN117131012B (zh) | 一种可持久化和可扩展的轻量级多版本有序键值存储系统 | |
IL157385A (en) | Organising data in a database | |
Huang et al. | A Primer on Database Indexing | |
CN110334251B (zh) | 一种有效解决rehash冲突的元素序列生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |