具体实施方式
下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其它实施例,都属于本发明保护的范围。
实施例一
在本实施例中,更新数据以Memtable的存储结构存储在更新文件中,历史数据以SSTable的存储结构存储在一个或多个数据文件中。SSTable结构是一种分布式的键值存储结构,每个数据文件中都可以包含多个SSTable,每个SSTable中可以存储有多个value(主键对应的值)和对应的块内索引,每个SSTable的结构可以如图2所示。在进行查询的时候,可以先根据key(主键)查询其所属的数据文件,然后再进一步查询其在该数据文件中所属的SSTable,由于历史数据的数量非常庞大,采用SSTable结构可以提升查询效率。Memtable是一种非分布式的存储结构,由于更新数据一般数量比较少,所以采用Memtable结构可以提升存储效率。
如图3所示,为本发明实施例提供的非关系型数据库数据更新方法的处理的流程,具体包括以下步骤:
步骤301,***接收更新指令,并记录更新指令中携带的更新数据,更新数据包括主键和对应的更新操作内容。
数据库的维护人员可以通过服务器或管理终端发出更新指令,***接收到更新指令后,可以先将更新指令中的更新数据存储在更新文件当中,具体可以采用列表的形式存储key和对应的更新操作内容。更新数据中可以包括其需要更新的key,并包括对相应的key-value对进行的操作(即更新操作内容),该更新操作内容可以是删除key-value对、添加key-value对或修改value等。
步骤302,当预设的第一触发事件发生时,***查找各更新数据中的主键所属的数据文件。
具体的,该预设的第一触发事件可以是达到预设更新数据合并周期,即***预先设置更新数据合并周期,按照周期进行更新数据与历史数据的合并。另外,预设的第一触发事件还可以是接收到更新数据合并指令,即可以由数据库维护人员发送更新数据合并指令,以指示***将更新数据与历史数据进行合并。
具体的,如图4所示,***可以根据元数据文件中记录的元数据,查找各更新数据中的key对应的数据文件。元数据是一种用于描述数据的数据,元数据文件中记录的元数据的队列可以如图5所示,可以包括每个数据文件的文件编号、文件中key的范围、文件的存储容量等信息。另外,在元数据文件中还可以记录文件编号的信息,如已用文件编号、可用文件编号。
步骤303,***根据更新数据中的更新操作内容,将各更新数据与其对应的数据文件合并到新的数据文件中,并用新的数据文件替换合并前的数据文件。
***针对每条更新数据,根据更新数据中的key找到其对应的数据文件,然后将更新数据与相应的数据文件进行合并。具体的,合并的操作是根据更新数据中的更新操作内容进行的,可以包括删除key-value对、添加key-value对或修改value等。
当多个更新数据key对应到同一个数据文件时,此多个更新数据共同与该数据文件合并到新的数据文件中。合并过程会根据原数据文件中的各key和value,以及更新数据中的key和对应的更新操作内容,按照key的顺序,在新的数据文件中重新顺序生成各SSTable,SSTable的存储容量为预先设置的数值。
优选的,***可以为合并得到的新的数据文件分配新的文件编号(在可用文件编号中选取)。在合并结束后,***可以删除被替换的数据文件,并释放该数据文件的文件编号,该文件编号由已用文件编号变为可用文件编号。
在本实施例上述流程中,***可以预先建立两个用于记录更新数据的目录,将接收到的更新指令中携带的更新数据记录到其中一个目录中;然后,每当第一触发事件发生时,进行目录切换,将后续接收到的更新指令中携带的更新数据记录到另一个目录中,并将之前使用的目录中记录的各更新数据与对应的数据文件合并到新的数据文件中;将之前使用的目录中记录的各更新数据与对应的数据文件合并到新的数据文件中之后,删除之前使用的目录中的更新数据。
具体的,可以采用0、1目录的方式对更新数据进行进行存储,分别建立更新数据的0目录文件、1目录文件,每当第一触发事件发生时,进行目录切换,假设当前使用的是0目录,当第一触发事件发生开始进行合并过程时,新接收到的更新数据将被存储到目录1中,将目录0中的更新数据与相应的数据文件进行合并,且在合并过程结束后,0目录中的更新数据将被删除,然后,下一次发生第一触发事件时,再切换回到0目录进行更新数据存储,将目录1中的更新数据与相应的数据文件进行合并,且在合并过程结束后,删除1目录中的更新数据,依此类推。
优选的,本发明实施例还提供了的的非关系型数据库数据更新方法,还可以包括:当预设的第二触发事件发生时,判断相邻多个数据文件的存储容量之和是否超过预设存储容量阈值,如果没有超过,则将所述多个数据文件合并为一个数据文件。其中的第二触发事件可以是达到预设数据文件合并周期,也可以是各更新数据与相应的数据文件合并完毕,还可以是接收到数据文件合并指令。具体的数据文件的合并过程可以包括如下步骤:
步骤A,根据数据文件中包含的主键的顺序对数据文件进行排序,将排序后的数据文件中的第一个数据文件作为基准文件。
根据数据文件中存储的key的顺序,可以对数据文件进行排序。例如,数据文件1中包含key1、key2、key3,数据文件2中包含key4、key5、key6,数据文件3中包含key7、key8、key9,则根据key的顺序可以确定数据文件的顺序为数据文件1、数据文件2、数据文件3。
步骤B,判断基准文件是否为排序后的数据文件中的最后一个数据文件;如果是,则结束流程;否则,确定基准文件与基准文件的下一个数据文件的存储空间之和,并执行步骤C。
步骤C,判断所述存储空间之和是否超过预设的空间阈值;如果是,则将所述基准文件的下一个数据文件作为基准文件,并转至步骤B;否则,将基准文件与基准文件的下一个数据文件合并,将合并后的数据文件作为基准文件,并转至步骤B。
例如,对数据文件1到数据文件n进行数据文件合并过程,设置存储容量阈值为1M(兆)。将数据文件1作为基准文件,判断基准文件与数据文件2的存储容量之和是否超过1M,假设没有超过1M,则将数据文件1与数据文件2合并为数据文件1’,将数据文件1’作为基准文件,并继续判断基准文件与数据文件3的存储容量之和是否超过1M,假设超过1M,则将数据文件3作为基准文件,判断基准文件与数据文件4的存储容量之和是否超过1M,依此类推,直至基准文件是数据文件队列中的最后一个文件时,结束流程。
本发明实施例还提供了一种数据查询的方法,***预先对应各数据文件建立索引文件,索引文件中记录其对应的数据文件中的各SSTable所存储的主键的范围。具体的,索引文件中可以记录SSTable中的开始key,SSTable中key的个数,SSTable数据在其所属的数据文件中的偏移。在数据库启动时,***可以预先将各索引文件的内容加载到内存中。
如图6所示,该数据查询方法的流程可以包括如下步骤:
步骤601,当接收到查询指令时,***确定所述查询指令中携带的主键所属的数据文件。***可以根据元数据文件中记录的元数据,查找各更新数据中的key对应的数据文件,具体方法在步骤302中已作阐述,在此不再累述。
步骤602,***根据该数据文件对应的索引文件中记录的该数据文件中的各SSTable所存储的主键的范围,确定查询指令中携带的主键所属的SSTable。
在数据库启动时,***可以预先将各索引文件的内容加载到内存中。然后,***可以根据内存中加载的数据文件中各SSTable所存储的主键的范围,确定相应的主键所属的SSTable。
步骤603,在该主键所属的SSTable中查找该主键对应的值。
本发明实施例中,接收更新指令,并记录更新指令中携带的更新数据,更新数据包括主键和对应的更新操作内容,当预设的第一触发事件发生时,查找记录的各更新数据中的主键所属的数据文件,根据更新数据中的所述更新操作内容,将各更新数据与其对应的数据文件合并到新的数据文件中,并用所述新的数据文件替换合并前的数据文件,从而,可以提高非关系型数据库历史数据更新的效率。
实施例二
如图7所示,为本发明实施例提供的非关系型数据库数据更新方法在具体应用场景中的处理流程,可以包括如下步骤:
步骤701,***切换到更新数据合并模式,获取当前数据正在使用的目录。假设当前使用的目录是0目录,后续再接收到的更新数据将存入到1目录中。
步骤702,获取该目录中所有更新数据对应的key,并根据元数据查找各key对应的数据文件。
步骤703,分配可用文件编号,建立新的数据文件,并将各更新数据与其对应的数据文件合并到新的数据文件中。合并结束后,可以删除合并前的数据文件及其对应的索引文件,并将其文件编号释放为可用。
步骤704,建立新的数据文件的索引文件,并将该索引文件的内容更新到内存中。可以用该索引文件的内容替换合并前的数据文件对应的索引文件在内存中的相应内容。
步骤705,结束更新数据与历史数据的合并流程,***切换到正常模式。在正常模式下,***只接收更新数据并存储到相应的目录中,而不进行更新数据与历史数据的合并。
本发明实施例中,接收更新指令,并记录更新指令中携带的更新数据,更新数据包括主键和对应的更新操作内容,当预设的第一触发事件发生时,查找记录的各更新数据中的主键所属的数据文件,根据更新数据中的所述更新操作内容,将各更新数据与其对应的数据文件合并到新的数据文件中,并用所述新的数据文件替换合并前的数据文件,从而,可以提高非关系型数据库历史数据更新的效率。
实施例三
基于相同的技术构思,本发明实施例还提供了一种非关系型数据库数据更新装置,如图8所示,包括:
记录模块810,用于接收更新指令,并记录所述更新指令中携带的更新数据,所述更新数据包括主键和对应的更新操作内容;
查找模块820,用于当预设的第一触发事件发生时,查找各更新数据中的主键所属的数据文件;
更新模块830,用于根据更新数据中的所述更新操作内容,将各更新数据与其对应的数据文件合并到新的数据文件中,并用所述新的数据文件替换合并前的数据文件。
优选的,还包括更新数据管理模块,用于:
预先建立两个用于记录所述更新数据的目录;
将接收到的更新指令中携带的更新数据记录到其中一个目录中;
每当所述第一触发事件发生时,进行目录切换,将后续接收到的更新指令中携带的更新数据记录到另一个目录中,并将之前使用的目录中记录的各更新数据与对应的数据文件合并到新的数据文件中;
将之前使用的目录中记录的各更新数据与对应的数据文件合并到新的数据文件中之后,删除之前使用的目录中的更新数据。
优选的,还包括合并模块,用于:
当预设的第二触发事件发生时,判断相邻多个数据文件的存储容量之和是否超过预设存储容量阈值,如果没有超过,则将所述多个数据文件合并为一个数据文件。
优选的,所述合并模块,具体用于:
步骤A,根据数据文件中包含的主键的顺序对数据文件进行排序,将排序后的数据文件中的第一个数据文件作为基准文件;
步骤B,判断基准文件是否为排序后的数据文件中的最后一个数据文件;如果是,则结束流程;否则,确定基准文件与基准文件的下一个数据文件的存储空间之和,并执行步骤C;
步骤C,判断所述存储空间之和是否超过预设的空间阈值;如果是,则将所述基准文件的下一个数据文件作为基准文件,并转至步骤B;否则,将基准文件与基准文件的下一个数据文件合并,将合并后的数据文件作为基准文件,并转至步骤B。
优选的,所述预设的第二触发事件,具体为达到预设数据文件合并周期。
优选的,还包括:
建立模块,用于对应各数据文件建立索引文件,索引文件中记录其对应的数据文件中的各SSTable所存储的主键的范围;
查询模块,用于当接收到查询指令时,确定所述查询指令中携带的主键所属的数据文件;根据该数据文件对应的索引文件中记录的该数据文件中的各SSTable所存储的主键的范围,确定所述查询指令中携带的主键所属的SSTable;在该主键所属的SSTable中查找该主键对应的值。
优选的,所述预设的第一触发事件,具体为达到预设更新数据合并周期。
优选的,还包括文件编号管理模块,用于:
为所述新的数据文件分配新的文件编号;
删除被替换的数据文件,并释放该数据文件的文件编号。
本发明实施例中,接收更新指令,并记录更新指令中携带的更新数据,更新数据包括主键和对应的更新操作内容,当预设的第一触发事件发生时,查找记录的各更新数据中的主键所属的数据文件,根据更新数据中的所述更新操作内容,将各更新数据与其对应的数据文件合并到新的数据文件中,并用所述新的数据文件替换合并前的数据文件,从而,可以提高非关系型数据库历史数据更新的效率。
本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。