一种多进程共享数据库表更新方法及装置、数据库系统

文档序号:190420 发布日期:2021-11-02 浏览:27次 >En<

阅读说明:本技术 一种多进程共享数据库表更新方法及装置、数据库系统 (Method and device for updating multi-process shared database table and database system ) 是由 刘祥涛 于 2021-06-21 设计创作,主要内容包括:本申请公开了一种多进程共享数据库表更新方法及装置、数据库系统,在多进程共享数据的情况下,能有效提高数据库表更新速度并确保共享数据的可用性和一致性,上述方法应用于多进程共享数据库表更新装置及数据库系统,其中,方法包括:在所述进程启动时对所述进程的数据进行加载;在所述进程运行过程中监测是否发生异常事件;通过数据更新接口接收所述进程中数据更新操作的调用指令;根据所述调用指令执行数据更新操作后得到待更新数据;判断所述待更新数据是否满足写入所述系统数据库的条件,通过所述条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上;若否,则将所述待更新数据写入进程缓存,所述进程缓存为分布式缓存;若是,则将所述待更新数据写入所述系统数据库对应的表中。(The application discloses a method and a device for updating a multi-process shared database table and a database system, which can effectively improve the updating speed of the database table and ensure the availability and consistency of shared data under the condition of multi-process shared data, and are applied to the device and the database system for updating the multi-process shared database table, wherein the method comprises the following steps: loading data of the process when the process is started; monitoring whether an abnormal event occurs in the process running process; receiving a calling instruction of data updating operation in the process through a data updating interface; performing data updating operation according to the calling instruction to obtain data to be updated; judging whether the data to be updated meets the condition of writing into the system database, and limiting the updating operation times of writing into the system database through the condition so as to enable more updating operations to occur on the process cache; if not, writing the data to be updated into a process cache, wherein the process cache is a distributed cache; and if so, writing the data to be updated into a table corresponding to the system database.)

一种多进程共享数据库表更新方法及装置、数据库系统

技术领域

本申请涉及数据库技术领域,具体涉及一种多进程共享数据库表更新方法及装置、数据库系统。

背景技术

数据库是“按照数据结构来组织、存储和管理数据的仓库”,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。通过数据库管理系统可以对存放的数据执行增、删、改、查操作,其中改操作包括单次改多条记录和单次改一条记录,针对单次改多条记录的操作,基于传统的数据库表索引、存储过程、数据库引擎提供的缓存可以实现定位快速修改或缓存后一次性修改,但是,对于大量汇聚的单次改一条记录的操作,尤其是面向多进程高并发系统的共享数据(集中的修改库表,例如承受高并发的银联支付系统的现金转账表的记录修改),距离和修改异构性会给数据库表修改操作带来很大延迟;在极坏情况下,汇聚N条第2类操作,诸如数据库服务器与应用服务器的距离太远(例如>1000KM)、需要连接不同的数据库修改不同的表的不同字段(修改异构性太高),从而带来极大的修改延迟。

目前针对修改数据库表的提速技术主要包括:数据库表索引加速、存储过程加速、数据库引擎提供的缓存加速等。

1、数据库表索引加速:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。通常可通过在数据库表的常用查询字段上建立二叉树索引,将定位数据库记录的时间复杂度从O(N)降低为O(log2N),从而实现数据库表修改加速。

2、存储过程加速:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。但是存储过程存在以下瓶颈:

2.a、通常只能用于结构化数据库,例如MySQL、Oracle、SQL Server等;

2.b、针对不同的数据库表和业务需求需要写特定的存储过程,定制性强,不具备普适性。

3、基于多级缓存加速:一种应用“阿姆达尔定律”(Amdahl’s Law)的加速机制,在计算机系统中被广泛使用,例如系统多级存储加速、数据库写入加速等,可用于数据库写入加速的典型内存缓存系统包括Memcached、Redis、Etcd等,一般是采用先将需要修改的数据写到内存缓存系统,然后再将数据汇总写入;但是,进程有可能崩溃、而且多个进程可能会共享数据,在这些情况下多级缓存机制并不能保持数据的持续可用性和一致性。

根据CAP定理,在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。一致性(C)指在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本);可用性(A)指保证每个请求不管成功或者失败都有响应;分区容忍性(P)指系统中任意信息的丢失或失败不会影响系统的继续运作。CAP定理的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。

多进程系统是一个典型的分布式系统,在共享数据的情况下,如果用统一的1个数据库来存储多进程的共享数据,不会出现数据不一致的情况,确保了分布式系统的C和P,但是如果系统发生了网络分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了CP系统,但是CAP不可同时满足,同时,由于共享1个数据库,在进行数据更新时,需要对表进行加锁、解锁并确保数据更新顺序与业务时序一致,从而导致数据更新速度大幅下降。

综上所述,目前就数据库表更新而言,现有技术方案面向多进程共享数据时,无法有效提升数据库表更新效率。

发明内容

本申请提供了一种多进程共享数据库表更新方法及装置、数据库系统,用于解决在面向多进程共享数据的数据库表更新操作中存在的缺陷,能有效提高数据库表更新速度并确保共享数据的可用性和一致性。

本申请第一方面提供了一种多进程共享数据库表更新方法,所述方法应用于进程子系统,所述进程子系统与系统数据库通信连接,所述系统数据库连接有至少一个进程子系统,所述进程子系统上运行有至少一个进程,包括:

在所述进程启动时对所述进程的数据进行加载;

在所述进程运行过程中监测是否发生异常事件;

通过数据更新接口接收所述进程中数据更新操作的调用指令;

根据所述调用指令执行数据更新操作后得到待更新数据;

判断所述待更新数据是否满足写入所述系统数据库的条件,通过所述条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上;

若否,则将所述待更新数据写入进程缓存,所述进程缓存为分布式缓存;

若是,则将所述待更新数据写入所述系统数据库对应的表中。

可选的,判断所述待更新数据是否满足写入所述系统数据库的条件,包括:

根据预设时间定时更新写库阈值,所述写库阈值由过去预设时间内数据更新操作的先验知识及预设滑动窗口来确定;

判断所述待更新数据是否大于所述写库阈值。

可选的,在所述进程启动时对所述进程的数据进行加载,包括:

启动所述进程,将所述进程的程序加载到计算机的内存中;

根据所述进程的标识从所述进程缓存中查询是否有对应的缓存数据;

若是,则将所述缓存数据加载到所述进程的内存。

可选的,在所述进程运行过程中监测是否发生异常事件之后,所述方法还包括:

若是,在预设退出时间内将所述进程的数据写入所述进程缓存。

可选的,在将所述待更新数据写入所述系统数据库对应的表中之后,所述方法还包括:

从所述进程缓存中清除所述调用指令所调用的数据。

本申请第二方面提供了一种数据读取方法,所述方法应用于进程子系统的上层应用,所述进程子系统与系统数据库通信连接,包括:

接收读取目标数据的请求;

根据所述目标数据的标识从进程缓存中读取所述目标数据对应的缓存数据;

根据所述目标数据的标识从所述系统数据库对应的表中读取所述目标数据对应的表数据;

将所述缓存数据与所述表数据相加得到目标数据。

本申请第三方面提供了多进程共享数据库表更新装置,包括:

数据加载单元,用于在所述进程启动时对所述进程的数据进行加载;

异常事件单元,用于在所述进程运行过程中监测是否发生异常事件,所述异常事件包括进程异常和系统异常;

第一接收单元,用于通过数据更新接口接收所述进程中数据更新操作的调用指令;

更新单元,用于根据所述调用指令执行数据更新操作后得到待更新数据;

第一判断单元,用于判断所述待更新数据是否满足写入所述系统数据库的条件,通过所述条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上;

第一执行单元,用于当第一判断单元确定所述待更新数据不满足写入所述系统数据库的写库阈值时,则将所述待更新数据写入进程缓存,所述进程缓存为分布式缓存;

第二执行单元,用于当第一判断单元确定所述待更新数据满足写入所述系统数据库的写库阈值时,则将所述待更新数据写入所述系统数据库对应的表中。

可选的,所述第一判断单元还包括:

确定模块,用于根据预设时间定时更新写库阈值,所述写库阈值由过去预设时间内数据更新操作的先验知识及预设滑动窗口来确定;

第一判断模块,判断所述待更新数据是否大于所述写库阈值。

可选的,所述数据加载单元包括:

启动模块,用于启动所述进程,将所述进程的程序加载到计算机的内存中;

第二判断模块,用于根据所述进程的标识从所述进程缓存中查询是否有对应的缓存数据;

加载模块,用于当第二判断模块根据所述进程的标识从所述进程缓存中查询到有对应的缓存数据时,将所述缓存数据加载到所述进程的内存。

可选的,所述装置还包括:

第三执行单元,用于当异常事件单元监测到发送异常事件时,将所述进程的数据写入所述进程缓存。

可选的,所述装置还包括:

清除单元,用于在所述进程缓存中清除所述调用指令所调用的数据。

本申请第四方面提供了一种数据读取装置,包括:

接收单元,用于接收读取目标数据的请求;

第一获取单元,用于根据所述目标数据的标识从进程缓存中读取所述目标数据对应的缓存数据;

第二获取单元,用于根据所述目标数据的标识从所述系统数据库对应的表中读取所述目标数据对应的表数据;

执行单元,用于将所述缓存数据与所述表数据相加得到目标数据。

本申请第五方面提供了一种数据库系统,包括系统数据库以及至少一个进程子系统,所述系统数据库与所述进程子系统通信连接,其中,所述进程子系统包括数据处理单元和进程缓存单元,其中,所述数据处理单元包括如上述数据库表更新装置,包括:

所述系统数据库,用于储存所述进程子系统共享的数据;

所述进程缓存单元,用于对所述进程子系统运行的数据进行缓存存储,所述进程缓存单元采用分布式缓存;

所述数据处理单元,用于对所述进程子系统上运行的进程的数据更新和异常事件进行处理。

本申请第六方面提供了一种多进程共享数据库表更新装置,包括:

处理器、存储器、输入输出单元以及总线;

所述处理器与所述存储器、所述输入输出单元以及所述总线相连;

所述处理器具体执行如下操作:

在所述进程启动时对所述进程的数据进行加载;

在所述进程运行过程中监测是否发生异常事件;

通过数据更新接口接收所述进程中数据更新操作的调用指令;

根据所述调用指令执行数据更新操作后得到待更新数据;

判断所述待更新数据是否满足写入所述系统数据库的条件,通过所述条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上;

若否,则将所述待更新数据写入进程缓存,所述进程缓存为分布式缓存;

若是,则将所述待更新数据写入所述系统数据库对应的表中。

本申请实施例第七方面提供了一种计算机可读存储介质,所述计算机可读存储介质上保存有程序,所述程序在计算机上执行时执行前述数据库表更新方法。

从以上技术方案可以看出,在该多进程共享数据库表更新方法中,采用分布式计算原理,当进程子系统执行更新操作时,由于大部分数据都可以写入缓存,若将这些数据都写入系统数据库会占用过多时间,本申请中,先判断待更新数据是否满足写入系统数据库的条件,若是,则写入系统数据库;若否,则写入进程缓存,通过该条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上,进而能够在多进程共享数据的情况下,减少更新操作对系统数据库的占用,大幅度提升系统数据库的更新速度。

附图说明

图1为本申请中数据库系统的一个实施例结构示意图;

图2为本申请中进程子系统核心组成单元的一个实施例结构示意图;

图3为本申请中多进程共享数据库表更新方法的一个实施例流程示意图;

图4为本申请中启动进程时数据加载的一个实施例流程示意图;

图5为本申请中进程异常时数据保护的一个实施例流程示意图;

图6为本申请中多进程共享数据库表更新方法的另一实施例流程示意图;

图7为本申请中上层应用中数据读取方法的一个实施例流程示意图;

图8为本申请中数据库系统的另一实施例结构示意图;

图9为本申请中多进程共享数据库表更新方法的另一实施例流程示意图;

图10为本申请中上层应用中数据读取方法的另一实施例流程示意图;

图11为本申请中多进程共享数据库表更新装置的一个实施例结构示意图;

图12为本申请中数据读取装置的一个实施例结构示意图;

图13为本申请中多进程共享数据库表更新装置的另一实施例结构示意图。

具体实施方式

本申请提供了一种数据库表更新方法及装置、数据库系统,能够弥补在面向多进程共享数据的数据库表更新操作中存在的缺陷,有效提升系统数据库的更新速度并保持数据的可用性和一致性。

下面将结合本申请实施例中的附图,对本申请中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

为了便于理解本申请,下面先对本申请中的数据库系统进行描述。请参阅图1,本申请中数据库系统的一个实施例包括:

系统数据库1以及至少一个进程子系统2,所述系统数据库1与所述进程子系统2通信连接,其中,所述进程子系统2包括数据处理单元21和进程缓存单元22;系统数据库1,用于储存所述进程子系统2共享的数据;所述进程缓存单元22,用于对所述进程子系统运行的数据进行缓存存储,所述进程缓存单元采用分布式缓存;所述数据处理单元21,用于对所述进程子系统上运行的进程的数据更新和异常事件进行处理。

本申请实施例中,系统数据库与各进程子系统的通信可以通过局域网、广域网或其他通信协议的方式,具体此处不做限定,系统数据库与各进程子系统之间形成分布式计算网络结构,进而使得各进程子系统能够并行访问系统数据库,而进程子系统的具体实施例可以参阅图2,具体此处不做赘述。当进程子系统上运行的进程需要执行数据更新操作时,不是直接写入系统数据库,而是先判断更新部分的数据是否满足写入系统数据库的条件,若满足条件再写入系统数据库,否则写入该进程子系统独有的进程缓存单元,以减少进程对系统数据库的占用,进而提高系统数据库的更新效率。

请参阅图2,图2为本申请中进程子系统2核心组成单元的一个实施例结构示意图,用于执行本申请实施例提供的数据库表更新方法,包括:

数据处理单元21包含有:

缓存数据加载模块211,该模块在进程启动时加载该进程的缓存数据,当发生异常事件,如系统宕机或进程出错退出后再次启动系统/进程时,由该模块从进程缓存单元22中加载数据;

数据更新模块212,用于为上层数据更新操作提供数据更新接口并下发数据更新操作,将该部分数据加上进程缓存中对应的数据得到待更新数据,从而对上层数据更新调用屏蔽底层操作;

判断模块213,用于判断待更新数据是否满足更新到系统数据库1的条件;

执行模块214,用于执行写数据的操作,当判断模块确定需要将待更新数据更新到系统数据库1时,则将待更新数据写入系统数据库1,并将本进程缓存单元22中更新部分的数据清除;否则,将待更新数据更新到进程缓存单元22;

异常处理模块215,由于缓存数据加载模块211、数据更新模块212、判断模块213、执行模块214可能出现异常,甚至整个进程都可能出现异常,从而导致进程异常(可能导致进程崩溃);或者进程子系统也可能由于断电或其它原因导致系统异常(可能导致系统宕机);在系统异常情况下,系统存在短时退出时间,以保护进程运行现场,异常处理模块215在异常和/或宕机退出之前,将需要更新写入库的内存数据写入进程缓存单元22,以确保进程再次启动后,能由缓存数据加载模块211从进程缓存单元22中加载上次的缓存数据,从而恢复进程上一次的运行现场;

进程缓存单元22,用于对该进程的数据进行缓冲存储,可采用分布式内存缓存系统,以支持数据的高速读写,并且与数据处理单元21尽量部署在同一机房,以减少网络延迟。

为了更清楚的说明本申请实施例,下面将对在上述数据库系统及进程子系统中执行的方法进行描述。

请参阅图3,本申请中多进程共享数据库表更新方法一个实施例包括:

301、通过数据更新接口接收所述进程中数据更新操作的调用指令;

在进程的运行过程中,由上层应用下发相应的操作指令对系统数据库进行更新,进程的数据更新接口接收到上层数据更新操作的数据更新操作调用,进而执行相应的数据更新操作。

302、根据所述调用指令执行数据更新操作后得到待更新数据;

303、判断所述待更新数据是否满足写入所述系统数据库的条件,若否,则执行步骤304,若是,则执行步骤305;

由于进程在运行过程中可能存在连续多次的更新请求,若每执行一次更新都需要写入系统数据库,则会耗费大量时间进行等待,因此为了减少进程对系统数据库的占用,通过所述条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上,本申请实施例中,写入系统数据库的条件为待更新数据大于写库阈值,在实际应用中可以根据相应需求设为其它判断条件,例如判断待更新数据是否小于写库阈值或者是否在预设区间内等,具体此处不做限定。

304、将所述待更新数据写入进程缓存;

将需要更新的key对应的待更新数据写入进程缓存,以减少当前进程的更新操作对系统数据库的占用。

305、将所述待更新数据写入所述系统数据库对应的表中;

当待更新数据满足写入系统数据库的条件时,将需要更新的key对应的待更新数据写入系统数据库表中。

例如,系统数据库中存有一张用户表,该用户表有1个积分字段(类型为浮点数,例如取值102.31),每次更新都增加一定数量的积分值,并设置有写库阈值(例如取值1000),以限制对系统数据库的更新操作条件,进程的数据更新接口接收到对应key为张三的积分值增加50积分的操作调用。从进程缓存中获取对应张三的多次缓存累计积分值为960,并执行相应的数据更新操作得到待更新数据(960+50=1100),由于1100>1000,则执行步骤305,将key为张三的数据写入系统数据库的用户表的积分字段。

306、从所述进程缓存中清除所述调用指令所调用的数据。

从进程缓存中清除本次已经写入系统数据库的数据。

假设单次写N条记录,如果直接更新到系统数据库,则需要对系统数据库执行N条记录的查找与写入动作,操作相对耗时,本申请实施例中,在执行更新操作时,通过先判断待更新数据是否满足写入系统数据库的条件再将该待更新数据写入系统数据库或进程缓存中,基于此,大部分待更新数据都可以写入缓存,只有少部分待更新数据需要写到系统数据库,从而提升系统数据库的更新速度。

下面对本申请所提升的数据库更新速度进行形式化推演:

假设现有技术的写入系统数据库的数据更新速度即每秒的读写次数(IOPS,Input/Output Operations Per Second)为V1,采用本申请中写入本进程缓存的优化方式后,令将数据更新到进程缓存的速度为V2,假设有比例为P的数据需更新到进程缓存,则更新到数据库的的比例为(1-P),则优化后的加速比为:

Sp=[V1*(1-P)+V2*P]/V1

其中,取P=0.9、V1=2000IOPS(传统数据库包括MySQL或MongoDB)、V2=100000IOPS(内存缓存数据库包括Redis等),则Sp=[2000*0.1+100000*0.9]/2000=45.1,即优化后的速度是优化前的速度的45.1倍。

请参阅图4,本申请中启动进程时的数据加载的一个实施例包括:

401、启动进程,将所述进程的程序加载到计算机的内存中;

402、根据所述进程的标识从所述进程缓存中查询是否有对应的缓存数据,若是,则执行步骤403,若否,则结束数据加载流程,继续执行该进程的其它任务;

403、将所述缓存数据加载到所述进程的内存。

本申请实施例中,启动的进程可能为由于发生异常而中断退出后再次启动的进程,在退出时,由于进程子系统设有异常保护机制(参阅图5,具体此次不做赘述)将该进程的运行数据储存至缓存单元中,因此启动进程时需在进程缓存中查询是否有对应的缓存数据,若有,则加载缓存数据至该进程的内存后再继续执行该进程的其它任务,使得进程能够直接恢复上次退出时的数据现场,从而确保进程的持续可用性。

请参阅图5,本申请中进程异常的数据保护的一个实施例包括:

501、监测所述进程在运行中是否发生异常事件,所述异常事件包括进程异常或系统异常,若是,则执行步骤502,若否,则随着进程执行相应步骤,直至进程结束;

在进程运行过程中可能会发生异常事件,异常事件包括进程异常和系统异常,进程异常程度较低,是由于本进程的异常操作而引发的异常退出(例如除0操作),一般可以被适应异常处理的语句块捕获,从而进行短时处理动作;如果是系统异常(例如断电),一般会由操作系统捕获,并传递给相应的系统进程和应用进程,应用进程也可以对系统异常进行相应的短时处理动作。

502、在预设退出时间内将所述进程的内存数据写入所述进程缓存。

在短时退出时间内,将该进程的内存数据写入进程缓存,例如,在Golang中,可以在defer()匿名函数内或在catch子语句块内,写上能适应系统异常的现场保护程序,将内存数据快速写入本进程缓存,从而保护现场。

在发生进程故障或系统故障时,本申请实施例在进程退出之前,将该进程的内存数据写入进程缓存,以保留进程数据,确保进程数据不丢失。

请参阅图6,本申请中数据库表更新方法另一实施例包括:

601、启动进程,将所述进程的程序加载到计算机的内存中;

602、根据所述进程的标识从所述进程缓存中查询是否有对应的缓存数据,若是,则执行步骤603,若否,执行步骤604;

603、将所述缓存数据加载到所述进程的内存;

本申请实施例中,步骤601至步骤603与前述实施例步骤401至403类似,此处不做赘述。

604、通过数据更新接口接收所述进程中数据更新操作的调用指令;

605、根据所述调用指令执行数据更新操作后得到待更新数据;

本申请实施例中,步骤604至步骤605与前述实施例步骤301至302类似,此处不做赘述。

606、根据预设时间定时更新写库阈值,所述写库阈值由过去预设时间内数据更新操作的先验知识及预设滑动窗口来确定;

本申请实施例中,可以通过过去一段时间内的先验知识和滑动窗口算法(SlidingWindow Algorithm)来确定写数据库/写本地缓存的判断条件,例如,平均10次更新到库的操作内有9次以上都写到本进程缓存(该部分为根据历史记录获取,具体此次不做限定);可以取需要更新的字段在过去最近一段时间内的平均值*N(例如N=9)作为写库/写本地缓存的判断条件。

例如,有一张用户表,其中有1个积分字段,假设过去10天内累计100万次的积分增加或减少的平均值取值为100,则可以取是否超过900作为写数据库/写本地缓存的判断条件,这样就可以保证10次更新到库的操作内有9次以上都写到本进程缓存;为了确保先验随时间变化的适应性,可以把先验窗口随当前时间一起滑动,即可以每隔1天重新计算一次距离当前时间过去10天内累计的积分加减的平均值,从而不断刷新平均值取值,确保能将更新操作大概率落在本进程缓存。

607、判断所述待更新数据是否大于所述写库阈值,若否,则执行步骤608,若是,则执行步骤609;

608、若否,则将所述待更新数据写入进程缓存;

609、若是,则将所述待更新数据写入所述系统数据库对应的表中;

610、在所述进程缓存中清除所述调用指令所调用的数据。

本申请实施例中,步骤608至步骤610与前述实施例中步骤304至306类似,此处不再赘述。

需要说明的是,本申请实施例在进程的运行过程中,仍需实时监测系统是否发生异常事件,若发生异常事件则执行异常处理,以确保进程的数据可用性,基于此,本申请实施例采用分布式计算中的map/reduce原理并优化,各个进程的数据更新与异常处理相当于各个进程的map操作,各个进程缓存相当于相应map操作的局部数据;而reduce则是通过各进程(不需要单独1个reduce进程)在系统数据库上使用保留上次操作的inc(增加)或者dec(减少)操作(而不是set操作,因为set操作会把之前的数据都刷新掉)来完成,从而完成各个进程数据的一致性汇聚(即reduce,归约),从而使得本申请具有适应多进程的数据一致性的效果。

基于现有技术执行上述写库操作得到的结果为:1核CPU/2GB内存机器写1万条记录,直接写远程数据库,需要55s;而通过对本申请实施例进行优化后得到的结果:需要3ms至2s(3ms是都写进程缓存时的最好情况,2s是平均运行情况),提升写速度为原来的27.5至18333.3倍。

请参阅图7,本申请中数据读取方法的一个实施例应用于进程子系统上层应用,包括:

701、接收读取目标数据的请求;

702、根据所述目标数据的标识从进程缓存中读取所述目标数据对应的缓存数据;

703、根据所述目标数据的标识从所述系统数据库对应的表中读取所述目标数据对应的表数据;

704、将所述缓存数据与所述表数据相加得到目标数据。

本申请实施例中,根据进程的运行情况上层应用通过数据更新接口发送数据更新操作的调用至底层模块,并将底层操作对上层应用进行屏蔽。

为了进一步理解本申请中数据库表更新方法应用,下面通过数据库系统部署的实施例及数据库表更新的方法的应用进行举例说明。

请参阅图8,本申请中数据库系统部署的一个实施例:

数据库系统由多个进程子系统、系统数据库组成,其中进程子系统801由进程服务器8011、进程缓存服务器8012组成,系统数据库为系统数据库服务器802,其中:

进程服务器8011,用于部署缓存数据加载、数据更新、判断与执行、异常处理等模块,负责缓存数据加载、数据更新、判断与执行、异常处理等,与进程缓存服务器8012、系统数据库服务器802通信,当判断本部分数据不需要更新到系统数据库服务器802时,直接更新到进程缓存服务器8012;当判断需要更新到系统数据库服务器802时,将本部分数据累计后,更新到系统数据库服务器802,并将本部分数据从进程缓存服务器8012清除。值得注意的是,多个进程服务器8011支持1个程序/多个程序的分布式集群部署,可支持多台进程服务器8011同时干1件事或者分别干不同的事,从而实现对高并发、高可用系统的弹性支撑。

进程缓存服务器8012,用于部署进程缓存模块,负责各个进程子系统的数据缓存;通常采用成熟的开源分布式内存缓存数据库系统,例如Redis/Memcached/Etcd等,具体此处不做限定,这些分布式系统通过采用了内存加速技术,可以获得10万以上IOPS性能;可以配置为同步/异步刷盘模式,从而数据在进程缓存服务器8012断电等异常时,能确保数据不丢失;还可以采用多台服务器承载进程缓存,以消除单点故障。

系统数据库服务器802,用于部署多个进程子系统共享的数据,包括业务数据、用户数据、日志数据等,可以采用MySQL、SQLServer、Oracle、MongoDB等,以确保数据的最终一致性。

请参阅图9,基于上述实施例,进程缓存服务器采用Redis集群(3台服务器),系统数据库采用MongoDB,可以采用三副本集群,本申请中数据库表更新方法的一个实施例包括:

901、设定累计积分值阈值;

通过配置参数设定累计积分值阈值,假设此处设定为Cmax=1000,即当本次更新某用户的积分值+进程缓存的该用户的积分值>=1000时,将触发写系统数据库的操作。

902、获取需要更新用户Ui的积分值;

通过数据更新接口获取本次需要更新用户UI的积分值为Cj。

903、从Redis获取用户Ui的当前缓存积分值Ci;

从Redis读取key=Ui的value值,设置为Ci,如果获取不到对应key=Ui的值,则Ci=0。

904、计算出用户Ui的累计积分值:Ct=Cj+Ci;

905、判断累计积分值是否大于阈值,若是,则执行步骤906,若否,则执行步骤908;

判断Ct是否大于Cmax,若是,则执行步骤906,将累计积分值写入系统数据库,若否,则执行步骤908,将累计积分值写入进程缓存。

906、定位系统数据库MongoDB的user表上对应用户Ui的记录并对其积分字段执行Inc(增加)操作;

907、从进程缓存清除key=Ui的Value记录;

908、将Redis中key=Ui的值刷新为Ct;

909、判断是否还需要更新数据,若是,则执行步骤902,若否,则结束数据更新的执行流程。

由于本申请将上层应用数据与底层操作进行屏蔽,而本申请实施例中积分值更新机制是当进程缓存的积分值达到阈值才去更新系统数据库的用户积分值,所以,当上层应用需要读取某个用户当前的积分值时,可能会存在进程缓存的积分由于未达到阈值、未及时更新到系统数据库的情况。因此,上层应用在读取用户当前积分值的时候,需要分别读取进程缓存和系统数据库中该用户对应的积分值,相加后即为用户的当前积分值。

请参阅图10,本申请实施例中上层应用的数据库表更新方法对应上述数据库表的数据读取方法,包括:

1001、接收用户Ui的积分值读取请求;

1002、从Redis获取用户Ui的当前缓存积分值Ci;

本申请实施例中,假设获取当前的缓存积分值Ci为50。

1003、从系统数据库MongoDB的user表获取用户Ui对应的积分值Cd;

假设在user表中获取到用户Ui对应的积分值Cd为1688。

1004、计算出用户Ui的累计积分值:Cr=Ci+Cd。

根据Cr=Ci+Cd计算用户当前的积分值,Cr=50+1688,即Cr=1738为用户的当前积分值。

需要说明的是,本申请实施例所描述的读取数据方法为单个进程子系统累加系统数据库的相应字段数据的情况,若在多个进程子系统都有本字段数据缓存的情况下,则需要叠加多个进程子系统的相应字段数据,在此不再赘述。

请参阅图11,本申请中多进程共享数据库表更新装置的一个实施例包括:

数据加载单元1101,用于在所述进程启动时对所述进程的数据进行加载;

异常事件单元1102,用于在所述进程运行过程中监测是否发生异常事件,所述异常事件包括进程异常和系统异常;

第一接收单元1103,用于通过数据更新接口接收所述进程中数据更新操作的调用指令;

更新单元1104,用于根据所述调用指令执行数据更新操作后得到待更新数据;

第一判断单元1105,用于判断所述待更新数据是否满足写入所述系统数据库的条件,通过所述条件限制写入系统数据库的更新操作次数,以使得更多更新操作发生在进程缓存上;

第一执行单元1106,用于当第一判断单元确定所述待更新数据不满足写入所述系统数据库的写库阈值时,则将所述待更新数据写入进程缓存,所述进程缓存为分布式缓存;

第二执行单元1107,用于当第一判断单元确定所述待更新数据满足写入所述系统数据库的写库阈值时,则将所述待更新数据写入所述系统数据库对应的表中。

第三执行单元1108,用于当异常事件单元监测到发送异常事件时,将所述进程的数据写入所述进程缓存。

清除单元1109,用于在所述进程缓存中清除所述调用指令所调用的数据。

本申请实施例中,所述第一判断单元1105包含有:

确定模块11051,用于根据预设时间定时更新写库阈值,所述写库阈值由过去预设时间内数据更新操作的先验知识及预设滑动窗口来确定;

第一判断模块11052,判断所述待更新数据是否大于所述写库阈值。

本申请实施例中,所述数据加载单元1101包含有:

启动模块11011,用于启动所述进程,将所述进程的程序加载到计算机的内存中;

第二判断模块11012,用于根据所述进程的标识从所述进程缓存中查询是否有对应的缓存数据;

加载模块11013,用于当第二判断模块根据所述进程的标识从所述进程缓存中查询到有对应的缓存数据时,将所述缓存数据加载到所述进程的内存。

请参阅图12,本申请中数据库表更新装置用于上层应用读取数据的一个实施例包括:

接收单元1201,用于接收读取目标数据的请求;

第一获取单元1202,用于根据所述目标数据的标识从进程缓存中读取所述目标数据对应的缓存数据;

第二获取单元1203,用于根据所述目标数据的标识从所述系统数据库对应的表中读取所述目标数据对应的表数据;

执行单元1204,用于将所述缓存数据与所述表数据相加得到目标数据。

请参阅图13,本申请中数据库表更新装置的另一个实施例包括:

处理器1301、存储器1302、输入输出单元1303、总线1304;

所述处理器1301与所述存储器1302、所述输入输出单元1303以及所述总线1304相连;

所述处理器1301具体执行如下操作:

通过数据更新接口接收所述进程中数据更新操作的调用指令;

根据所述调用指令执行数据更新操作后得到待更新数据;

判断所述待更新数据是否满足写入所述系统数据库的条件;

若否,则将所述待更新数据写入进程缓存;

若是,则将所述待更新数据写入所述系统数据库对应的表中。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,read-onlymemory)、随机存取存储器(RAM,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。

27页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种基于区块链的分布式数据存储系统

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!