一种数据更新的方法及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种数据更新的方法及装置。
背景技术
订阅/更新(Pub/Sub)模型是向一个内容节点发布和订阅消息的模型。消息发布者将消息发布到内容节点,消息订阅者从内容节点订阅消息。订阅/更新的消息由消息关键字(key)和该消息对应的数据值(value)组成,一般该消息key不变或较少变动,与该消息对应的value是频繁变化的,因此需要及时的更新value值,使得消息订阅者能够及时准确地读取所订阅的消息内容。
目前,现有的Pub/Sub模型中的KV(key-value)数据更新的主要方法包括以下几种:
1、将数据锁住后再更新,无论用mutex(常规的互斥锁)还是CAS(Compare&swap,比较&交换)都是有锁的方法;
2、数据复制多份后分别进行更新;
3、使用队列更新数据,写者写入数据编号后各个读者读取数据编号,写者等待一个预设的时间后默认写者已经完成数据处理,随后清除旧数据。
在实现本发明过程中,发明人发现现有技术中存在如下问题:浪费内存;用延迟一段时间再清除旧数据的方法,在很多时候固然运行良好,但是难以控制、内存利用率不高,另一方面,一旦读取程序执行时间过长,如被调试或者有其他异常情况出现导致无法及时处理数据更新队列,超过了预订的延迟的时间,则有极大可能导致数据错误的情况发生。
发明内容
本发明实施例提供一种数据更新的方法及装置,实现了在保证数据一致性的前提下用较少的内存,高效地完成数据更新。
一方面,本发明实施例提供了一种数据更新的方法,包括:
当接收到更新数据的指令时,确定所述指令中待更新数据对应的预定数据结构,读取所述预定数据结构,并确定待更新数据在所述预定数据结构更新队列中的第一内存区域和索引信息;
根据已确定的第一内存区域,更新所述更新队列中的待更新数据;
确定与所述待更新数据的索引信息一一对应的存储地址,根据已确定的所述存储地址,更新数据库的所述存储地址中存储的数据。
另一方面,本发明实施例提供了一种数据更新的装置,包括:
确定及读取单元,用于当接收到更新数据的指令时,确定所述指令中待更新数据对应的预定数据结构,读取所述预定数据结构,并确定待更新数据在所述预定数据结构的更新队列中的第一内存区域和索引信息;
第一更新单元,用于根据已确定的第一内存区域,更新所述更新队列中的待更新数据;
第二更新单元,用于确定与所述待更新数据的索引信息一一对应的存储地址,根据已确定的所述存储地址,更新数据库的所述存储地址中存储的数据。
上述技术方案具有如下有益效果:通过本发明,能够在更新数据时极大地节约了系统的内存,实现了高效、准确地完成数据更新的操作,同时,在一写多读时读数据的时间不确定的情况下,实现了读写数据的过程中,使得读取数据的性能最大化,避免了写数据时该数据未能被及时完成读取的情况发生,极大地保证了数据的一致性;同时,实现了在所有读线程都读取完毕后能够迅速、及时地回收内存,极大地节约了内存的使用。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中一种数据更新的方法流程图;
图2为本发明实施例中一种数据更新的装置结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,为本发明实施例中一种数据更新的方法,包括:
101、当接收到更新数据的指令时,确定所述指令中待更新数据对应的预定数据结构,读取所述预定数据结构,并确定待更新数据在所述预定数据结构更新队列中的第一内存区域和索引信息;
102、根据已确定的第一内存区域,更新所述更新队列中的待更新数据;
103、确定与所述待更新数据的索引信息一一对应的存储地址,根据已确定的所述存储地址,更新数据库的所述存储地址中存储的数据。
可选地,还包括:
创建预定数据结构的第二内存区域,所述第二内存区域用于存储各个读线程的操作地址,包含多个第一内存区域;
确定运行中的各个读线程,将各个读线程一一对应地分配至各个第一内存区域;
创建预定数据结构的第三内存区域,所述第三内存区域用于存储数据的数值标识;
创建预定数据结构的更新队列,所述更新队列用于更新数据。
可选地,所述根据已确定的第一内存区域,更新所述更新队列中的待更新数据之后,还包括:
确定所述待更新数据在所述更新队列中的队列序号;
在所述第三内存区域中将待更新数据的数值标识信息更新为所述队列序号。
可选地,所述读取所述预定数据结构的步骤之前,还包括:
通过预定注册方法注册所述预定数据结构;
在所述第二内存区域中为当前读线程分配操作地址。
可选地,还包括:
监测当前读线程是否读取所述预定数据结构的更新队列;
当读线程读取所述预定数据结构的更新队列时,确定所述读线程已读取完成并不再需要读取的各个数据的数值标识信息中的最大数值标识;
在所述操作地址中记录所述最大数值标识。
可选地,还包括:
当任一读线程结束读取对应待更新数据的预定数据结构时,通过预定注销方法注销与当前读线程对应待更新数据的预定数据结构。
可选地,还包括:
通过预定的扫描频率,扫描各个第三内存区域中存储的各个数据的数值标识;
针对每一个第三内存区域:
根据扫描得到的当前第三内存区域中各个数据的数值标识,确定所述各个数据的数值标识中的最小数值标识;
清除当前第三内存区域中数值标识小于等于所述最小数值标识的数据。
如图2所示,为本发明实施例中一种数据更新的装置,包括:
确定及读取单元21,用于当接收到更新数据的指令时,确定所述指令中待更新数据对应的预定数据结构,读取所述预定数据结构,并确定待更新数据在所述预定数据结构的更新队列中的第一内存区域和索引信息;
第一更新单元22,用于根据已确定的第一内存区域,更新所述更新队列中的待更新数据;
第二更新单元23,用于确定与所述待更新数据的索引信息一一对应的存储地址,根据已确定的所述存储地址,更新数据库的所述存储地址中存储的数据。
可选地,还包括:
第一创建单元,用于创建预定数据结构的第二内存区域,所述第二内存区域用于存储各个读线程的操作地址,包含多个第一内存区域;
确定及分配单元,用于确定运行中的各个读线程,将各个读线程一一对应地分配至各个第一内存区域;
第二创建单元,用于创建预定数据结构的第三内存区域,所述第三内存区域用于存储数据的数值标识;
第三创建单元,用于创建预定数据结构的更新队列,所述更新队列用于更新数据。
可选地,所述第一更新单元,还用于
确定所述待更新数据在所述更新队列中的队列序号;
在所述第三内存区域中将待更新数据的数值标识信息更新为所述队列序号。
可选地,还包括:
调用单元,用于通过预定注册方法注册所述预定数据结构;
分配单元,用于在所述第二内存区域中为当前读线程分配操作地址。
可选地,还包括:
监测单元,用于监测当前读线程是否读取所述预定数据结构的更新队列;
确定单元,用于当读线程读取所述预定数据结构的更新队列时,确定所述读线程已读取完成并不再需要读取的各个数据的数值标识信息中的最大数值标识;
记录单元,用于在所述操作地址中记录所述最大数值标识。
可选地,还包括:
注销单元,用于当任一读线程结束读取对应待更新数据的预定数据结构时,通过预定注销方法注销与当前读线程对应待更新数据的预定数据结构。
可选地,还包括:
扫描单元,用于通过预定的扫描频率,扫描各个第三内存区域中存储的各个数据的数值标识;
计算及清除单元,用于针对每一个第三内存区域:根据扫描得到的当前第三内存区域中各个数据的数值标识,确定所述各个数据的数值标识中的最小数值标识;以及清除当前第三内存区域中数值标识小于等于所述最小数值标识的数据。
本发明实施例上述技术方案具有如下有益效果:通过本发明,能够在更新数据时极大地节约了系统的内存,实现了高效、准确地完成数据更新的操作,同时,在一写多读时读数据的时间不确定的情况下,实现了读写数据的过程中,使得读取数据的性能最大化,避免了写数据时该数据未能被及时完成读取的情况发生,极大地保证了数据的一致性;同时,实现了在所有读线程都读取完毕后能够迅速、及时地回收内存,极大地节约了内存的使用。
以下结合应用实例对本发明实施例上述技术方案进行详细说明:
本发明应用实例旨在保证数据一致性的前提下实现用较少的内存,高效地完成数据更新。
如图1所示,优选地,所述更新数据为所述订阅/更新模型中消息的数据值,所述更新数据对应的数据索引为所述订阅/更新模型中所述消息的关键字。例如,当接收到更新数据的指令时,确定该指令中待更新数据,如data1,对应的预定数据结构,读取该预定数据结构,并确定待更新数据data1在该预定数据结构更新队列中的第一内存区域和索引信息;根据已确定的第一内存区域,更新该更新队列中的待更新数据data1;确定与待更新数据data1的索引信息一一对应的存储地址,根据已确定的存储地址,更新数据库的存储地址中存储的数据,以完成数据更新。同时,为了保证内存读写顺序,有必要时可以在各步骤之间加入Memory barrier(内存屏障)。
在一优选实施例中,该方法包括:预创建预定数据结构的第二内存区域,所述第二内存区域包含多个第一个内存区域;确定运行中的各个读线程,将各个读线程一一对应地分配至各个第一内存区域;创建预定数据结构的第三内存区域,所述第三内存区域用于存放数据的数值标识信息;创建预定数据结构的更新队列,所述更新队列用于更新数据。
其中,所述根据已确定的第一内存区域,更新所述更新队列中的待更新数据之后,还包括:确定所述待更新数据在所述更新队列中的队列序号;在所述第三内存区域中将待更新数据的数值标识信息更新为所述队列序号。
例如,在系统中通过写线程初始化各数据各自一一对应的预定数据结构,其中,写线程可以读数据,也可以写数据;具体地,预创建预定数据结构的第二内存区域,如指针区域,此区域中每一个地址都是不超过intptr_t(等同于指针大小的整数)大小的整数,此区域读线程和写线程都可以操作,第二内存区域用于将第二内存区域的各个地址一一对应分配各个读线程,读线程用于在其对应的第一内存区域中记录自身处理完成的更新队列的队列序号;创建预定数据结构的第三内存区域,第三内存区域用于存放数据的数值标识信息,其中,第三内存区域的类型为intptr_t,此区域读线程和写线程都可以操作;创建预定数据结构的更新队列,更新队列用于更新数据,此队列读线程和写线程都可以操作;当写线程接收到更新数据的指令时,确定该指令中待更新数据,如data1,对应的预定数据结构,如Key-value的数据结构,读取该预定数据结构,确定待更新数据data1对应的Key值和value值,并确定待更新数据data1在该预定数据结构更新队列中的第一内存区域和索引信息,如在预定的第二内存区域中分配一块内存存放更新数据data1数据结构中的value值,得到更新数据data1的第一内存区域,随后,根据已确定的第一内存区域,更新该更新队列中的待更新数据data1,并得到该更新队列的序号,如30,并在第三内存区域中将待更新数据data1的数值标识信息更新为该队列序号30;需要说明的是,其中,更新队列的序号为一个不超过本机指针大小的无符号整数,如在x86_64设备上为不超过unsigned int64的无符号整数。在一优选实施例中,在所述读取所述预定数据结构的步骤之前,还包括:通过预定注册方法注册所述预定数据结构;在所述第二内存区域中为当前线程分配操作地址。
在一优选实施例中,该方法还包括:监测当前读线程是否读取所述预定数据结构的更新队列;当读线程读取所述预定数据结构的更新队列时,确定所述读线程已读取完成并不再需要读取的各个数据的数值标识信息中的最大数值标识;在所述操作地址中记录所述最大数值标识。
例如,当接收到更新数据的指令时,确定该指令中待更新数据,如data1,对应的预定数据结构,监测当前读线程是否读取该预定数据结构的更新队列,当前读线程读取该预定数据结构的更新队列时,确定该读线程已读取的各个数据的数值标识信息中的最大数值标识;在第二内存区域中为该线程分配的操作地址中记录该最大数值标识。
在一优选实施例中,该方法还包括:当任一读线程结束读取对应待更新数据的预定数据结构时,通过预定注销方法注销与当前读线程对应待更新数据的预定数据结构。具体地,当任一读线程不再需要读取对应数据的预定数据结构时,通过预定注销方法注销与当前读线程对应数据的预定数据结构。
例如,当接收到更新数据的指令时,确定该指令中待更新数据,如data1,对应的预定数据结构,随后,判断用于读取预定数据结构的当前线程类型是否为读线程;若是,调用预定注册函数注册所述预定数据结构;在该预定数据结构对应的第二内存区域中为当前线程分配操作地址。其中,注册函数本身是使用传统方法加锁的,但是由于注册函数本身运行的机会很少,所以对整体性能影响可以忽略不计。在系统中确定运行中的各个读线程,当任一读线程结束读取,也就是不再需要读取对应数据,如data2,的预定数据结构时,调用预定注销函数注销与当前读线程对应数据data2的预定数据结构。
在一优选实施例中,该方法还包括:通过预定的扫描频率,扫描各个第三内存区域中存储的各个数据的数值标识;针对每一个第三内存区域:
根据扫描得到的当前第三内存区域中各个数据的数值标识,确定所述各个数据的数值标识中的最小数值标识;清除当前第三内存区域中数值标识小于等于所述最小数值标识的数据。
例如,通过预定的扫描频率,扫描各个第三内存区域中存储的各个数据的数值标识;针对每一个第三内存区域,如针对扫描的当前第三内存区域,根据扫描得到当前第三内存区域中的各个数据的数值标识,如包括20,30,33,计算所述各个数据的数值标识中最小数值标识,如为20;随后,确定当前第三内存区域中数值标识中小于和等于20的待清除数据标识信息,通过写线程清除当前第三内存区域中数值标识信息的数值小于和等于20的数据标识信息所对应的数据,并释放相应的内存空间。
需要说明的,当前读线程在预先为自身分配的、供各读线程写入读写信息的各个第一内存区域中,确定当前读线程的第一内存区域,随后,将当前读线程处理完的更新队列的序号写入所述预先分配的当前读线程的第一内存区域中;其中,读线程写入的写信息包括更新队列的序号,需要说明的是,本领域技术人员可以了解到,读线程写入的写信息还可以包括写入时间、写入数据大小等信息,本发明实施例中虽会以特定的信息为例说明,但在此不做限定。
优选地,读线程除直接将待更新数据在更新队列中的队列序号写入第三内存区域外,读线程也可以通过管道或类似的通信手段通知写线程自身的读取进度;特别的,读线程还可以在完成一批队列数据的处理后,一次性通知写线程,以提高效率;随后,写线程判断各个读线程在第三内存区域中的更新队列的序号,找出更新队列的序号中的最小值,则小于和等于该最小值的更新队列相应序号的数据项可以被清除。需要说明的是,本领域技术人员可以了解到,管道机制,是属于最简单的一种通信方式,它适用于有血缘关系的进程之间的单向通信,它的本质是伪文件,是一段内核缓冲区;实现原理是内核使用环形队列,借助内核缓冲区来实现进程直接的通信。
本发明实施例提供了一种数据更新的装置,可以实现上述提供的方法实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
应该明白,公开的过程中的步骤的特定顺序或层次是示例性方法的实例。基于设计偏好,应该理解,过程中的步骤的特定顺序或层次可以在不脱离本公开的保护范围的情况下得到重新安排。所附的方法权利要求以示例性的顺序给出了各种步骤的要素,并且不是要限于所述的特定顺序或层次。
在上述的详细描述中,各种特征一起组合在单个的实施方案中,以简化本公开。不应该将这种公开方法解释为反映了这样的意图,即,所要求保护的主题的实施方案需要比清楚地在每个权利要求中所陈述的特征更多的特征。相反,如所附的权利要求书所反映的那样,本发明处于比所公开的单个实施方案的全部特征少的状态。因此,所附的权利要求书特此清楚地被并入详细描述中,其中每项权利要求独自作为本发明单独的优选实施方案。
为使本领域内的任何技术人员能够实现或者使用本发明,上面对所公开实施例进行了描述。对于本领域技术人员来说;这些实施例的各种修改方式都是显而易见的,并且本文定义的一般原理也可以在不脱离本公开的精神和保护范围的基础上适用于其它实施例。因此,本公开并不限于本文给出的实施例,而是与本申请公开的原理和新颖性特征的最广范围相一致。
上文的描述包括一个或多个实施例的举例。当然,为了描述上述实施例而描述部件或方法的所有可能的结合是不可能的,但是本领域普通技术人员应该认识到,各个实施例可以做进一步的组合和排列。因此,本文中描述的实施例旨在涵盖落入所附权利要求书的保护范围内的所有这样的改变、修改和变型。此外,就说明书或权利要求书中使用的术语“包含”,该词的涵盖方式类似于术语“包括”,就如同“包括,”在权利要求中用作衔接词所解释的那样。此外,使用在权利要求书的说明书中的任何一个术语“或者”是要表示“非排它性的或者”。
本领域技术人员还可以了解到本发明实施例列出的各种说明性逻辑块(illustrative logical block),单元,和步骤可以通过电子硬件、电脑软件,或两者的结合进行实现。为清楚展示硬件和软件的可替换性(interchangeability),上述的各种说明性部件(illustrative components),单元和步骤已经通用地描述了它们的功能。这样的功能是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本发明实施例保护的范围。
本发明实施例中所描述的各种说明性的逻辑块,或单元都可以通过通用处理器,数字信号处理器,专用集成电路(ASIC),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本发明实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动磁盘、CD-ROM或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中,ASIC可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。
在一个或多个示例性的设计中,本发明实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(DSL)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、DVD、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。