具体实施方式
首先,在对本发明实施例进行描述的过程中出现的部分名词或术语适用于如下解释:
反序列化:将流转化成对象的过程称之为反序列化(Deserialize)。
快照:快照(Snapshot)是某个数据集在某一特定时刻的镜像,也称为即时拷贝,它是这个数据集的一个完整可用的副本。
回滚(Rollback):回滚泛指程序更新失败,返回上一次正确状态的行为。
序列化(Serialize):将对象状态转换为可保持或传输的格式的过程。
反序列化(Deserialize):将数据流转化成对象的过程。
正则表达式(Regular Expression):正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
哈希(Hash):就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
图1是根据本发明实施例的日志数据的去重装置示意图。如图1所示,该装置可以包括:元素获取模块10,用于获取日志文件的对象元素;元素保存模块30,用于保存根据对象元素的快照ID将对象元素保存入数据集合;第一插入模块50,用于在将日志文件读取完毕之后,将数据集合中的数据插入到第一临时表;去重模块70,用于对第一临时表中的数据进行去重处理得到第二临时表;第二插入模块90,用于将第二临时表中的数据插入到数据库的正式表中。
采用本发明,在获取日志文件的对象元素之后,根据对象元素的快照ID将对象元素保存入数据集合,并在将日志文件读取完毕之后,将数据集合中的数据插入到第一临时表,然后对第一临时表中的数据进行去重处理得到第二临时表,并将第二临时表中的数据插入到数据库的正式表中,可以在将数据在写入数据库之前完成去重,并且使用快照式传送数据,在缩短传送时间的同时存在大量重复数据,然后将去重后的数据写入数据库,解决了现有技术中在数据库中对数据去重会耗费大量资源且处理速度慢的问题,实现了大幅度减少写入数据库的重复数据的效果,从而大幅度减轻了数据库对于IO、CPU资源的消耗。
在本发明上述实施例中的数据集合可以是内存中用于保存数据的一个虚拟的数据集合。
根据本发明的上述实施例,元素获取模块可以包括:读取模块,用于从日志文件中逐行读取第一日志数据;过滤模块,用于对第一日志数据进行过滤处理得到第二日志数据;反序列化模块,用于将第二日志数据反序列化得到对象元素。
具体地,在执行本申请的上述实施例之前,可以初始化内存中的数据集合和执行该实施例需要使用的内部变量。在完成对内存的初始化之后,打开日志文件,逐行读取日志文件中的第一日志数据。其中,具体地,在下一条日志数据符合正则表达式的情况下,表明该日志数据符合规则,则将该日志数据(此处的日志数据为第二日志数据)执行步骤S205的处理。在下一条日志数据符合正则表达式的情况下,执行步骤S204:抛出异常,并返回执行步骤S202。
更具体地,通过正则表达式从读取到的第一日志数据中过滤掉不符合规则的数据流(即第一日志数据组成的数据流)得到第二日志数据。在该步骤中日志数据的表现形式为字符串。
通过该步骤可以减少大量不符合规则的日志数据,从而可以有效减少后续数据处理的数量,减少了资源占用并且可以大大提高处理速度。
在上述实施例中,根据预设规则将第二日志数据(在本实施例中第一日志数据可以是字符串)反序列化为对象元素。
其中,上述实施例中的规则可以是客户端与服务器约定的数据格式、数据项的名称和类型定义等参数;数据流可以是进位制,例如:010101、JSON:{"name":"john","age":24}、参数形式:sn=85&gsve=1.3.1.0等,客户端和服务器端预先约定的发送日志数据的格式以及数据项的名称和类型定义即为上述实施例中的预设规则。
具体地,数据接收端(可以是上述实施例中的服务器)定义了接收数据的数据项个数、名称和类型,例如:A:数值型,B:字符型,C:字符型,客户端发送必须按该定义发送数据,如果数据项个数、名称和类型任意一项不合符定义,均被认为不符合规则。
进一步地,元素保存模块可以包括:查找模块,用于在数据集合中查找是否存在快照ID;第一子保存模块,用于在数据集合中不存在快照ID的情况下,将当前的对象元素按照键值对的形式保存入数据集合;比较模块,用于在数据集合中存在快照ID的情况下,比较对象元素的元素发送序号与数据集合的集合发送序号的大小;替换模块,用于在元素发送序号大于集合发送序号的情况下,获取数据集合中该快照ID对应的第一数据,将第一数据替换为对象元素;返回模块,用于在元素发送序号不大于集合发送序号的情况下,返回执行获取日志文件的对象元素的步骤,直至将日志文件读取完。
其中,上述实施例中的发送序号是对象中的一个元素,是一个自增长的整数序列,用来表示客户端发送的对象元素的顺序,以表示对象元素的新旧,后一个序号比前一个序号所携带的对象元素新,当服务器端接收到比服务器端保存的发送序号要新的数据对象,服务器端的旧数据就可以被携带新序号的数据更新替代;每个对象元素均会携带一个快照ID。
进一步地,去重装置包括:判断模块,用于判断数据集合中的数据条数是否大于零;第三插入模块,用于在数据条数大于零的情况下,将数据集合中的数据插入到第一临时表中。
进一步地,去重模块包括:序号获取模块,用于获取快照ID在第一临时表中的最大发送序号;集合生成模块,用于在第一临时表中查询所有比最大发送序号小的元素发送序号生成第一序号集合;集合获取模块,用于获取与第一序号集合中的元素发送序号对应的对象元素,得到对象元素集合;删除模块,用于从第一临时表中删除对象元素集合中的对象元素得到第二临时表。
由于第一临时表中会有大量的重复数据,将重复的大量数据直接在第一临时表中删除生成第二临时表,然后使用第二临时表中的数据更新正式表中的数据,比起直接将第一临时表中的数据导入正式表中后删除大量重复数据,可以节省大量的时间,采用该方案可以大大提高处理效率。
该装置实施例中的各个模块均可以使用下述方法实施例中的方法实现,在此不再赘述。
图2是根据本发明实施例的日志数据的去重方法的流程图,如图2所示该方法包括如下步骤:
步骤S102,获取日志文件的对象元素。
步骤S104,根据对象元素的快照ID将对象元素保存入数据集合。
步骤S106,在将日志文件读取完毕之后,将数据集合中的数据插入到第一临时表。
步骤S108,对第一临时表中的数据进行去重处理得到第二临时表。
步骤S110,将第二临时表中的数据插入到数据库的正式表中。
采用本发明,在获取日志文件的对象元素之后,根据对象元素的快照ID将对象元素保存入数据集合,并在将日志文件读取完毕之后,将数据集合中的数据插入到第一临时表,然后对第一临时表中的数据进行去重处理得到第二临时表,并将第二临时表中的数据插入到数据库的正式表中,可以在将数据在写入数据库之前完成去重,并且使用快照式传送数据,在缩短传送时间的同时存在大量重复数据,然后将去重后的数据写入数据库,解决了现有技术中在数据库中对数据去重会耗费大量资源且处理速度慢的问题,实现了大幅度减少写入数据库的重复数据的效果,从而大幅度减轻了数据库对于IO、CPU资源的消耗。
在本发明上述实施例中的数据集合可以是内存中用于保存数据的一个虚拟的数据集合。
根据本发明的上述实施例,获取日志文件的对象元素的步骤可以包括:从日志文件中逐行读取第一日志数据;对第一日志数据进行过滤处理得到第二日志数据;将第二日志数据反序列化得到对象元素。
具体地,如图3所示,本发明的上述实施例可以包括如下步骤:
步骤S201:读取日志数据。
步骤S202:读取下一条日志数据。
具体地,在执行本申请的上述实施例之前,可以初始化内存中的数据集合和执行该实施例需要使用的内部变量。在完成对内存的初始化之后,打开日志文件,逐行读取日志文件中的第一日志数据。在该实施例中的日志数据与第一日志数据是同样的数据。
其中,上述实施例中的该内部变量指程序中用于数据交换或者传递的临时变量,只在程序内部使用。
步骤S203:检测日志数据是否符合正则表达式。通过该步骤实现上述实施例中对第一日志数据进行过滤处理得到第二日志数据的步骤。
其中,具体地,在日志数据符合正则表达式的情况下,表明该日志数据符合规则,则将该日志数据(此处的日志数据为第二日志数据)执行步骤S205的处理。在日志数据符合正则表达式的情况下,执行步骤S204:抛出异常,并返回执行步骤S202。
更具体地,通过正则表达式从读取到的第一日志数据中过滤掉不符合规则的数据流(即第一日志数据组成的数据流)得到第二日志数据。在该步骤中日志数据的表现形式为字符串。
通过该步骤可以减少大量不符合规则的日志数据,从而可以有效减少后续数据处理的数量,减少了资源占用并且可以大大提高处理速度。
步骤S205:将日志数据反序列化成对象元素。
具体地,根据预设规则将第二日志数据(在本实施例中第一日志数据可以是字符串)反序列化为对象元素。
其中,上述实施例中的规则可以是客户端与服务器约定的数据格式、数据项的名称和类型定义等参数;数据流可以是进位制,例如:010101、JSON:{"name":"john","age":24}、参数形式:sn=85&gsve=1.3.1.0等,客户端和服务器端预先约定的发送日志数据的格式以及数据项的名称和类型定义即为上述实施例中的预设规则。
具体地,数据接收端(可以是上述实施例中的服务器)定义了接收数据的数据项个数、名称和类型,例如:A:数值型,B:字符型,C:字符型,客户端发送必须按该定义发送数据,如果数据项个数、名称和类型任意一项不合符定义,均被认为不符合规则。
在本发明的上述实施例中,根据对象元素的快照ID将对象元素保存入数据集合的步骤可以包括:在数据集合中查找是否存在快照ID;在数据集合中存在快照ID的情况下,将当前的对象元素按照键值对的形式保存入数据集合;在数据集合中不存在快照ID的情况下,比较对象元素的元素发送序号与数据集合的集合发送序号的大小;在元素发送序号大于集合发送序号的情况下,获取数据集合中该快照ID对应的第一数据,将第一数据替换为对象元素;在元素发送序号不大于集合发送序号的情况下,返回执行获取日志文件的对象元素的步骤,直至将日志文件读取完。
根据本发明的上述实施例,在将日志文件读取完毕之后,将数据集合中的数据插入到第一临时表的步骤可以包括:判断数据集合中的数据条数是否大于零;在数据条数大于零的情况下,将数据集合中的数据插入到第一临时表中。
具体地,通过如图3所示的方法可以实现上述实施例,具体如下:
步骤S206:检测数据集合中是否存在对象元素的快照ID。
其中,具体地,通过在数据集合中查找该对象元素的快照ID是否存在来实现上述步骤,如果数据集合中不存在该对象元素的快照ID,执行步骤S208;如果数据集合中存在该对象元素的快照ID则执行步骤S207。
步骤S207:检测对象元素的元素发送序号是否大于数据集合的集合发送序号。
其中,上述实施例中的发送序号是对象中的一个元素,是一个自增长的整数序列,用来表示客户端发送的对象元素的顺序,以表示对象元素的新旧,后一个序号比前一个序号所携带的对象元素新,当服务器端接收到比服务器端保存的发送序号要新的数据对象,服务器端的旧数据就可以被携带新序号的数据更新替代;每个对象元素均会携带一个快照ID。
具体地,通过比较该对象元素的元素发送序号是否大于数据集合中的集合发送序号来实现。如果对象元素的元素发送序号大于数据集合的集合发送序号,则确认当前的对象元素是最新接收到的数据,执行步骤S209;如果元素发送序号不大于集合发送序号,则确认数据集合中存放的数据是最新的,返回执行步骤S202,也即跳出继续读取下一条日志数据。
更具体地,服务器端可以保留最新的发送序号,用来和当前收到客户端的发送序号进行比较,比较后最新的发送序号保存在服务器端用于下条数据中发送序号的比较。
步骤S208:将对象元素插入数据集合中。
具体地,将当前的对象元素插入到数据集合中时,对象元素按照键值对的形式存放,更具体地,Key为快照ID,Value为整个元素对象。
步骤S209:更新数据集合。
具体地,使用该对象元素替换数据集合中具有相同快照ID的第一数据。
步骤S210:检测日志数据是否全部读完。
其中,在日志数据全部读取完的情况下,执行步骤S211;在日志数据没有完全读完的情况下,返回执行步骤S202。
在本发明的上述实施例中,循环读取日志文件中的日志数据,直到读取到结束标示符后跳出循环,至此日志文件已经全部读取完毕。
步骤S211:将数据集合数据导入临时表。
具体地,判断数据集合中的数据条数是否大于零,在数据集合中的数据条数等于零的情况下,确认数据集合中没有需要更新的数据,处理结束;在数据集合中的数据条数大于零的情况下,将数据集合的数据插入到数据库的临时表(中间表,也即本发明上述实施例中的第一临时表)中。
根据本发明的上述实施例,对第一临时表中的数据进行去重处理得到第二临时表的步骤可以包括:获取快照ID在第一临时表中的最大发送序号;在第一临时表中查询所有比最大发送序号小的元素发送序号生成第一序号集合;获取与第一序号集合中的元素发送序号对应的对象元素,得到对象元素集合;从第一临时表中删除对象元素集合中的对象元素得到第二临时表。
具体地,获取在临时表(也即本发明上述实施例中的第一临时表)中快照ID的最大发送序号,获取数据集合中所有比最大发送序号小的元素发送序号得到第一序号集合;将第一序号集合中的元素发送序号对应的对象元素保存在对象元素集合中,从第一临时表中删除对象元素集合中的所有对象元素得到第二临时表。
在上述方案中,根据快照ID以及对应的最大发送序号,将临时表中相同快照ID且比最大发送序号小的所有数据删除,这样就保留了最后一条的快照数据,从而可以快速地去除临时表中的重复数据。
其中,临时表的表结构和正式表完全一致。
步骤S212:检测对象元素是否成功插入临时表。该步骤中的临时表即为上述实施例中的第一临时表。
需要说明的是,在本申请中涉及的对象元素是日志数据的一种表现形式,其中携带的日志信息与日志数据携带的日志信息是一致的。
具体地,若插入失败则回滚事务,抛出异常结束程序;若插入成功,则执行步骤S213。
步骤S213:检测日志数据是否读完。其中,在日志数据没有读取完的情况下,返回执行步骤S202;在日志数据读取完的情况下,执行步骤S214。
由于第一临时表中会有大量的重复数据,将重复的大量数据直接在第一临时表中删除生成第二临时表,然后使用第二临时表中的数据更新正式表中的数据,比起直接将第一临时表中的数据导入正式表中后删除大量重复数据,可以节省大量的时间,采用该方案可以大大提高处理效率。
步骤S214:将临时表中的数据导入数据库正式表。
更具体地,可以将去重后的临时表(即第二临时表中)根据第二临时表中的每行数据主键列生成的Hash值,对临时表(在该步骤中为第二临时表)和正式表的数据逐行进行Hash匹配,临时表的数据已经存在于正式表,则把临时表的数据更新到正式表中;临时表的数据不存在于正式表,则把临时表的数据插入到正式表中。
在上述实施例中,对第二临时表和正式表中的数据逐行进行Hash匹配具体地可以通过如下方法实现:
比较两个表中每行数据的hash值是否相同,在hash值相同的情况下,确认匹配成功;在hash不同的情况下,确认匹配不成功。
在匹配成功的情况下,确认第二临时表中该行的数据在正式表中已经存在,使用第二临时表中的数据修改正式表中对应行的数据的值;在匹配不成功的情况下,确认第二临时表中该行的数据在正式表中不存在,将第二临时表中改行的数据插入到正式表中。
步骤S215:检测临时表中的数据导入正式表是否失败。
在临时表中的数据导入正式表失败的情况下,则回滚事务,抛出异常记录错误信息并结束程序;若导入成功,则提交事务。
具体地,在将第二临时表中的数据导入数据库的正式表之后,方法还可以包括:删除第一临时表和第二临时表中的数据。
删除第一临时表和第二临时表中的数据,可以收缩数据库并释放资源。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本发明上述实施例中的正式表可以为数据库中预存好的固定格式的用于保存数据的表。
从以上的描述中,可以看出,本发明实现了如下技术效果:采用本发明,在获取日志文件的对象元素之后,根据对象元素的快照ID将对象元素保存入数据集合,并在将日志文件读取完毕之后,将数据集合中的数据插入到第一临时表,然后对第一临时表中的数据进行去重处理得到第二临时表,并将第二临时表中的数据插入到数据库的正式表中,可以在将数据在写入数据库之前完成去重,并且使用快照式传送数据,在缩短传送时间的同时存在大量重复数据,然后将去重后的数据写入数据库,解决了现有技术中在数据库中对数据去重会耗费大量资源且处理速度慢的问题,实现了大幅度减少写入数据库的重复数据的效果,从而大幅度减轻了数据库对于IO、CPU资源的消耗。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。