数据写入方法和装置的制造方法

文档序号:10686788阅读:171来源:国知局
数据写入方法和装置的制造方法
【专利摘要】本发明涉及一种数据写入方法和装置。所述方法包括步骤:接收第一数据的写入请求,将所述第一数据写入缓存区;在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备;若无,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备;在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。本发明在保证数据可靠性的前提之下提高了并发和降低了延时。
【专利说明】
数据写入方法和装置
技术领域
[0001]本发明涉及计算机技术领域,特别是涉及一种数据写入方法和数据写入装置。
【背景技术】
[0002]随着互联网产品的用户量和数据量的增大,在往存储设备(磁盘等)中写入数据时,对写入性能要求越来越高。目前数据写入的方法一般包括两种:
[0003]1、使用先进先出的线性内存队列,一个线程负责每隔一段时间从线性内存队列中读取数据写入存储设备中的文件,其它多个线程并发处理业务请求,往线性内存队列中增加数据,一旦数据插入线性内存队列,则告知用户数据写入成功。该方法可以保证数据的高并发和低延时,但是当线性内存队列中还存在未写入到存储设备的数据时,如果服务突然崩溃,则线性内存队列中的数据会丢失,而由于这些数据已经告知用户写入成功,但是实际上未被真正写入到存储设备,所以无法保证数据的可靠性。
[0004]2、每个业务线程自行处理写文件,当数据被真正写入到存储设备中的文件之后,告知用户写入成功。该方法可以保证数据的可靠性,但是由于每个业务线程单独处理写文件,每写一次就涉及到一次存储设备的访问操作,而存储设备的访问是非常耗时的操作,所以会加长用户请求的延时,从而降低了并发。

【发明内容】

[0005]基于此,有必要针对上述问题,提供一种数据写入方法和装置,既能够保证数据的可靠性,又可以保证数据的高并发和低延时。
[0006]为了达到上述目的,本发明采取的技术方案如下:
[0007]—种数据写入方法,包括步骤:
[0008]接收第一数据的写入请求,将所述第一数据写入缓存区;
[0009]在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备;
[0010]若无,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备;
[0011]在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。
[0012]一种数据写入装置,包括:
[0013]写入请求接收模块,用于接收第一数据的写入请求,将所述第一数据写入缓存区;
[0014]判断模块,用于在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备;
[0015]数据写入模块,用于在没有线程正将所述缓存区的数据写入存储设备时,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备;
[0016]消息发送模块,用于在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。
[0017]本发明数据写入方法和装置,多个线程并发处理业务请求,往缓存区中增加数据,一旦该多个线程中的某一个线程将数据成功写入缓存区,即检测是否有线程正在对缓冲区执行刷新到存储设备的操作,若没有,则该线程直接将所有的数据写入存储设备,然后告知用户和其它线程数据写入成功。由于本发明采取缓冲区和多个线程并发处理的模式,所以可以保证数据的高并发和低延时;由于本发明往存储设备写入数据的线程为往缓冲区写入数据的多个线程中的某一个线程,一旦数据成功写入缓冲区则立即将缓冲区的所有数据写入磁盘,无需像现有技术中的第三者线程一样等待定时时间的到达,并且本发明在将数据成功写入存储设备后才告知用户数据写入成功,所以保证了数据的可靠性。
【附图说明】
[0018]图1为本发明数据写入方法实施例的流程示意图;
[0019]图2为本发明缓存区具体实施例的示意图;
[0020]图3为本发明数据写入装置实施例一的结构示意图;
[0021 ]图4为本发明写入请求接收模块实施例的结构示意图;
[0022]图5为本发明数据写入装置实施例二的结构示意图;
[0023]图6为本发明数据写入模块实施例的结构示意图。
【具体实施方式】
[0024]为了更好地理解本发明,下面对本发明涉及的几个概念进行简单介绍:
[0025]数据可靠性:只要用户写入数据的请求得以成功返回,则该数据必然不会丢失,SP使发生服务崩溃或断电,数据也不会丢失,该功能要求称之为可靠性;
[0026]线程:为程序执行流的最小单元,每个线程都是作为利用CPU(Centra IProcessing Unit,中央处理器)的基本单位,是花费最小开销的实体;
[0027]多线程:在单个程序中同时运行多个线程完成不同的工作;
[0028]并发:一个时间段中多个任务同时执行;
[0029]延时:用户发起请求到收到回复之间的时间。
[0030]下面结合附图及较佳实施例,对本发明的技术方案,进行清楚和完整的描述。需要说明的是,本发明旨在如何提高单机性能,并不涉及集群的解决方案;文中出现的第一、第二和第三等字眼仅用于区分各技术特征,并不对各技术特征的数量和顺序等加以限定。[0031 ]如图1所示,一种数据写入方法,包括步骤:
[0032]S110、接收第一数据的写入请求,将所述第一数据写入缓存区;
[0033]S120、在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备;
[0034]S130、若无,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备;
[0035]S140、在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。
[0036]本发明方法为一个线程执行的步骤,以下用当前线程表示。本发明在保证数据可靠性的前提之下提高了并发和降低了延时,为了更好地理解本发明方案,下面对各个步骤的实施过程进行详细介绍。
[0037]在步骤SllO中,当前线程接收请求调用方(例如用户)的数据写入请求,需要写入数据到存储设备,存储设备可以为磁盘等。
[0038]本发明定义了与现有技术中的线性内存队列不同的数据结构,该数据结构用于在内存中存储已经接收到需要被写入存储设备但是还未被写入到存储设备的数据,为一环形队列。在初始化时即设定缓冲区的大小,此后该缓冲区的大小不能修改。在缓冲区中写入数据时可以逆时针写入,也可以顺时针写入。为了更好地理解本发明定义的数据结构,下面以逆时针写入为例进行说明。
[0039]如图2所示,所述缓冲区包括第一指针M、第二指针FS、第三指针FE和状态标识Flush。下面对各个指针和状态标识的功能进行简单介绍。
[0040]指针BE:用于标识所述缓存区中待写入数据的位置,也即写入缓存区的数据从指针BE所指示的位置开始插入。当向缓冲区中插入数据时,指针BE的位置将逆时针移动,一直移动到数据插入完成的位置。
[0041]指针FS和指针FE:用于标识缓冲区中的数据正在被写入存储设备的状况。
[0042]状态标识Flush:用于标识当前是否正将所述缓存区的数据写入存储设备,即当前是否正在对缓冲区做写入到存储设备的操作。可以用标识值“true”和“False”表示当前是否正在对缓冲区做写入到存储设备的操作,如果是,则该标识值为“true”,反之为“False”。也可以用其它标识值表示当前是否正在对缓冲区做写入到存储设备的操作,例如“I”和“O”等,本发明并不对此做出限定。
[0043]所述第一指针和所述第二指针之间的区域为未存储数据的区域,即从指针BE开始沿着逆时针方向到指针FS的这段区域表示还未存储数据,该缓冲区还可以继续被插入数据。如果沿逆时针方向指针BE越过或等于指针FS,则表示缓冲区空间不足。
[0044]所述第二指针和所述第三指针之间的区域为数据正在写入存储设备的区域,即从指针FS沿逆时针方向到指针FE的区域,此区域内的数据正在被写入到存储设备。如果FS->FE的数据正在写入存储设备,则状态标识为“true”,否则状态标识为“False”。
[0045]所述第三指针和所述第一指针之间的区域为数据还未写入存储设备的区域,即从指针FE沿逆时针方向到指针BE的区域,此区域的数据还未被写入存储设备。
[0046]在初始化此数据结构时,状态标识Flush被设置为false,指针FS、指针FE和指针BE均指向最初位置O。
[0047]在一个实施例中,接收第一数据的写入请求,将所述第一数据写入缓存区的步骤可以包括:
[0048]S1101、接收第一数据的写入请求,检测所述缓冲区是否有未存储数据的区域;
[0049]当前线程接收请求调用方的写入数据的请求,需要写入数据到存储设备,如图2所示,首先判断指针BE沿着逆时针方向到指针FS之间是否还有空间。
[0050]S1102、若有,将所述第一数据写入所述第一指针所指向的当前位置,然后将所述第一指针由当前位置移动到新位置,其中新位置与当前位置之间的区域存储的数据为所述第一数据;
[0051 ]如果有,则说明缓冲区还能插入数据,将数据放置到BE所指向的位置,然后将BE移动到下一个位置。
[0052]S1103、若没有,返回第一数据写入失败的消息。
[0053]如果没有,则说明缓冲区已满,系统不能接收请求,返回请求调用方“失败”的消息,结束流程。
[0054]在步骤S120和步骤S130中,当前线程将第一数据成功写入缓存区后,可以根据状态标识Flush判断当前有无线程在对缓冲区做“刷新到存储设备”的动作,亦即判断状态标识Flush是否为“True”。
[0055]如果状态标识Flush为“True”,说明已有线程在对缓冲区做“刷新到存储设备”的动作,为了不引起存储设备的争用,在一个实施例中,判断是否有线程正将所述缓存区的数据写入存储设备之后,还可以包括步骤:若有线程正将所述缓存区的数据写入存储设备,将所述第一数据对应的线程设置为阻塞状态。也即是将当前线程阻塞,等待被唤醒,当前线程只是将数据插入到缓冲区,而不将数据写入存储设备。
[0056]如果状态标识Flush为“False”,说明当前没有线程在对缓冲区做“刷新到存储设备”的动作,则当前线程将缓冲区的未写入所述存储设备的数据一次性写入存储设备。在一个实施例中,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备的步骤可以包括:
[0057]S1301、将所述第三指针移动至所述第一指针所指向的新位置,并设置所述状态标识为当前正将所述缓存区的数据写入存储设备;
[0058]将指针FE设置为指针BE所指向的新位置,设置状态标识flush为“true”,表示已经有线程在对缓冲区做“刷新到存储设备”的动作。
[0059]S1302、将所述第二指针和移动后的所述第三指针之间的区域的数据写入所述存储设备。
[0060]从指针FS沿着逆时针方向到指针FE的区域为本次需要被刷新到存储设备的区域,使用文件API (Applicat1n Programming Interface,应用程序编程接口)将指针FS到指针FE的数据写往存储设备。
[0061]在步骤S140中,为了保证写入数据的可靠性,写文件的函数(write)必须是在数据真正被写到磁盘之后,才返回给请求调用方。
[0062]当前线程将所有数据成功写入存储设备后,设置状态标识Flush为“false”,同时指针FS移动到指针FE的位置,指针FE移动到指针BE的位置。如果指针FS和指针FE不相等,则说明有数据需要写入,则顺序写该区间段内的数据。
[0063]当前线程将所有数据成功写入存储设备后,获得刚才被写入存储设备的FS到FE区域中数据(除第一数据之外)所对应的线程,这些线程目前处于阻塞状态,唤醒他们,即通知对应的线程之前他们在缓冲区中所放置的数据已被成功写入存储设备,被唤醒的线程接收到该通知后,结束请求处理,并告知请求调用方写入数据成功。同时当前线程结束请求处理,告知请求调用方写入数据成功。本发明保证了数据的可靠性,同时减少了存储设备的操作次数,提高了并发,降低了延时。
[0064]基于同一发明构思,本发明还提供一种数据写入装置,下面结合附图对本发明装置的【具体实施方式】做详细描述。
[0065]如图3所示,一种数据写入装置,包括:
[0066]写入请求接收模块110,用于接收第一数据的写入请求,将所述第一数据写入缓存区;
[0067]判断模块120,用于在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备;
[0068]数据写入模块130,用于在没有线程正将所述缓存区的数据写入存储设备时,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备;
[0069]消息发送模块140,用于在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。
[0070]本发明在保证数据可靠性的前提之下提高了并发和降低了延时,为了更好地理解本发明方案,下面对本发明装置的各个模块的功能进行详细介绍。
[0071]首先对本发明定义的数据结构进行简单介绍。本发明定义的数据结构为一环形队列。在缓冲区中写入数据时可以逆时针写入,也可以顺时针写入。为了更好地理解本发明定义的数据结构,下面以逆时针写入为例进行说明。
[0072]如图2所示,所述缓冲区包括第一指针M、第二指针FS、第三指针FE和状态标识Flush。下面对各个指针和状态标识的功能进行简单介绍。
[0073]指针BE:用于标识所述缓存区中待写入数据的位置,也即写入缓存区的数据从指针BE所指示的位置开始插入。当向缓冲区中插入数据时,指针BE的位置将逆时针移动,一直移动到数据插入完成的位置。
[0074]指针FS和指针FE:用于标识缓冲区中的数据正在被写入存储设备的状况。
[0075]状态标识Flush:用于标识当前是否正将所述缓存区的数据写入存储设备,即当前是否正在对缓冲区做写入到存储设备的操作。可以用标识值“true”和“False”表示当前是否正在对缓冲区做写入到存储设备的操作,如果是,则该标识值为“true”,反之为“False”。也可以用其它标识值表示当前是否正在对缓冲区做写入到存储设备的操作,例如“I”和“O”等,本发明并不对此做出限定。
[0076]所述第一指针和所述第二指针之间的区域为未存储数据的区域,即从指针BE开始沿着逆时针方向到指针FS的这段区域表示还未存储数据,该缓冲区还可以继续被插入数据。如果沿逆时针方向指针BE越过或等于指针FS,则表示缓冲区空间不足。
[0077]所述第二指针和所述第三指针之间的区域为数据正在写入存储设备的区域,即从指针FS沿逆时针方向到指针FE的区域,此区域内的数据正在被写入到存储设备。如果FS->FE的数据正在写入存储设备,则状态标识为“true”,否则状态标识为“False”。
[0078]所述第三指针和所述第一指针之间的区域为数据还未写入存储设备的区域,即从指针FE沿逆时针方向到指针BE的区域,此区域的数据还未被写入存储设备。
[0079]在初始化此数据结构时,状态标识Flush被设置为false,指针FS、指针FE和指针BE均指向最初位置O。
[0080]在一个实施例中,如图4所示,所述写入请求接收模块110可以包括:
[0081]空间检测单元1101,用于接收第一数据的写入请求,检测所述缓冲区是否有未存储数据的区域;如图2所示,即判断指针BE沿着逆时针方向到指针FS之间是否还有空间;
[0082]第一数据写入单元1102,用于在有未存储数据的区域时,将所述第一数据写入所述第一指针所指向的当前位置,然后将所述第一指针由当前位置移动到新位置,其中新位置与当前位置之间的区域存储的数据为所述第一数据;即将数据放置到BE所指向的位置,然后将BE移动到下一个位置;
[0083]失败消息返回单元1103,用于在没有未存储数据的区域时,返回第一数据写入失败的消息。
[0084]所述判断模块120在第一数据成功写入缓存区后,可以根据状态标识Flush判断当前有无线程在对缓冲区做“刷新到存储设备”的动作,亦即判断状态标识Flush是否为
Urr.”
Irue ο
[0085]如果状态标识Flush为“True”,说明已有线程在对缓冲区做“刷新到存储设备”的动作,为了不引起存储设备的争用,在一个实施例中,如图5所示,本发明装置还可以包括与所述判断模块120相连的线程阻塞模块150,所述线程阻塞模块150用于在有线程正将所述缓存区的数据写入存储设备时,将所述第一数据对应的线程设置为阻塞状态。
[0086]如果状态标识Flush为“False”,说明当前没有线程在对缓冲区做“刷新到存储设备”的动作,数据写入模块130将缓冲区的未写入所述存储设备的数据一次性写入存储设备。在一个实施例中,如图6所示,所述数据写入模块130可以包括:
[0087]设置单元1301,用于将所述第三指针移动至所述第一指针所指向的新位置,并设置所述状态标识为当前正将所述缓存区的数据写入存储设备;即将指针FE设置为指针BE所指向的新位置,设置状态标识flush为“true”,
[0088]数据写入单元1302,用于将所述第二指针和移动后的所述第三指针之间的区域的数据写入所述存储设备;从指针FS沿着逆时针方向到指针FE的区域为本次需要被刷新到存储设备的区域,使用文件API将指针FS到指针FE的数据写往存储设备。
[0089]当前线程将所有数据成功写入存储设备后,消息发送模块140设置状态标识Flush为“false”,同时指针FS移动到指针FE的位置,指针FE移动到指针BE的位置。
[0090]当前线程将所有数据成功写入存储设备后,消息发送模块140获得刚才被写入存储设备的FS到FE区域中数据(除第一数据之外)所对应的线程,这些线程目前处于阻塞状态,唤醒他们,即通知对应的线程之前他们在缓冲区中所放置的数据已被成功写入存储设备,被唤醒的线程接收到该通知后,结束请求处理,并告知请求调用方写入数据成功。同时当前线程结束请求处理,告知请求调用方写入数据成功。本发明保证了数据的可靠性,同时减少了存储设备的操作次数,提高了并发,降低了延时。
[0091]以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0092]以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
【主权项】
1.一种数据写入方法,其特征在于,包括步骤: 接收第一数据的写入请求,将所述第一数据写入缓存区; 在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备; 若无,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备; 在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。2.根据权利要求1所述的数据写入方法,其特征在于,判断是否有线程正将所述缓存区的数据写入存储设备之后,还包括步骤: 若有线程正将所述缓存区的数据写入存储设备,将所述第一数据对应的线程设置为阻塞状态。3.根据权利要求1或2所述的数据写入方法,其特征在于,所述缓存区包括第一指针、第二指针、第三指针和状态标识;所述第一指针用于标识所述缓存区中待写入数据的位置,所述状态标识用于标识当前是否正将所述缓存区的数据写入存储设备,所述第一指针和所述第二指针之间的区域为未存储数据的区域,所述第二指针和所述第三指针之间的区域为数据正在写入存储设备的区域,所述第三指针和所述第一指针之间的区域为数据还未写入存储设备的区域。4.根据权利要求3所述的数据写入方法,其特征在于,接收第一数据的写入请求,将所述第一数据写入缓存区的步骤包括: 接收第一数据的写入请求,检测所述缓冲区是否有未存储数据的区域; 若有,将所述第一数据写入所述第一指针所指向的当前位置,然后将所述第一指针由当前位置移动到新位置,其中新位置与当前位置之间的区域存储的数据为所述第一数据;若没有,返回第一数据写入失败的消息。5.根据权利要求3所述的数据写入方法,其特征在于,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备的步骤包括: 将所述第三指针移动至所述第一指针所指向的新位置,并设置所述状态标识为当前正将所述缓存区的数据写入存储设备; 将所述第二指针和移动后的所述第三指针之间的区域的数据写入所述存储设备。6.一种数据写入装置,其特征在于,包括: 写入请求接收模块,用于接收第一数据的写入请求,将所述第一数据写入缓存区; 判断模块,用于在所述第一数据成功写入所述缓存区后,判断是否有线程正将所述缓存区的数据写入存储设备; 数据写入模块,用于在没有线程正将所述缓存区的数据写入存储设备时,将所述缓存区中的所有未写入所述存储设备的数据写入所述存储设备; 消息发送模块,用于在所有未写入所述存储设备的数据成功写入所述存储设备后,分别通知被写入所述存储设备的数据各自对应的线程,其对应的数据已成功写入所述存储设备。7.根据权利要求6所述的数据写入装置,其特征在于,还包括与所述判断模块相连的线程阻塞模块,所述线程阻塞模块用于在有线程正将所述缓存区的数据写入存储设备时,将所述第一数据对应的线程设置为阻塞状态。8.根据权利要求6或7所述的数据写入装置,其特征在于,所述缓存区包括第一指针、第二指针、第三指针和状态标识;所述第一指针用于标识所述缓存区中待写入数据的位置,所述状态标识用于标识当前是否正将所述缓存区的数据写入存储设备,所述第一指针和所述第二指针之间的区域为未存储数据的区域,所述第二指针和所述第三指针之间的区域为数据正在写入存储设备的区域,所述第三指针和所述第一指针之间的区域为数据还未写入存储设备的区域。9.根据权利要求8所述的数据写入装置,其特征在于,所述写入请求接收模块包括: 空间检测单元,用于接收第一数据的写入请求,检测所述缓冲区是否有未存储数据的区域; 第一数据写入单元,用于在有未存储数据的区域时,将所述第一数据写入所述第一指针所指向的当前位置,然后将所述第一指针由当前位置移动到新位置,其中新位置与当前位置之间的区域存储的数据为所述第一数据; 失败消息返回单元,用于在没有未存储数据的区域时,返回第一数据写入失败的消息。10.根据权利要求8所述的数据写入装置,其特征在于,所述数据写入模块包括: 设置单元,用于将所述第三指针移动至所述第一指针所指向的新位置,并设置所述状态标识为当前正将所述缓存区的数据写入存储设备; 数据写入单元,用于将所述第二指针和移动后的所述第三指针之间的区域的数据写入所述存储设备。
【文档编号】G06F3/06GK106055281SQ201610509122
【公开日】2016年10月26日
【申请日】2016年6月29日
【发明人】陈仕明
【申请人】广州华多网络科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1