具体实施方式
如图1所示,在一实施例中,提供了一种系统,包括:数据同步设备10、源库20和目标库30,数据同步设备10可以是服务器、或终端等计算设备,用以对源库20和目标库30内的数据进行操作以及实现两个数据库之间的数据同步。在一示例性场景中,源库20可以作为应用系统的主库,目标库30可以作为应用系统的从库,其中从库可以用来在主库不能正常工作时被应用系统所使用,当主库恢复正常时,应用系统由从库切换到主库进行使用。其中,应用系统可例如为:网络支付系统、网约车系统等各类互联网平台的系统。上述数据同步设备10可以为应用系统本身,或应用系统的一个子设备、或应用系统之外的其他设备,对此本文可以不作限制。需说明的是,对于应用系统而言,源库和目标库可以并不固定,例如,在某些场景中,可以将数据库A中的数据同步到数据库B中,则数据库A为源库,数据库B为目标库。在又一场景中,可以将数据库B中的数据同步到数据库A中,则数据库A为目标库,数据库B为源库。
为了实现数据的同步,源库20包括第一数据表和第一同步记录表,目标库30包括第二数据表和第二同步记录表。对于应用系统而言,源库20和目标库30均可以用于存储该应用系统在业务运营时所产生的业务数据,其中,需要存储到源库20中的业务数据可被插入到第一数据表中,需要存储到目标库30中的业务数据可被插入到第二数据表中。其中,第一数据表、第二数据表均可以指代一种或多种类型的表结构,每一种表结构用以存放一种类型的数据。本文中,在向数据库(如:源库)写入一条业务数据的同时,还需要相应写入一条与业务数据对应的同步记录到同步记录表中,即,无论是源库还是目标库,每条业务数据都会对应一个同步记录。同步记录的作用在于记录对数据库中存储的业务数据的操作(所述操作可以包括更改、删除、新增等),在一实施例中,每一条同步记录中可以记录着业务数据被存放的表名和该业务数据的唯一索引值,另外,同步记录还可以记录着业务数据的版本以及针对业务数据的同步操作的执行状态。需说明的是,与源库对应的第一同步记录表可以不限于存储于源库中,如:存储于与源库独立的另一存储空间。对所述第二同步记录表而言,也是同样的道理。
其中,在本文中,为了便于区分,将存放于源库中的业务数据称为“第一业务数据”,将存放于目标库中的业务数据称为:“第二业务数据”,将与每一条“第一业务数据”对应的同步记录称为“第一同步记录”,将与每一条“第二业务数据”对应的同步记录称为“第二同步记录”。
图2示出了一示例性实施例提供的向数据库(如:源库)中写入同步记录的流程,包括如下步骤:
步骤101:向源库写入业务数据。
步骤102:判断所述源库中是否存储有与被写入的业务数据对应的同步记录。若是,则进入步骤103,若否,则进入步骤104。
步骤103:更新所述与被写入的业务数据对应的同步记录。
步骤104:向所述源库中的第一同步记录表中插入与该业务数据对应的同步记录。
以下将通过具体例子来说明步骤101~步骤104的过程。以网络支付系统为例,假设某用户(该用户的用户标识USER_ID为“800000001”)在某时刻申请通过银行卡向网络支付账户转入1元,则网络支付系统可以先向源库中的资金转入表(假设表名为:YEB_TRANS_IN_ORDER)插入一条金额为1元的转入单记录(即业务数据)。其中,在上述过程中,源库可以执行如下SQL(Structured Query Language):
INSERT INTO YEB_TRANS_IN_ORDER(ID,USER_ID,ORDER_STATUS,AMOUNT)VALUES(‘201703200123456’,‘800000001’,‘1.00’,‘APPLY’)。
在一种示例中,在上述资金转入表中插入的转入单记录(即第一业务数据)例如为:
ID |
USER_ID |
AMOUNT |
ORDER_STATUS |
20170320000001 |
800000001 |
1.00 |
APPLY |
其中,ID表示业务数据ID(即业务数据的唯一索引值),USER_ID表示用户标识,AMOUNT表示转入金额,ORDER_STATUS表示转入单的状态,“APPLY”表示状态为申请中。
由于该条转入单记录为新插入的业务数据,第一同步记录表中没有与该业务数据对应的同步记录,则需要执行以上步骤104,即,向第一同步记录表中插入一条同步记录,版本标识(version)为0,同步操作的执行状态为未执行(如:表示为“INIT”)。同时,将转入单的订单号(ID)记录至同步记录的唯一索引值,转入表表名记录至同步记录中的表名字段。即,源库可以执行如下SQL:
INSERT INTO SYNC_ENTRY(INDEX_VALUE,TABLE_NAME,STATUS,VERSION)VALUES(‘20170320000001’,‘YEB_TRANS_IN_ORDER’,‘INIT’,‘0’)。
在一种示例中,插入到第一同步记录表中的第一同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
INIT |
0 |
其中,INDEX_VALUE表示转入单的订单号,TABLE_NAME表示业务数据所插入的表名,STATUS表示状态标志(用以表明针对所述业务数据ID的同步操作的执行状态),VERSION表示业务数据的版本。
当上述用户(该用户的用户标识USER_ID为“800000001”)完成银行卡付款后并且金额成功转入到指定的第三方支付账户中。网络支付系统对转入单进行更新,将转入单的状态更新为成功状态(SUCCESS)。即,数据库执行SQL为:
UPDATE YEB_TRANS_IN_ORDER SET STATUS=‘SUCCESS’where ID=‘20170320000001’。
例如:第一数据表中的第一业务数据变化为:
ID |
USER_ID |
AMOUNT |
ORDER_STATUS |
20170320000001 |
800000001 |
1.00 |
SUCCESS |
此后,根据转入单的唯一索引值(20170320000001)和表名(YEB_TRANS_IN_ORDER)在第一同步记录表中可查询到对应的第一同步记录,并对此第一同步记录的版本标识执行更新操作。即,数据库执行SQL为:
UPDATE SYNC_ENTRY SET VERSION=VERSION,STATUS=‘INIT’WHERE INDEX_VALUE=‘20170320000001’AND TABLE_NAME=‘TRANS’AND VERSION=‘0’。
例如:第一同步记录表中与该业务数据对应的第一同步记录变化为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
INIT |
1 |
可见,每对源库中的业务数据进行一次操作,第一同步记录表中与该业务数据对应的同步记录的状态便会被重置为:INIT,且业务数据的版本标识加1。
接下来,将基于以上内容来介绍数据同步方法的具体实现过程。
如图3所示,在一实施例中,一种数据同步方法包括如下步骤:
步骤201:对于源库中的待同步的业务数据ID,在与所述源库对应的第一同步记录表中查找与所述业务数据ID对应的第一同步记录。其中,所述第一同步记录包含与所述业务数据ID对应的第一版本标识,所述第一版本标识表明所述源库中存储的与所述业务数据ID对应的第一业务数据的版本。如果查找到所述第一同步记录,则进入下述步骤202,如果没有查找到,则结束流程。
其中,在步骤201之前,还可包括步骤200:在数据同步任务的执行时间到来时,确定源库中待同步的至少一个业务数据ID。
在一实施例中,所述步骤200可以具体为:
在数据同步任务(如:定时任务)的执行时间到来时,在与源库对应的第一同步记录表中查找状态标志为第一目标值的第一同步记录,并将查找到的所述第一同步记录中包含的业务数据ID确定为待同步的业务数据ID。其中,所述第一目标值表明所述执行状态为未执行。例如:“INIT”。举例而言,如果某个时刻源库中有10000条业务数据,其中,假设此刻总共有100条业务数据的第一同步记录中的状态标志的取值为INIT,则表明此刻共有100条可能需要被同步到目标库中的业务数据,并将这100条业务数据的ID确定为待同步的业务数据ID。
在一实施例中,所述第一同步记录中的状态标志(STATUS)在源库中与该第一同步记录对应的第一业务数据被操作(所述操作包括修改、新增、删除等)时被修改为第一目标值,并且,所述第一同步记录中的状态标志(STATUS)在针对该第一业务数据的同步操作被执行完毕时被修改为第二目标值,所述第二目标值表明所述执行状态为执行结束,例如:第二目标值为“FINISHED”。
在另一实施例中,确定待同步的业务数据ID的方式并不限于以上过程,例如:通过监控源库中的数据更改操作,当监测到某个业务数据ID对应的业务数据发生修改时,记录其被修改的时间戳,这样,当某个数据同步任务的执行时间到来时,可以将上一同步任务的执行时间至当前同步任务的执行时间的这一时间片段内发生修改的业务数据ID,确定为待同步的业务数据ID。或者,也可以不设置上述状态标志,在需要在源库和目标库之间进行数据同步操作时,可以遍历源库中的每一业务数据对应的第一同步记录以及遍历目标库中对应的第二同步记录,以确定每一业务数据是否需要进行同步。
步骤202:根据步骤201中的业务数据ID,在与目标库对应的第二同步记录表中查找所述业务数据ID对应的第二同步记录,其中,所述第二同步记录包含与所述业务数据ID对应的第二版本标识。
步骤203:判断是否在第二同步记录表中查找到与所述业务数据ID对应的第二同步记录,如查找到(表明目标库中已经存储与业务数据ID对应的业务数据),进入步骤204;如没有查找到(表明目标库中并没有存储与业务数据ID对应的业务数据),则进入步骤205。
步骤204:判断查找到的第二同步记录中包含的第二版本标识表明的版本是否晚于所述第一版本标识表明的版本,如果晚于,则进入步骤205;如果不晚于,则进入步骤207。其中,所述第二版本标识表明所述目标库中存储的与所述业务数据ID对应的第二业务数据的版本。例如,对于同一业务数据ID,在源库中查找到与之对应的第一同步记录中的第一版本标识为“2”,在目标库中查找到与之对应的第二同步记录中的第二版本标识为“1”,则第一版本标识所表示的版本早于第二版本标识所表示的版本。
步骤205:以所述源库为基准对所述目标库执行针对所述业务数据ID的同步操作。其中,“同步操作”的目的为使得源库和目标库中分别存储的与所述业务数据ID对应的业务数据一致。
在一实施例中,步骤205可以具体包括:
如果所述源库中不存在与所述业务数据ID对应的第一业务数据、且所述目标库中存在的与所述业务数据ID对应的第二业务数据,删除所述目标库中存在的第二业务数据。
如果所述源库中存在与所述业务数据ID对应的第一业务数据、且所述目标库中不存在的与所述业务数据ID对应的第二业务数据,在所述目标库中插入所述第一业务数据。
如果所述源库中存在与所述业务数据ID对应的第一业务数据、且所述目标库中存在的与所述业务数据ID对应的第二业务数据,将所述第二业务数据更新为所述第一业务数据。
步骤207:拒绝执行针对所述业务数据ID的同步操作。
在一可选的实施例中,在步骤205之后,该方法还可包括:
步骤206:将所述第一同步记录中的与所述业务数据ID对应的第一版本标识和所述第二同步记录表中的与所述业务数据ID对应的第二版本标识修改成一致。
接下来,沿用以上网络支付系统的例子来说明以上图3所示的数据同步方法。
当用户申请向第三方支付账户转入金额时,插入到源库中的与该转入申请对应的第一业务数据例如为:
插入到第一同步记录表中的与该第一业务数据对应的第一同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
INIT
|
0 |
此后,同步任务的执行时间到来时,通过查询第一同步记录表,可以查询到上述第一业务数据(业务数据ID为:20170320000001)对应的执行状态为INIT,并且,假设在目标库中未查到与业务数据ID:“20170320000001”对应的第二同步记录,则可以判定需要向目标库写入第二业务数据(与第一业务数据一致)以及与该第二业务数据对应的第二同步记录(与第一同步记录一致)。
在目标库的转入单表(YEB_TRANS_IN_ORDER)中插入的第二业务数据例如为:
ID |
USER_ID |
AMOUNT |
ORDER_STATUS |
20170320000001 |
800000001 |
1.00 |
APPLY |
在目标库中的第二同步记录表(SYNC_ENTRY)中插入的第二同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
FINISHED |
1
|
其中,上述第二同步记录中的状态标志“STATUS”的取值为FINISHED,表示针对该业务数据的同步操作已经被执行完毕,“VERSION”可以表示第二版本标识,其取值可在第一版本标识的基础上加一。
此后,对源库中的第一同步记录,以使得第一版本标识和第二版本标识一致,更新后的第一同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
FINISHED
|
1
|
其中,在同步操作完成之后,第一同步记录中的状态标志(STATUS)的取值由“INIT”修改为“FINISHED”。
此后,当用户使用银行卡付款成功后,与该笔转账对应的第一业务数据以及第一同步记录再次被更新,更新后的第一业务数据例如为:
ID |
USER_ID |
AMOUNT |
ORDER_STATUS |
20170320000001 |
800000001 |
1.00 |
SUCCESS
|
更新后的第一同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
INIT
|
2
|
其中,因为更新,所以第一同步记录中的状态标志的值再次被修改为:INIT(表明需要被同步),第一版本标识也相应地加一。
此后,同步任务再次查询到状态标志的值为INIT的第一同步记录,并在目标库对应的第二同步记录表中查到相对应的第二同步记录。因为源库中的业务数据的版本高于目标库中的业务数据的版本,判定需要向目标库更新第二业务数据和对应的第二同步记录。更新后的第二业务数据例如为:
ID |
USER_ID |
AMOUNT |
ORDER_STATUS |
20170320000001 |
800000001 |
1.00 |
SUCCESS
|
更新后的第二同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
FINISHED |
3 |
此后,还需要对第一同步记录进行更新,更新后的第一同步记录例如为:
INDEX_VALUE |
TABLE_NAME |
STATUS |
VERSION |
20170320000001 |
YEB_TRANS_IN_ORDER |
FINISHED
|
3
|
基于图3提供的方法实施例可以看出,通过第一同步记录表和第二同步记录表可完成两库之间的数据同步,由于针对源库中的每一数据的同步操作是相互独立的,数据的同步任务可以并发执行,使得数据同步效率得到提升。例如,如查询到源库中状态标志的取值为“INIT”的同步记录时,可一次查询到1000条待同步的业务熟,并启动多线程进行并发同步。此外,每次查询到的状态标志的取值为“INIT”的同步记录数可以动态调节,以适用并发同步速率的需求。另外,可以适用于在不同类型的数据库之间进行数据同步。通过数据同步任务(如定时任务)来执行源库和目标库之间的数据同步,每个数据同步任务都可以确定到至少一个待同步的业务数据ID,并针对这些业务数据ID来作同步,从而实现了几乎准实时的数据同步过程。其中,可以根据源库的数据更新频率或数据量来调整数据同步任务的执行频率。
在相关技术中,一般数据库自带的同步工具通常只能支持同类型的数据库之间的数据同步,而并不能支持异构数据库之间的数据同步。其中,将两个不同类型的数据库称为异常数据库,例如:ORACLE、MySQL、OceanBase为三种类型的数据库,互为异构数据库。通过本申请提供的方案,则可以不限于同种类型的数据库之间的数据同步,还可以实现异构数据库之间的数据同步。
如图4所示,在又一种实施例中,数据同步方法可以包括如下步骤:
步骤301:判断数据同步任务(如:定时任务)的执行时间是否到来,若是,确定源库中待同步的至少一个业务数据ID,并进入步骤302。若否,则不执行同步,继续等待数据同步任务的执行时间到来。其中,以定时任务为例,定时任务的执行时间可以通过开关来控制,执行时间可以是一个时间点,也可以是一个时间段。当然,数据同步任务并不限制为定时任务。
步骤302(同上述步骤201,可参照对步骤201进行描述的相关内容):针对每一业务数据ID,在与源库对应的第一同步记录表中查找与所述业务数据ID对应的第一同步记录。其中,所述第一同步记录包含与所述业务数据ID对应的第一版本标识,所述第一版本标识表明所述源库中存储的与所述业务数据ID对应的第一业务数据的版本。当查找到所述第一同步记录时,进入步骤303,若没有查找到所述第一同步记录,结束流程。
步骤303(同上述步骤202,可参照对步骤202进行描述的相关内容):在与目标库对应的第二同步记录表中查找所述业务数据ID对应的第二同步记录。
步骤304:判断是否在所述第二同步记录表中查找到第二同步记录、且查找到的第二同步记录中包含的第二版本标识表明的版本早于所述第一版本标识表明的版本,如果判断结果为是,则进入步骤306;否则,进入步骤305。
步骤305(同上述步骤205,可参照对步骤205进行描述的相关内容):以所述源库为基准对所述目标库执行针对所述业务数据ID的同步操作。
步骤306(同上述步骤206,可参照对步骤206进行描述的相关内容):将所述第一同步记录中的与所述业务数据ID对应的第一版本标识和所述第二同步记录表中的与所述业务数据ID对应的第二版本标识修改成一致。
步骤307:将所述第一同步记录中与所述业务数据ID对应的状态标志(STATUS)由第一目标值(如:INIT)修改为第二目标值(如:FINISHED)。
其中,需说明的是,图4的流程仅示出了针对单个业务数据的同步过程,实际上,每当定时任务的执行时间到来时,可以同时针对多个业务数据进行同步操作,并且可以通过多线程并行执行同步操作。定时任务的调度频率可以通过开关来控制,例如:1秒钟触发一次任务,即,数据同步的延迟可控制在1秒以内,以满足秒级延迟的数据同步需求。
与上述方法相对应的,本文还提供了一种数据同步装置,该装置可以包括软件中的各个代码模块。
如图5所示,在一实施例中,一种数据同步装置400可包括:确定单元401、第一查找单元402、第二查找单元403以及数据同步单元404,其中:
确定单元401可被配置为:在数据同步任务的执行时间到来时,确定源库中待同步的至少一个业务数据ID;
第一查找单元402可被配置为:针对每一业务数据ID,在与源库对应的第一同步记录表中查找与所述业务数据ID对应的第一同步记录,所述第一同步记录包含与所述业务数据ID对应的第一版本标识。
第二查找单元403可被配置为:在查找到所述第一同步记录时,在与目标库对应的第二同步记录表中查找所述业务数据ID对应的第二同步记录,所述第二同步记录包含与所述业务数据ID对应的第二版本标识。
数据同步单元404可被配置为:在没有查找到所述第二同步记录,或查找到的第二同步记录中包含的第二版本标识表明的版本晚于所述第一版本标识表明的版本时,以所述源库为基准对所述目标库执行针对所述业务数据ID的同步操作。
在一可选的实施例中,所述第一同步记录还可包含与所述业务数据ID对应的状态标志,其中,所述状态标志表明针对所述业务数据ID的同步操作的执行状态。
相对应地,所述确定单元401可以包括:
查找子单元,在数据同步任务的执行时间到来时,在与源库对应的第一同步记录表中查找状态标志为第一目标值的第一同步记录,所述第一目标值表明所述执行状态为未执行;
确定子单元,将查找到的所述第一同步记录中包含的业务数据ID确定为待同步的业务数据ID。其中,所述第一目标值(如:INIT)表明所述执行状态为未执行。
进一步地,所述装置400还可包括:
状态修改单元406,可被配置为:
在所述源库中与该第一同步记录对应的第一业务数据被操作时,将所述第一同步记录中的状态标志修改为第一目标值,并且在针对该第一业务数据的同步操作被执行完毕时,将所述第一同步记录中的状态标志修改为第二目标值,其中,所述第二目标值(如:FINISHED)表明所述执行状态为执行结束。
在一可选的实施例中,所述数据同步单元404可被配置为:
如果所述源库中不存在与所述业务数据ID对应的第一业务数据、且所述目标库中存在的与所述业务数据ID对应的第二业务数据,删除所述目标库中存在的第二业务数据;
如果所述源库中存在与所述业务数据ID对应的第一业务数据、且所述目标库中不存在的与所述业务数据ID对应的第二业务数据,在所述目标库中插入所述第一业务数据;
如果所述源库中存在与所述业务数据ID对应的第一业务数据、且所述目标库中存在的与所述业务数据ID对应的第二业务数据,将所述第二业务数据更新为所述第一业务数据。
在一可选的实施例中,所述装置400还可包括:
版本更新单元405,可被配置为:
在以所述源库为基准对所述目标库执行针对所述业务数据ID的同步操作之后,将所述第一同步记录中的与所述业务数据ID对应的第一版本标识和所述第二同步记录表中的与所述业务数据ID对应的第二版本标识修改成一致。
如图6所示,本说明书一个或多个实施例提供了一种电子设备(如:服务器、终端等),该电子设备可以包括处理器、内部总线、网络接口、存储器(包括内存以及非易失性存储器),当然还可能包括其他业务所需要的硬件。处理器可为中央处理单元(CPU)、处理单元、处理电路、处理器、专用集成电路(ASIC)、微处理器或可执行指令的其他处理逻辑中的一个或多个实例。处理器从非易失性存储器中读取对应的程序到内存中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
在一种实施例中,处理器可以被配置为:
在数据同步任务的执行时间到来时,确定源库中待同步的至少一个业务数据ID;
针对每一业务数据ID,在与源库对应的第一同步记录表中查找与所述业务数据ID对应的第一同步记录,所述第一同步记录包含与所述业务数据ID对应的第一版本标识;
若查找到所述第一同步记录,在与目标库对应的第二同步记录表中查找所述业务数据ID对应的第二同步记录,所述第二同步记录包含与所述业务数据ID对应的第二版本标识;
如果没有查找到所述第二同步记录,或查找到的第二同步记录中包含的第二版本标识表明的版本晚于所述第一版本标识表明的版本,以所述源库为基准对所述目标库执行针对所述业务数据ID的同步操作。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同/相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例、装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书一个或多个实施例时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书一个或多个实施例的实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书一个或多个实施例的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例的权利要求范围之内。