CN105095261A - 数据插入方法和装置 - Google Patents
数据插入方法和装置 Download PDFInfo
- Publication number
- CN105095261A CN105095261A CN201410193423.XA CN201410193423A CN105095261A CN 105095261 A CN105095261 A CN 105095261A CN 201410193423 A CN201410193423 A CN 201410193423A CN 105095261 A CN105095261 A CN 105095261A
- Authority
- CN
- China
- Prior art keywords
- node
- data
- chained list
- pointer
- establishment
- 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.)
- Pending
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据插入方法和装置,该方法包括:分配内存空间,以创建存储待插入数据的节点;将待插入数据写入创建的节点;修改链表中相应的指针,以使所述创建的节点插入到所述链表中。采用本发明的技术方案,在写入新数据时,分配新的内存空间进行写更新,当数据的写入完成时再修改指针,可以支持在多线程并发的情况下,一个线程进行写操作,多个线程进行读操作,且在线程读、写的过程中,都不需要对数据加锁。
Description
技术领域
本发明涉及互联网技术领域,具体涉及一种数据插入方法和装置。
背景技术
在开发线上服务时,高并发一直是衡量系统质量一个最重要的指标之一,也是开发过程中的技术难点。在服务端程序开发过程中,有四个方面对系统的性能影响最大,它们分别是:数据拷贝(DataCopies)、上下文切换(ContextSwitches)、内存分配(Memoryallocation)以及锁竞争(Lockcontention)。
数据拷贝,冗余的数据拷贝(复制)会降低数据传输的性能,进而影响系统性能,一般可以通过一些编程技术来减少或避免数据拷贝,如,多使用指针和引用计数等。
上下文切换,在系统运行过程中频繁进行进程或线程切换,将会导致系统性能急剧下降。一般来说,线程的切换代价要小于进程,这主要是因为进程可以拥有资源,是系统中拥有资源的一个基本单位,而线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问其隶属的进程的资源,即一个进程的代码段、数据段及所拥有的系统资源,如,已打开的文件、I/O设备等,可以提供该进程中的所有线程锁共享。
内存分配,在高并发系统中,如果存在大量的内存申请和释放操作,会导致性能的损失,并且会使系统中出现大量的内存碎片,降低内存的利用率。现有技术中的一种解决方案是采用内存池技术,预分配内存,释放的内存由内存池统一回收和利用,而并不直接交给操作系统。
锁竞争,高效率的锁非常难规划,一方面,锁的简单化(粗粒度锁)会导致并行处理的串行化,降低并发的效率和系统可伸缩性;另一方面,锁的复杂化(细粒度锁)在空间占用上和操作时的时间消耗上都可能产生对系统性能的侵蚀。
综上所述,需要针对上述存在的问题进行改进,提出一种实现高并发读写的数据插入或更新方案。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的数据插入方法和相应的装置。
根据本发明的一个方面,提供了一种数据插入方法,包括:分配内存空间,以创建存储待插入数据的节点;将待插入数据写入创建的节点;修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
其中,修改链表中相应的指针,包括:确定所述创建的节点的插入位置;将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点;将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。
其中,还包括:根据待插入数据的键的哈希值确定所述待插入数据对应的链表;遍历所述对应的链表,判断所述链表中是否存在与所述待插入数据键相等的节点;如果所述链表中存在与所述待插入数据键相等的节点,则终止当前操作并返回。
根据本发明的另一个方面,提供了一种数据更新方法,包括:分配内存空间,以创建存储更新数据的节点;将更新数据写入创建的节点;修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
其中,修改链表中相应的指针,包括:将指向原始数据所在节点指针修改为指向所述创建的节点;将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点;删除原始数据所在节点的指针。
其中,还包括:确定所述原始数据所在的节点。
其中,确定所述原始数据所在的节点,包括:根据原始数据的键的哈希值确定所述原始数据所在的链表;在所述原始数据所在的链表中,根据所述原始数据的键确定所述原始数据所在的节点。
其中,还包括:回收原始数据所在节点,并将所述节点插入空闲链表中,以便重新进行分配。
根据本发明的一个方面,提供了一种数据插入装置,包括:分配模块,用于分配内存空间,以创建存储待插入数据的节点;写入模块,用于将待插入数据写入创建的节点;修改模块,用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
其中,所述修改模块,包括:确定子模块,用于确定所述创建的节点的插入位置;设置子模块,用于将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点;修改子模块,用于将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。
其中,还包括:确定模块,用于根据待插入数据的键的哈希值确定所述待插入数据对应的链表;判断模块,用于遍历所述对应的链表,判断所述链表中是否存在与所述待插入数据键相等的节点;返回模块,用于如果所述链表中存在与所述待插入数据键相等的节点,则终止当前操作并返回。
根据本发明的另一个方面,提供了一种数据更新装置,包括:分配模块,用于分配内存空间,以创建存储更新数据的节点;写入模块,用于将更新数据写入创建的节点;修改模块,用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
其中,所述修改模块,包括:修改子模块,用于将指向所述原始数据所在节点指针修改为指向所述创建的节点;设置子模块,用于将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点;删除子模块,用于删除原始数据所在节点的指针。
其中,所述修改模块,还包括:确定子模块,用于确定所述原始数据所在的节点。
其中,所述确定子模块,包括:第一确定子模块,用于根据原始数据的键的哈希值确定所述原始数据所在的链表;第二确定子模块,用于在所述原始数据所在的链表中,根据所述原始数据的键确定所述原始数据所在的节点。
其中,还包括:回收模块,用于回收原始数据所在节点,并将所述节点插入空闲链表中,以便重新进行分配。
根据本发明的技术方案,在写入新数据时,分配新的内存空间进行写更新,当数据的写入完成时再修改指针,可以支持在多线程并发的情况下,一个线程进行写操作,多个线程进行读操作,且在线程读、写的过程中,都不需要对数据加锁。并且,对链表中删除的节点空间进行回收加入空闲链表,当需要分配新的内存空间时,可以直接利用回收的空闲内存。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明一个实施例的数据插入方法的流程图;
图2示出了根据本发明一个实施例的循环双向链表的结构示意图;
图3示出了根据本发明一个实施例的数据插入方法中修改链表中相应的指针的步骤的流程图;
图4示出了根据本发明的另一个实施例的数据插入方法的流程图;
图5a示出了根据本发明一个实施例的Hashmap的存储结构示意图;
图5b示出了根据本发明一个实施例的Hashmap存储结构中每个节点的结构示意图;
图6示出了根据本发明另一个实施例的数据插入方法中修改链表中相应的指针的流程图;
图7示出了根据本发明一个实施例的数据更新方法的流程图;
图8示出了根据本发明一个实施例的数据更新方法中修改链表中相应的指针的步骤的流程图;
图9示出了根据本发明的另一个实施例的数据更新方法的流程图;
图10示出了根据本发明另一个实施例的数据更新方法中修改链表中相应的指针的流程图;
图11示出了根据本发明的一个实施例的确定所述原始数据所在的节点的流程图;
图12示出了根据本发明一实施例的数据插入装置的结构框图;以及
图13示出了根据本发明一实施例的数据更新装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
Java提供的Concurrent编程框架是目前使用最广泛的并发框架,该框架包含了一组并发处理的数据结构,提供了几个设计用于多线程上下文中的Collection(如,线性表、链表、哈希表)实现,如,ConcurrentHashMap(并发散列映射)、CopyOnWriteArrayList(写时复制数组列表)等。
ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持得尽量地小,不用对整个ConcurrentHashMap加锁。ConcurrentHashMap通过对map表(映射表)进行分段,每个段分别加锁,不同段之间可以并发进行读写。相对于传统的在多线程环境中使用hashmap(哈希映射)对整个map表加锁而言,这种设计方案能够大大降低锁的粒度,因此在高并发环境中性能有很大提升。
CopyOnWriteArrayList在进行数据修改时,不会对数据进行锁定,每次修改时,先拷贝整个数组,然后修改其中的一些元素,完成上述操作后,替换整个数组的指针。对CopyOnWriteArrayList进行读取时,也不会对数据进行锁定,直接返回需要查询的数据,如果需要返回整个数组,那么会将整个数组拷贝一份,再返回,保证内部数组array在任何情况下都是只读的。因为没有锁的干预,所以CopyOnWriteArrayLIst在少量修改,频繁读取的场景下,有很好的并发性能。
以上技术方案有如下缺点:
1)ConcurrentHashMap采用分段加锁,由于锁是要占用一定资源的,因此分段的数量是有限的,事实上,在Java中这个数量仅为16,对于搜索引擎每秒需要响应数以万计的搜索请求来说,这在性能上显然是有所不足的,且当系统需要获得ConcurrentHashMap的全局信息,如获取map表的大小(size)时,需要对每一段都加锁,然后累计相加各个分段的大小,最后得到全局大小,这种操作会造成系统性能急剧下降。
2)CopyOnWriteArrayList在只修改一个节点的情况下,仍然需要复制整个队列,对比搜索引擎来说,倒排拉链巨大,对于热门的查询词,往往有上百万计的元素,在这种情况下,做一次复制(copy)需要较长时间,同时也占用了系统更多的内存。
下面将参考附图,详细描述本发明改进的技术方案。
本发明的技术方案可以应用于采用链表结构存储数据的系统中,如,链表、哈希表等,且适用于单向链表、双向链表和循环链表等数据结构。
如图1所示,图1是根据本发明一个实施例的数据插入方法的流程图。
为了更直观地描述根据本发明以实施例的数据插入方法,接下来,结合图2的循环双向链表结构来对图1的根据本发明的数据插入方法进行描述。
首先描述一下图2的循环双向链表的结构示意图。如图2所示,采用带有头节点的循环双向链表200来组织节点,每个非头节点210可以包括3个元素:前向指针prev、后向指针next以及实际要存储的元素val,头节点220可以包括2个元素:前向指针prev和后向指针next。
下面,结合图1和图2描述根据本发明一个实施例的数据插入方法。
如图1所示,在步骤S110处,分配内存空间,以创建存储待插入数据的节点。
当需要在该链表中插入数据时,可以先分配内存空间,以创建存储该待插入数据的节点。具体而言,可以通过调用内存分配器分配内存空间,从而创建一个新的节点。
在步骤S120处,将待插入数据写入创建的节点。例如,可以在创建的节点的内存空间中按照预定存储方式写入待插入数据。
在步骤S130处,修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
在创建的节点的内存空间写入待插入数据后,可以通过修改链表中相应的指针,将创建的节点插入到如图2所示的链表200中。其中,该相应的指针可以为原始数据的节点相应的指针,例如,指向原始数据的指针以及该原始数据的指针。
下面结合图2和图3对本发明实施例的数据插入方法的循环双向链表实现中修改链表中相应的指针的步骤进行描述。图3为根据本发明实施例的数据插入方法中修改链表中相应的指针的步骤的流程图。
在步骤S310处,确定所述创建的节点的插入位置,其中,所述插入位置为该链表中两个节点之间。也就是说,确定将该创建的节点插入到链表的哪两个节点之间,在上述的链表结构中,可以将该创建的节点插入到该链表的任意两个节点之间。
在步骤S320处,将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点。如图2所示,由于循环双向链表中每个节点都具有前向指针和后向指针,因此,可以按照每两个节点的前向指针和后向指针的方向确定两个节点中的在前节点和在后节点,即,分别按照前向指针的方向和后向指针的方向,确定两个节点中的在前节点和在后节点,如图2所示,每两个相邻的节点中的每个节点既是在前节点又是在后节点。具体而言,在修改前向指针时,插入位置处两个节点中,前向指针指向两个节点中的在前节点,另一节点为在后节点,则可以将该创建的节点的前向指针设置为指向插入位置处两个节点中的在后节点。在修改后向指针时,插入位置处两个节点中,后向指针指向两个节点中的在前节点,另一节点为在后节点,则可以将该创建的节点的后向指针设置为指向插入位置处两个节点中的在后节点。
在步骤S330处,将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。
具体地,可以在修改前向节点时,将插入位置处两个节点中在前节点的前向指针(该节点的前向指针原来指向插入位置处两个节点中的在后节点)修改为指向创建的节点。在修改后向节点时,可以将插入位置处两个节点中在前节点的后向指针(该节点的后向指针原来指向插入位置处两个节点中的在后节点)修改为指向创建的节点。此时,指针修改完成,该节点插入到该循环双向链表200中。
参考图4,图4为根据本发明的另一个实施例的数据插入方法的流程图。为了更直观地描述根据本发明另一个实施例的数据插入方法,接下来,结合图4以及图5a和图5b,以Hashmap(散列映射)为例对本发明的数据插入方法进行描述。其中,图5a为根据本发明一个实施例的Hashmap的存储结构示意图;图5b为根据本发明一个实施例的Hashmap存储结构中每个节点的结构示意图。
如图5a所示,slot0~slotn是一个指针数组,每个元素存放的是该slot(槽)对应链表的指向第一个节点的指针,该指针对应的横向链表是所有通过哈希(hash)函数计算后落到该slot的节点链表。其中,每个节点Node的结构可以如图5b所示,每个节点(Node)保存节点的值Val以及指向其后继节点的指针(Next指针,即该节点的指针),Val是由key-value(键值对)构成,以便在遍历每个Node时能够提取出key的值。
下面,结合图5a和图5b描述图4示出的根据本发明另一个实施例的数据插入方法。在步骤S410处,根据待插入数据的键的哈希值确定所述待插入数据对应的链表。具体地,可以将该待插入数据的键(key)进行哈希运算,并根据运算后得到的值确定该待插入数据对应的slot,进而确定待插入数据对应的链表。
在步骤S420处,遍历所述对应的链表,判断所述链表中是否存在与所述待插入数据键相等的节点。也就是说,逐个判断该对应的链表中每个节点的键(key)是否与该待插入数据的键(key)相等,如果遍历了该链表没有找到与待插入数据键(key)相等的节点,则说明该哈希表中不含有该节点,则可以进行到步骤S430。如果所述链表中存在与所述待插入数据键相等的节点,则终止当前操作并返回。
在步骤S430处,分配内存空间,以创建存储待插入数据的节点。即,为待插入数据(key-value)分配内存空间,以创建存储该待插入数据的节点。
在步骤S440处,将待插入数据写入创建的节点。其中,可以将待插入数据按照预定存储方式写入创建的节点,本实施例HashMap中,可以以键值对(key-value)存储方式写入待插入数据。
在步骤S450处,修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
在创建的节点的内存空间写入待插入数据后,可以修改链表中相应的指针,该创建的节点就可以插入到该对应的链表中。
如图6所示,为根据本发明一个实施例(Hashmap)的数据插入方法中修改链表中相应的指针的流程图。
在步骤S610处,确定所述创建的节点的插入位置,即,所述创建的节点在该对应的链表中的插入位置,其中,所述插入位置为该链表中两个节点之间。也就是说,确定将该创建的节点插入到该链表的哪两个节点之间,在上述的链表结构中,可以将该创建的节点插入到该链表的任意两个相邻的节点之间。例如,在步骤S410处,已经根据待插入数据的键的哈希值确定其对应的链表为slot0对应的链表,则可以确定将该创建的节点node_new插入到slot0对应的链表的链表头处,如图5a所示,也就是将node_new插入slot0对应的链表的第一个节点node0之前,即,slot0与node0之间。
接下来,在步骤S620处,将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点。在上一步骤S610中,确定了将该创建的节点插入到slot0对应的链表的slot0与node0之间,因此,将该创建的节点指针设置为指向node0。
在步骤S630处,将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。slot0中存放其对应的链表中指向第一个节点的指针,因此,可以将slot0中的指针修改为指向节点node_new。指针修改完成后,该创建的节点就被插入到该对应的链表中,即,完成了数据插入。
本发明的另一方面还提供了一种数据更新方法。
如图7所示,图7为根据本发明的一个实施例的数据更新方法的流程图。接下来,结合图2和图7,以循环双向链表为例对本发明的数据更新方法进行描述。
在步骤S710处,分配内存空间,以创建存储该更新数据的节点。即,为该更新数据分配新的内存空间,以创建一个新的节点存储该更新数据。具体地,可以调用内存分配器从空闲链表中获取空闲的内存空间。
在步骤S720处,将该更新数据写入创建的节点。具体地,可以将更新数据按照预定的存储方式写入创建的节点的内存空间。
在步骤S730处,修改链表中相应的指针,以使所述创建的节点插入到所述链表中。具体而言,在创建的节点中写入更新数据后,可以通过修改链表中相应的指针,使该创建的节点插入到该链表中。其中,相应的指针可以为原始数据(被替换数据)所在节点相应的指针,例如,指向原始数据所在节点的指针以及该原始数据所在节点的指针。
如图8所示,为根据本发明另一个实施例的数据更新方法中修改链表中相应的指针的流程图。下面结合图2和图8,对本发明的循环双向链表实现中修改指针的步骤进行描述。
在步骤S810处,将指向所述原始数据所在节点指针修改为指向所述创建的节点。
具体地,由于循环双向链表中每个节点具有两个指针,可以将前向指针指向原始数据所在节点的节点的前向指针修改为指向该创建的节点,将后向指针指向原始数据所在节点的节点的后向指针修改为指向该创建的节点。
在步骤S820处,将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点。在本实施例的循环双向链表中,可以将该创建的节点的前向指针设置为指向原始数据所在节点的前向指针原来所指向的节点,并将该创建的节点的后向指针设置为指向原始数据所在节点的后向向指针原来所指向的节点,此时,已经将更新数据的节点插入该链表中,即,将原始数据的节点替换成了更新数据的节点。
在步骤S830处,删除原始数据所在节点的指针。在步骤S810~S820中,完成了将原始数据的节点替换为更新数据的节点。此时,如果有线程还在读取原始数据节点中的原始数据,则该线程读取完该原始数据后,仍然会读取到原始数据节点的指针(前向指针或后向指针)所指向的下一个节点。因此,可以在数据写入完成之后,将原始数据所在节点的指针删除,则同时也在从该链表中删除了原始数据的节点。
进行了上述的步骤S810~S830后,将更新数据的节点插入到该循环双向链表中,并且从该链表中删除了原始数据的节点,完成了数据更新,接下来,还可以进行回收原始数据所在节点,并将所述节点插入空闲链表中的步骤,以便重新进行分配。
具体地,可以调用内存分配器回收该原始数据所在节点,即,回收该节点的内存空间,其中,回收的内存空间不需要释放,可以插入到空闲链表中,当需要插入新的节点或更新某一节点的数据时,可以先检查空闲链表中是否有空闲内存,如果有,则可以直接使用空闲链表中的空闲内存生成节点。
参考图9,图9为根据本发明的另一个实施例的数据更新方法的流程图。
接下来结合图9,以Hashmap为例对本发明的数据更新方法进行描述。
在步骤S910处,分配内存空间,以创建存储更新数据的节点。即,为该更新数据(key-value)分配节点内存空间,以存储该更新数据。
在步骤S920处,将该更新数据写入创建的节点。
具体地,可以将更新数据按照预定存储方式写入创建的节点,在本实施例中,可以将更新数据以键值对(key-value)的存储方式写入创建的节点的内存空间。
在步骤S930处,修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
写入更新数据后,可以修改链表中相应的指针,该创建的节点就可以插入到该链表中。其中,相应的指针可以为原始数据的节点相应的指针,例如,指向原始数据的节点的指针(原始数据所在节点的前驱结点的指针)以及该原始数据的节点的指针(指向原始数据后继结点的指针)。
如图10所示,为根据本发明一个实施例的数据更新方法中修改链表中相应的指针的流程图。
下面结合图5a和图10,对本发明的hashmap实现中修改指针的步骤进行描述。
在步骤S1010处,确定所述原始数据所在的节点。进而可以确定替换原始数据的更新数据的节点的插入位置。
可以如图11所示,图11是本发明的一个实施例的确定所述原始数据所在的节点的流程图。
在步骤S1110处,根据原始数据的键的哈希值确定所述原始数据所在的链表。
其中,该原始数据即待替换数据,该更新数据即替换原始数据的替换数据。具体地,可以将该原始数据的键(key)进行哈希运算,并根据运算后得到的值确定对应的slot,进而确定原始数据所在的链表。
在步骤S1120处,在所述原始数据所在的链表中,根据所述原始数据的键确定所述原始数据所在的节点。
具体地,可以遍历所述链表,判断所述链表中是否存在与所述原始数据键相等的节点,当判断该链表中某一节点的键(key)与原始数据的键(key)相等时,确定该节点为原始数据所在节点。
假设在步骤S1110~S1120中已经确定更新数据所要替换的原始数据所在的节点为slot0对应的横向链表中的节点node1(如图5a所示)。针对更新数据创建的新节点为node1’。
在步骤S1020处,将指向所述原始数据所在节点指针修改为指向所述创建的节点。在本例中,将指向原始数据所在节点node1的指针修改为指向该创建的节点node1’。
在步骤S1030处,将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点。即,将该创建的节点node1’的指针设置为指向原始数据所在节点的指针原来所指向的节点node2。此时,已经将更新数据的节点node1’插入该链表中,即,将原始数据的节点node1替换成了更新数据的节点node1’。
在步骤S1040处,删除原始数据所在节点的指针,也就是说,在更新数据的写入完成之后,删除原始数据所在节点node1的指针,则同时也在该链表中删除了原始数据的节点node1。
进行了上述的步骤S1010~S1040,创建的更新数据的节点替换了原始数据的节点,完成了数据的更新。
根据本发明的一个实施例,在步骤S930后还可以包括:释放原始数据所在节点的内存空间的步骤。
以上即是在hashmap的链表中实施本发明的数据更新的方法的过程。
采用本发明上述步骤,可以支持在多线程并发的情况下,一个线程进行写操作(如,插入或更新数据),多个线程进行读操作(如,检索、查询操作)。在写入新数据时,分配新的内存空间进行写更新,当数据的写入完成时,再修改指针,即,在写入没有完成时,相应指针不会更新,当一个线程进行写操作时,如果其他的线程正在读取一个节点的数据,由于该节点相应的指针没有修改,其他线程仍然会从该节点的内存空间中读取原始数据。当写入完成时,才会修改相应的指针的指向,该节点从链表中删除,线程才会去读取新插入的节点的更新的数据。并且,在线程读、写的过程中,都不需要对数据加锁。
需要说明的是上述的实施例中仅仅描述了本发明的技术方案在循环双向链表和哈希表中的实现过程,本发明还适用于其他链表或类似链表的数据结构。
本发明还提供一种数据插入装置。如图12所示,图12是根据本发明一实施例的数据插入装置1200的结构框图。装置1200可以包括:分配模块1210、写入模块1220和修改模块1230。
其中,分配模块1210可以用于分配内存空间,以创建存储待插入数据的节点。
写入模块1220可以用于将待插入数据写入创建的节点。
修改模块1230可以用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
根据本发明的一个实施例,修改模块1230可以包括:确定子模块、设置子模块以及修改子模块。
其中,确定子模块可以用于确定所述创建的节点的插入位置。
设置子模块可以用于将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点。
修改子模块可以用于将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。
根据本发明的一个实施例,该装置1200还可以包括确定模块、判断模块和返回模块。
其中,确定模块可以用于根据待插入数据的键的哈希值确定所述待插入数据对应的链表。
判断模块可以用于遍历所述对应的链表,判断所述链表中是否存在与所述待插入数据键相等的节点。
返回模块可以用于如果所述链表中存在与所述待插入数据键相等的节点,则终止当前操作并返回。
本发明还提供一种数据更新装置。
如图13所示,图13是根据本发明一实施例的数据更新装置1300的结构框图,装置1300可以包括:分配模块1310、写入模块1320以及修改模块1330。
其中,分配模块1310可以用于分配内存空间,以创建存储更新数据的节点。
写入模块1320可以用于将更新数据写入创建的节点。
修改模块1330可以用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
根据本发明的一个实施例,修改模块1330可以包括:修改子模块、设置子模块以及删除子模块。
其中,修改子模块可以用于将指向所述原始数据所在节点指针修改为指向所述创建的节点。
设置子模块可以用于将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点。
删除子模块可以用于删除原始数据所在节点的指针。
根据本发明的一个实施例,修改模块1330还可以包括:确定子模块,该模块可以用于确定所述原始数据所在的节点。
该确定子模块可以包括:第一确定子模块和第二确定子模块。
其中,第一确定子模块可以用于根据原始数据的键的哈希值确定所述原始数据所在的链表;
第二确定子模块可以用于在所述原始数据所在的链表中,根据所述原始数据的键确定所述原始数据所在的节点。
根据本发明的一个实施例,该装置1300还可以包括回收模块,该回收模块可以用于回收原始数据所在节点,并将所述节点插入空闲链表中,以便重新进行分配。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的数据插入装置和数据更新装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明包括A9、一种数据插入装置,其特征在于,包括:
分配模块,用于分配内存空间,以创建存储待插入数据的节点;
写入模块,用于将待插入数据写入创建的节点;
修改模块,用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
A10、如权利要求A9所述的装置,其特征在于,所述修改模块,包括:
确定子模块,用于确定所述创建的节点的插入位置;
设置子模块,用于将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点;
修改子模块,用于将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。
A11、如权利要求A9所述的装置,其特征在于,还包括:
确定模块,用于根据待插入数据的键的哈希值确定所述待插入数据对应的链表;
判断模块,用于遍历所述对应的链表,判断所述链表中是否存在与所述待插入数据键相等的节点;
返回模块,用于如果所述链表中存在与所述待插入数据键相等的节点,则终止当前操作并返回。
A12、一种数据更新装置,其特征在于,包括:
分配模块,用于分配内存空间,以创建存储更新数据的节点;
写入模块,用于将更新数据写入创建的节点;
修改模块,用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
A13、如权利要求A12所述的装置,其特征在于,所述修改模块,包括:
修改子模块,用于将指向所述原始数据所在节点指针修改为指向所述创建的节点;
设置子模块,用于将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点;
删除子模块,用于删除原始数据所在节点的指针。
A14、如权利要求A13所述的装置,其特征在于,所述修改模块,还包括:确定子模块,用于确定所述原始数据所在的节点。
A15、如权利要求A14所述的装置,其特征在于,所述确定子模块,包括:
第一确定子模块,用于根据原始数据的键的哈希值确定所述原始数据所在的链表;
第二确定子模块,用于在所述原始数据所在的链表中,根据所述原始数据的键确定所述原始数据所在的节点。
A16、如权利要求A12所述的装置,其特征在于,还包括:回收模块,用于回收原始数据所在节点,并将所述节点插入空闲链表中,以便重新进行分配。
Claims (10)
1.一种数据插入方法,其特征在于,包括:
分配内存空间,以创建存储待插入数据的节点;
将待插入数据写入创建的节点;
修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
2.如权利要求1所述的方法,其特征在于,修改链表中相应的指针,包括:
确定所述创建的节点的插入位置;
将所述创建的节点的指针设置为指向所述插入位置处两个节点中的在后节点;
将所述插入位置处两个节点中的在前节点的指针修改为指向所述创建的节点。
3.如权利要求1所述的方法,其特征在于,还包括:
根据待插入数据的键的哈希值确定所述待插入数据对应的链表;
遍历所述对应的链表,判断所述链表中是否存在与所述待插入数据键相等的节点;
如果所述链表中存在与所述待插入数据键相等的节点,则终止当前操作并返回。
4.一种数据更新方法,其特征在于,包括:
分配内存空间,以创建存储更新数据的节点;
将更新数据写入创建的节点;
修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
5.如权利要求4所述的方法,其特征在于,修改链表中相应的指针,包括:
将指向原始数据所在节点指针修改为指向所述创建的节点;
将所述创建的节点的指针设置为指向所述原始数据所在节点的指针原来所指向的节点;
删除原始数据所在节点的指针。
6.如权利要求5所述的方法,修改链表中相应的指针,还包括:确定所述原始数据所在的节点。
7.如权利要求6所述的方法,确定所述原始数据所在的节点,包括:
根据原始数据的键的哈希值确定所述原始数据所在的链表;
在所述原始数据所在的链表中,根据所述原始数据的键确定所述原始数据所在的节点。
8.如权利要求4所述的方法,其特征在于,还包括:回收原始数据所在节点,并将所述节点插入空闲链表中,以便重新进行分配。
9.一种数据插入装置,其特征在于,包括:
分配模块,用于分配内存空间,以创建存储待插入数据的节点;
写入模块,用于将待插入数据写入创建的节点;
修改模块,用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
10.一种数据更新装置,其特征在于,包括:
分配模块,用于分配内存空间,以创建存储更新数据的节点;
写入模块,用于将更新数据写入创建的节点;
修改模块,用于修改链表中相应的指针,以使所述创建的节点插入到所述链表中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410193423.XA CN105095261A (zh) | 2014-05-08 | 2014-05-08 | 数据插入方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410193423.XA CN105095261A (zh) | 2014-05-08 | 2014-05-08 | 数据插入方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105095261A true CN105095261A (zh) | 2015-11-25 |
Family
ID=54575715
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410193423.XA Pending CN105095261A (zh) | 2014-05-08 | 2014-05-08 | 数据插入方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105095261A (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107566904A (zh) * | 2017-08-31 | 2018-01-09 | 海信电子科技(深圳)有限公司 | 一种资源数据更新方法及机顶盒设备 |
CN107943519A (zh) * | 2017-12-12 | 2018-04-20 | 清华大学 | 一种时序数据乱序操作处理方法和装置 |
CN108021339A (zh) * | 2017-11-03 | 2018-05-11 | 网宿科技股份有限公司 | 一种磁盘读写的方法、设备以及计算机可读存储介质 |
CN108989245A (zh) * | 2017-06-02 | 2018-12-11 | 北京云中融信网络科技有限公司 | 用户数据存储方法及装置 |
CN109101438A (zh) * | 2018-07-25 | 2018-12-28 | 百度在线网络技术(北京)有限公司 | 用于存储数据的方法和装置 |
CN110598054A (zh) * | 2019-08-19 | 2019-12-20 | 桂林长海发展有限责任公司 | 一种多线程链表处理方法、装置及计算机可读存储介质 |
CN110673952A (zh) * | 2019-09-04 | 2020-01-10 | 苏州浪潮智能科技有限公司 | 一种面向高并发读应用的数据处理方法及装置 |
CN110727675A (zh) * | 2018-07-17 | 2020-01-24 | 阿里巴巴集团控股有限公司 | 一种链表的处理方法及装置 |
CN112215399A (zh) * | 2020-09-11 | 2021-01-12 | 中国航空工业集团公司成都飞机设计研究所 | 一种机载动态电子围栏的高确定数据结构设计方法 |
CN112698956A (zh) * | 2021-01-19 | 2021-04-23 | 腾讯科技(深圳)有限公司 | 一种数据对象处理方法、装置、设备及存储介质 |
CN112860684A (zh) * | 2019-11-12 | 2021-05-28 | 阿里巴巴集团控股有限公司 | 数据访问方法、装置、设备及存储介质 |
CN115576501A (zh) * | 2022-12-06 | 2023-01-06 | 苏州浪潮智能科技有限公司 | 一种raid卡的节点更新方法、系统及相关装置 |
CN117349295A (zh) * | 2023-12-04 | 2024-01-05 | 江苏瑞宁信创科技有限公司 | 字词频度统计方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101030168A (zh) * | 2007-02-15 | 2007-09-05 | 华为技术有限公司 | 一种实现高可靠性链表的方法及装置 |
CN101122885A (zh) * | 2007-09-11 | 2008-02-13 | 腾讯科技(深圳)有限公司 | 一种数据缓存处理方法、系统及数据缓存装置 |
-
2014
- 2014-05-08 CN CN201410193423.XA patent/CN105095261A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101030168A (zh) * | 2007-02-15 | 2007-09-05 | 华为技术有限公司 | 一种实现高可靠性链表的方法及装置 |
CN101122885A (zh) * | 2007-09-11 | 2008-02-13 | 腾讯科技(深圳)有限公司 | 一种数据缓存处理方法、系统及数据缓存装置 |
Non-Patent Citations (1)
Title |
---|
刘白林: "《程序设计基础 C语言版》", 31 March 2010 * |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108989245A (zh) * | 2017-06-02 | 2018-12-11 | 北京云中融信网络科技有限公司 | 用户数据存储方法及装置 |
CN108989245B (zh) * | 2017-06-02 | 2022-03-29 | 北京云中融信网络科技有限公司 | 用户数据存储方法及装置 |
CN107566904A (zh) * | 2017-08-31 | 2018-01-09 | 海信电子科技(深圳)有限公司 | 一种资源数据更新方法及机顶盒设备 |
CN108021339B (zh) * | 2017-11-03 | 2021-05-04 | 网宿科技股份有限公司 | 一种磁盘读写的方法、设备以及计算机可读存储介质 |
CN108021339A (zh) * | 2017-11-03 | 2018-05-11 | 网宿科技股份有限公司 | 一种磁盘读写的方法、设备以及计算机可读存储介质 |
CN107943519A (zh) * | 2017-12-12 | 2018-04-20 | 清华大学 | 一种时序数据乱序操作处理方法和装置 |
CN110727675B (zh) * | 2018-07-17 | 2023-06-27 | 阿里巴巴集团控股有限公司 | 一种链表的处理方法及装置 |
CN110727675A (zh) * | 2018-07-17 | 2020-01-24 | 阿里巴巴集团控股有限公司 | 一种链表的处理方法及装置 |
CN109101438A (zh) * | 2018-07-25 | 2018-12-28 | 百度在线网络技术(北京)有限公司 | 用于存储数据的方法和装置 |
CN110598054A (zh) * | 2019-08-19 | 2019-12-20 | 桂林长海发展有限责任公司 | 一种多线程链表处理方法、装置及计算机可读存储介质 |
CN110598054B (zh) * | 2019-08-19 | 2021-11-23 | 桂林长海发展有限责任公司 | 一种多线程链表处理方法、装置及计算机可读存储介质 |
CN110673952B (zh) * | 2019-09-04 | 2023-01-10 | 苏州浪潮智能科技有限公司 | 一种面向高并发读应用的数据处理方法及装置 |
CN110673952A (zh) * | 2019-09-04 | 2020-01-10 | 苏州浪潮智能科技有限公司 | 一种面向高并发读应用的数据处理方法及装置 |
CN112860684A (zh) * | 2019-11-12 | 2021-05-28 | 阿里巴巴集团控股有限公司 | 数据访问方法、装置、设备及存储介质 |
CN112215399A (zh) * | 2020-09-11 | 2021-01-12 | 中国航空工业集团公司成都飞机设计研究所 | 一种机载动态电子围栏的高确定数据结构设计方法 |
CN112698956A (zh) * | 2021-01-19 | 2021-04-23 | 腾讯科技(深圳)有限公司 | 一种数据对象处理方法、装置、设备及存储介质 |
CN112698956B (zh) * | 2021-01-19 | 2024-04-12 | 腾讯科技(深圳)有限公司 | 一种数据对象处理方法、装置、设备及存储介质 |
CN115576501A (zh) * | 2022-12-06 | 2023-01-06 | 苏州浪潮智能科技有限公司 | 一种raid卡的节点更新方法、系统及相关装置 |
CN117349295A (zh) * | 2023-12-04 | 2024-01-05 | 江苏瑞宁信创科技有限公司 | 字词频度统计方法及装置 |
CN117349295B (zh) * | 2023-12-04 | 2024-02-13 | 江苏瑞宁信创科技有限公司 | 字词频度统计方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105095261A (zh) | 数据插入方法和装置 | |
US11182356B2 (en) | Indexing for evolving large-scale datasets in multi-master hybrid transactional and analytical processing systems | |
US8868926B2 (en) | Cryptographic hash database | |
US8261020B2 (en) | Cache enumeration and indexing | |
US8738673B2 (en) | Index partition maintenance over monotonically addressed document sequences | |
US7505960B2 (en) | Scalable retrieval of data entries using an array index or a secondary key | |
US20130191523A1 (en) | Real-time analytics for large data sets | |
US10310904B2 (en) | Distributed technique for allocating long-lived jobs among worker processes | |
CN104572920A (zh) | 一种数据整理方法和装置 | |
US20130290295A1 (en) | Maintaining fault domains in a distributed database | |
CN112527735A (zh) | 一种应用于键值存储系统中的数据合并方法和装置 | |
CN113721862B (zh) | 数据处理方法及装置 | |
CN111752945B (zh) | 一种基于容器和层次模型的时序数据库数据交互方法和系统 | |
CN107315746A (zh) | 基于非易失性主存的高效事务文件系统构建方法 | |
CN104166661A (zh) | 数据存储系统和数据存储方法 | |
CN112000845B (zh) | 一种基于gpu加速的超空间哈希索引方法 | |
CN114969165B (zh) | 数据查询请求的处理方法、装置、设备及存储介质 | |
CN115563116A (zh) | 一种数据库表扫描方法、装置以及设备 | |
EP3995972A1 (en) | Metadata processing method and apparatus, and computer-readable storage medium | |
JP6323887B2 (ja) | ルートノードを変更するための方法および変更装置 | |
Gamell et al. | Specification of Fenix MPI Fault Tolerance library version 0.9. | |
Jamil et al. | Towards scalable manycore-aware persistent B+-trees for efficient indexing in cloud environments | |
CN111581123A (zh) | 基于分类的存储器分配的锁定 | |
CN113835613A (zh) | 一种文件读取方法、装置、电子设备和存储介质 | |
US20240152520A1 (en) | Data query and data storage methods and apparatuses for relation network |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20151125 |
|
RJ01 | Rejection of invention patent application after publication |