一种数据存储方法及装置与流程

文档序号:11654746阅读:200来源:国知局
一种数据存储方法及装置与流程

本申请涉及计算机技术领域,尤其涉及一种数据存储方法及装置。



背景技术:

随着网络技术的不断发展,数据的安全性已经越来越被人们所重视,为了保证存储的数据的安全性,通常可将需要存储到数据库中的数据进行乱序存储。

例如,为了保证用来校验登录用户的验证码,不被除该登录用户以外的人获知,因此,可采用随机码作为验证码,在现有技术中,生成随机码的方式大致分为两种方式。第一种生成方式为:使用随机码生成器直接生成随机码。第二种生成方式为:预先随机生成随机码,并将这些随机码在内存中进行乱序处理,将乱序处理后的各随机码存储到数据库中,后续,在需要使用验证码时,直接从数据库按随机码的存储顺序,取出随机码。即,上述第二种生成方式就是基于乱序存储的生成方式。

具体的,在第二种方式中,对预先生成的随机码进行乱序处理时,通常会将预先生成的各随机码添加到一个数据文件中,再将包含各随机码的数据文件在内存中进行乱序处理。

但是,在实际应用中,针对第二种生成方式,由于内存的空间是有限的,不可能无限的扩大,当要进行乱序处理的上述数据文件的数据量超过内存空间容量时,则无法对该数据文件进行乱序处理。



技术实现要素:

本申请实施例提供一种数据存储方法及装置,用以解决现有技术中当要进行乱序处理的包含随机码的数据文件的数据量超过内存空间容量时,则无法对 该数据文件进行乱序处理的问题。

本申请实施例提供的一种数据存储方法,所述方法包括:

服务器获取数据文件;

将所述数据文件拆分成至少两个子文件,其中,每个子文件的数据量均不大于所述服务器的内存空间容量;

对拆分后的每个子文件分别进行乱序处理;

将乱序处理后的每个子文件存储到数据库中。

本申请实施例提供的一种数据存储装置,所述装置包括:

拆分模块,用于将所述数据文件拆分成至少两个子文件,其中,每个子文件的数据量均不大于所述装置的内存空间容量;

处理模块,用于对拆分后的每个子文件分别进行乱序处理;

存储模块,用于将乱序处理后的每个子文件存储到数据库中。

本申请实施例提供一种数据存储方法及装置,该方法由服务器获取数据文件,并将该数据文件拆分成至少两个子文件,其中,每个子文件的数据量均不大于该服务器的内存空间容量,对拆分后的每个子文件分别进行乱序处理,将乱序处理后的每个子文件存储到数据库中。通过上述方法,即使进行乱序处理的包含随机码的数据文件的数据量超过内存空间容量时,也可将数据文件进行拆分,并对拆分后的子文件进行乱序,最后存储到数据库中。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本申请实施例提供的数据存储过程示意图;

图2为本申请实施例提供的数据存储装置结构示意图。

具体实施方式

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

图1为本申请实施例提供的数据存储过程,具体包括以下步骤:

s101:服务器获取数据文件。

在实际应用中,为了保证数据的安全性,在将数据存储到数据库之前,需要对数据进行乱序处理。而在对数据进行乱序处理时,通常会将数据添加到一个数据文件中,再将包含数据的数据文件在内存中进行乱序处理,如,对预先生成的随机码进行乱序处理时,通常将预先生成的各随机码添加到一个数据文件中,再将包含各随机码的数据文件在内存中进行乱序。

因此,本申请中,在将数据乱序存储到数据库的整个过程中,首先,服务器需要获取数据文件,所述数据文件中包含要进行乱序存储的数据,所述数据可以是任何数据,如,随机码等。

例如,假设服务器为用户提供口令红包的业务,服务器在生成向其他用户发送的口令红包的同时,可自动为生成的口令红包附加一个随机码,其他用户需要输入口令红包中的随机码才可以获取口令红包中的金额,因此,服务器需要预先将进行乱序处理的大量随机码存储到数据库中。

服务器在将进行乱序处理的大量随机码存储到数据库的过程中,首先,服务器需要获取预先生成包含大量随机码的数据文件,为了方便后续能够阐述本申请中的方案,因此,在该例子中,假设数据文件中所包含的随机码由前向后为:数字1~9。

s102:将所述数据文件拆分成至少两个子文件,其中,每个子文件的数据量均不大于所述服务器的内存空间容量。

由于整个对数据文件进行乱序处理的过程是在服务器的内存中进行的,而服务器的内存是有限的,这也导致了有可能出现获取到的整个数据文件的数据量超过服务器的内存空间容量,从而无法将整个数据文件一次性放到内存中,因此,在本申请中,可以采用将数据文件拆分成至少两个子文件的方式,使得每个子文件的数据量均不大于服务器的内存空间容量,后续,可对每个子文件分别进行乱序处理。

在此需要说明的是,在拆分成至少两个子文件时,每个子文件的数据量可能相等,也可能不等,只要每个子文件的数据量均不大于服务器的内存空间容量即可。

考虑到在实际应用中,为了尽可能多的利用服务器的内存空间容量,因此,在本申请中,在将数据文件拆分成至少两个子文件时,可以采用以下方式来进行拆分:将该数据文件拆分成包含的数据量相同的至少两个子文件,其中,每个子文件的数据量均等于服务器的内存空间容量。

延续上例,假设服务器的内存空间容量只能一次性对3个数字字符数据进行处理,服务器采用的拆分方式为:将数据文件拆分成包含的数据量相同,且均等于服务器的内存空间容量的至少两个子文件,因此,服务器在获取到预先生成包含数字1~9的数据文件后,直接将该数据文件拆分成包含数字1到数字3的子文件1、包含数字4到数字6的子文件2、包含数字7到数字9的子文件3。

s103:对拆分后的每个子文件分别进行乱序处理。

在本申请实施例中,服务器在将数据文件拆分成至少两个子文件后,分别对每个子文件进行乱序处理。

进一步的,本申请提供了一种具体的乱序处理方式:

针对每个子文件,将该子文件中的数据进行分组,将分组后的数据组进行排序,按排序先后顺序,依次针对每个数据组,从该数据组后的各数据组中随机抽取出一个数据组,作为调换组,并将调换组与该数据组在该子文件中的排 序位置进行互换。其中,一个数据组可包含多个数据(如,567),也可只包含一个数据(如,3)。

另外,基于上述本申请提供的具体的乱序处理方式,本申请还提供了实现该乱序处理方式的代码:

在此需要说明的是,以上提到的乱序处理的方式并不是唯一的,只要能够让数据文件中的数据在排序时不再按照某一有规律的顺序排序,而是随机排序即可,在此不再一一赘述。

延续上例,假设采用步骤s103中涉及到的乱序处理方式,因此,服务器将子文件1中的每个数字字符单独作为一个数据组,即,将子文件1中的数字字符1~3分别作为数据组1~3,假设当前该子文件中各数据组的排序为:数据组1、数据组2、数据组3,因此,服务器按照排序先后顺序,针对处于最前端位置的数据组1,从数据组1后面的数据组2、数据组3中随机抽取一个数据组,假设随机抽取的数据组为数据组3,将数据组3作为调换组,并且将数据组3与数据组1在子文件1中的排序位置进行互换,即,此时该子文件1中各数据组的排序为:数据组3、数据组2、数据组1。再针对中间位置的数据组2,将数据组2后面的数据组1作为调换组,并且将数据组2与数据组1在子文件1中的排序位置进行互换,即,此时该子文件1中各数据组的排序为:数据组 3、数据组1、数据组2,最终得到的乱序结果为:312。类似的,子文件2和子文件3也通过同种方式进行乱序,分别得到的乱序结果为:564和978。

s104:将乱序处理后的每个子文件存储到数据库中。

继续延用上例,服务器在将子文件1、子文件2、子文件3分别进行乱序处理后,可以直接将子文件1、子文件2、子文件3存储到的数据库中。

通过上述方法,即使进行乱序处理的包含随机码的数据文件的数据量超过内存空间容量时,也可将数据文件进行拆分,并对拆分后的子文件进行乱序,最后存储到数据库中。

但是,考虑到实际应用中,直接将每个子文件存储到的数据库中,会导致乱序的随机性降低,也就是说,每个子文件中包含的数据只是在该子文件所包含的数据范围之内进行了乱序,即使子文件中包含的数据进行乱序,而子文件中包含的数据的数据范围依然没变,在该子文件中不会出现其他子文件中包含的数据,导致随机性的降低,如,将数字1到数字9000分别拆分成包含数字1到数字3000的子文件1、包含数字3001到数字6000的子文件2、包含数字6001到数字9000的子文件3,子文件1即使进行了乱序处理,但是子文件1中包含的数据的数据范围依然是[1,3000],在子文件1中取到的数字只能是[1,3000],不会出现[3001,9000]中的任何数据。

为了提高进行乱序处理后数据的随机性,因此,在本申请中,可以将乱序处理后的各子文件合并成乱序文件,通过合并的过程,将各子文件包含的数据再次进行乱序,这样合并后的乱序文件融合了所有子文件包含的数据的数据范围,如,将上例中的子文件1、子文件2、子文件3进行合并后,合并后的乱序文件包含的数据的数据范围为[1,9000],也就是说,从乱序文件中可以取到[1,9000]中的任何一个数字,提高了乱序处理后数据的随机性。

进一步的,对于上述提到的将乱序处理后的各子文件合并成乱序文件,本申请提供了一种具体的实施方式,具体如下:

从乱序处理后的每个子文件中,随机确定出任意一个子文件,并提取出随 机确定出的该子文件中未添加到乱序文件、且排序位置最前的数据,将提取出的数据添加到乱序文件中,直至将每个子文件中的所有数据添加到乱序文件中为止。

延续步骤s103的例子,假设将乱序处理后的子文件1~3合并成乱序文件,采用上述提到的实施方式,服务器从乱序处理后的子文件1~3中,随机确定出任意一个子文件,假设确定出的子文件为子文件1,则提取出子文件1中未添加到乱序文件b的数据(即,312)、且排序位置最前的数据,即,数字3,并将提取出来的数据添加到乱序文件b中,即,3;

继续从乱序处理后的子文件1~3中,随机确定出任意一个子文件,假设确定出的子文件为子文件3,则提取出子文件3中未添加到乱序文件b的数据(即,978)、且排序位置最前的数据,即,数字9,并将提取出来的数据添加到乱序文件b中,即,39;

继续从乱序处理后的子文件1~3中,随机确定出任意一个子文件,假设确定出的子文件为子文件1,则提取出子文件1中未添加到乱序文件b的数据(即,12)、且排序位置最前的数据,即,数字1,并将提取出来的数据添加到乱序文件b中,即,391;

直到所有子文件中的所有数据均已添加到乱序文件中,此时,得到的最终乱序文件为:391675248。

在此需要说明的是,以上提到的将乱序处理后的各子文件合并成乱序文件的方式并不是唯一的,只要能够在将各子文件合并成乱序文件时,再次打乱各子文件中数据之间的顺序即可,在此不再一一赘述。

进一步的,服务器在将乱序处理后的各子文件合并成乱序文件后,可按该乱序文件中各数据的排序先后顺序,读取乱序文件中的数据,每当读取的数据的数据量达到预设的数据量时,通过预先建立的线程池中处于空闲状态的线程,将该读取的数据写入到数据库中,并继续读取该乱序文件中的数据,直至将该乱序文件中的所有数据写入到数据库中为止,所述预设的数据量是根据线程池 中每个线程的运行处理能力来定的,只要预设的数据量不超过线程运行处理的能力即可。

例如,假设预设的数据量为80个,线程池中的线程的数量为100个,服务器按乱序文件中各数据的排序先后顺序,读取乱序文件中的数据,当读取的数据量达到80个时,通过预先建立的包含100个线程的线程池中处于空闲状态的线程,将该读取的数据写入到数据库中,服务器继续按排序先后顺序读取乱序文件中的数据,当再次读取的数据量达到80个时,再通过空闲状态的线程,将该再次读取的80个数据写入到数据库中,直到将该乱序文件中的所有数据写入到数据库中为止。

另外,在本申请中,服务器也可以在按该乱序文件中各数据的排序先后顺序,读取乱序文件中的数据后,将读取的数据添加到缓存中,每当缓存中的数据量达到预设的数据量时,通过预先建立的线程池中处于空闲状态的线程,将缓存中的数据写入到数据库中,并立刻清空缓存,再继续读取该乱序文件中的数据直至将该乱序文件中的所有数据写入到数据库中为止。

考虑到实际应用中,有可能出现服务器在将数据写入到数据库的过程中,数据库突然坏掉或者停止运行的情况,因此,在本申请中,服务器可实时监测线程与数据库的运行状况,当监测到该线程未成功将数据写入到数据库中时,记录当前读取乱序文件的数据的排序位置,作为当前位置,根据当前线程池中处于运行状态的线程的数量以及上述提到的预设的数据量,确定出待恢复的数据的数据量(这是由于服务器并不知道是哪个数据成功写入到数据库中,哪个数据没有成功写入到数据库中,但是,未成功写入到数据库中的数据的数据量最多不会超过服务器将运行状态的线程的数量乘以预设的数据量),根据确定出的待恢复的数据的数据量以及记录下的当前位置,确定当前位置与该待恢复的数据的数据量的差值,作为恢复位置,在该乱序文件中,按该乱序文件中各数据的排序先后顺序,从排序位置为恢复位置处,重新开始读取数据,并通过该线程池中处于空闲状态的线程,将读取的数据写入到数据库中。其中,根据 当前线程池中处于运行状态的线程的数量以及上述提到的预设的数据量,确定出待恢复的数据的数据量的方式具体可以为:直接将当前线程池中处于运行状态的线程的数量乘以上述提到的预设的数据量,将计算出的结果确定为待恢复的数据的数据量。当然,也可以是,直接将当前线程池中所有线程的数量乘以上述提到的预设的数据量,将计算出的结果确定为待恢复的数据的数据量。

例如,服务器每读取到数据的数据量达到100个时,通过线程池中处于空闲状态的线程将100个数据写入到数据库中,假设服务器监测到数据库突然停止运转,记录下当前读取乱序文件b的数据的排序位置3000,将排序位置3000作为当前位置,假设处于运行状态的线程有3个,服务器根据当前线程池中处于运行状态的线程的数量(即,3个)以及预设的数据量(即,100个),确定出待恢复的数据的数据量为300,根据确定出的待恢复的数据的数据量300以及记录下的当前位置3000,确定当前位置与该待恢复的数据的数据量的差值为2700,将2700作为恢复位置,从排序位置为2700处,重新开始读取数据,并通过该线程池中处于空闲状态的线程,将读取的数据写入到数据库中。

在此需要说明的是,上述过程中是由于数据库出现了问题,导致未成功将数据写入到数据库中的,但是,实际应用中,线程池中的某个线程也可能在运行的过程中出现问题,也会导致未成功将数据写入到数据库中,因此,当某个或几个线程出现问题时,也可执行上述重新写入数据的过程。

最后,服务器在将乱序文件中的所有数据都写入到数据库中后,为了节省服务器的资源,可以将上述涉及到的乱序处理的各子文件以及乱序文件进行清除。

以上为本申请实施例提供的数据存储方法,基于同样的思路,本申请实施例还提供一种数据存储装置,如图2所示。

图2为本申请实施例提供的数据存储装置结构示意图,所述装置包括:

获取模块201,用于获取数据文件;

拆分模块202,用于将所述数据文件拆分成至少两个子文件,其中,每个 子文件的数据量均不大于所述装置的内存空间容量;

处理模块203,用于对拆分后的每个子文件分别进行乱序处理;

存储模块204,用于将乱序处理后的每个子文件存储到数据库中。

所述拆分模块202具体用于,将所述数据文件拆分成包含的数据量相同的至少两个子文件。

所述处理模块203具体用于,针对每个子文件,将该子文件中的数据进行分组,将分组后的数据组进行排序,按排序先后顺序,依次针对每个数据组,从该数据组后的各数据组中随机抽取出一个数据组,作为调换组,并将调换组与该数据组在该子文件中的排序位置进行互换。

所述存储模块204具体用于,将乱序处理后的各子文件合并成乱序文件,按所述乱序文件中各数据的排序先后顺序,读取所述乱序文件中的数据,每当读取的数据的数据量达到预设的数据量时,通过预先建立的线程池中处于空闲状态的线程,将所述读取的数据写入到数据库中,并继续读取所述乱序文件中的数据,直至将所述乱序文件中的所有数据写入到数据库中为止。

所述存储模块204具体用于,从乱序处理后的每个子文件中,随机确定出任意一个子文件,并提取出随机确定出的该子文件中未添加到乱序文件、且排序位置最前的数据,将提取出的数据添加到乱序文件中,直至将每个子文件中的所有数据添加到乱序文件中为止。

所述存储模块204还用于,针对每个线程,监测该线程是否成功将数据写入到数据库中,当监测到该线程未成功将数据写入到数据库中时,记录当前读取乱序文件中的数据的排序位置,作为当前位置,根据当前线程池中处于运行状态的线程的数量以及所述预设的数据量,确定出待恢复的数据的数据量,根据所述待恢复的数据的数据量以及所述当前位置,确定当前位置与所述待恢复的数据的数据量的差值,作为恢复位置,在所述乱序文件中,按所述乱序文件中各数据的排序先后顺序,从排序位置为所述恢复位置处,重新开始读取数据,并通过所述线程池中处于空闲状态的线程,将读取的数据写入到数据库中。

所述装置还包括:

清除模块205,用于在所述存储模块将所述乱序文件中的所有数据写入到数据库中之后,对所述乱序处理的各子文件以及所述乱序文件进行清除。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和 硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1