KV存储系统中的数据读取方法、数据查询方法、装置及设备与流程

文档序号:16608721发布日期:2019-01-14 21:23阅读:336来源:国知局
本发明涉及存储
技术领域
:,尤其涉及一种kv存储系统中的数据读取方法、数据查询方法、装置及设备。
背景技术
::在键值(keyvalue,kv)存储系统中,数据以kv的形式进行存储。在向kv存储系统中写入数据时,批量(batch)写操作包括至少两个写记录,该批量写操作需要执行:1、生成快照snapshot版本号,将写操作的每一个写记录和快照版本号记录追加至写操作日志文件(write-aheadlog,wal)。2、将写操作的写记录和snapshot版本号记录插入到的可写内存表(memtable)中,并将kv存储系统的最大快照版本号更新为该批量写操作的快照版本号。当可写内存表占用的内存达到一个上限值后,kv存储系统会将可写内存表冻结成为不可写内存表(immutablememtable),并同时生成一个新的可写内存表和写操作操作日志。基于上述数据写入方法,在进行数据查询操作时,小于最大快照版本号的快照版本号对应的写记录均可以被查询到。然而,在多个写操作并行执行的过程中,在快照版本号较小的写操作正在进行数据写入时,快照版本号较大的写操作可能已经完成,并将kv存储系统的最大快照版本号更新为该较大的快照版本号,使得可以查询到快照版本号较小的、且正在执行写入的写操作的部分写记录,使得数据读取错误,导致数据读取的可靠性较差。技术实现要素:第一方面,本发明实施例提供一种键值kv存储系统中的数据写入方法,在执行第一写操作时,将第一写操作的多个写记录的标识记录到所述kv存储系统的预设文件;将所述第一写操作的多个写记录写入所述kv存储系统的写操作日志文件;将所述第一写操作的第一写记录写入所述kv存储系统的内存中的可写内存表,所述第一写记录为所述多个写记录中的任意一个写记录。在上述过程中,在将第一写操作的多个写记录写入到可写内存表之前,先将第一写操作的多个写记录的标识记录到kv存储系统的预设文件,并将第一写操作的多个写记录写入到kv存储系统的写操作日志文件,然后,将第一写操作的各个写记录依次写入到kv存储系统的内存中的可写内存表中,在确定将第一写操作的所有写记录均写入之可写内存表之后,可以删除预设文件中的第一写操作的多个写记录的标识。相应的,在kv存储系统执行查询操作时,若在可写内存表中查询到一个写记录,先判断预设文件中是否存在该记录的标识,若是,则说明该写记录所属的写操作为正在向可写内存表中写入的写操作,则不将该记录作为查询结果返回,若否,则说明该写记录所属的写操作为kv存储系统已经执行写入完成的写操作,则可以将该写记录操作作为查询结果返回。这样,可以避免查询到正在执行写入的写操作的部分写记录,以避免读取到错误的数据,进而提高数据读取的可靠性。本发明实施例同时可以保证多线程并行执行写操作的原子性。在一种可能的实施方式中,在所述第一写操作的多个写记录均写入所述可写内存表之后,删除所述预设文件中的所述第一写操作的多个写记录的标识。在另一种可能的实施方式中,所述预设文件为哈希链表;所述第一写操作的第一写记录的标识包括所述第一写记录的键key和所述第一写操作的快照版本号。在另一种可能的实施方式中,将所述第一记录的标识记录到所述kv存储系统的预设文件,包括:根据所述第一写记录的key确定所述第一写记录对应的哈希节点;在所述第一写记录对应的哈希节点所对应的存储空间中,记录所述第一写记录的标识。在另一种可能的实施方式中,所述根据所述第一写记录的key确定所述第一写记录对应的哈希节点,包括:将所述第一写记录的key与预设的最大哈希值的余数确定为第一哈希值;将所述第一哈希值对应的哈希节点确定为所述第一写记录对应的哈希节点。提供将预设文件设置为哈希链表,在哈希链表中存储写记录的标识时,将写记录的标识记录到哈希链表中对应存储节点所对应的存储空间中。这样,当需要在哈希链表中查找写记录的标识时,可以先确定对应的哈希节点,并在哈希节点对应的存储空间确定查找写记录的标识,这样,可以实现数据的快速查找。在另一种可能的实施方式中,所述方法还包括:将第二写操作的多个写记录标识记录到所述预设文件;其中,所述第二写操作与所述第一写操作为并行执行的写操作;将所述第二写操作的多条记录写入所述写操作日志文件;将所述第二写操作的多条记录写入到所述可写内存表;删除所述预设文件中的所述第二写操作的多个写记录标识。第二方面,本发明实施例提供一种键值kv存储系统中的数据查询方法,在数据查询过程中,在所述键值kv存储系统的内存的可写内存表中查询到第一写记录,判断所述kv存储系统的预设文件中是否包括所述第一写记录的标识;所述预设文件中包括第一写操作的多个写记录的标识,所述第一写记录为所述多个写记录中一个;当所述预设文件中包含所述第一写记录的标识,则不执行返回包含所述第一写记录的查询响应。在上述过程中,在kv存储系统执行查询操作时,若在可写内存表中查询到一个写记录,先判断预设文件中是否存在该记录的标识,若是,则说明该写记录所属的写操作为正在向memtable中写入的写操作,则不将该记录作为查询结果返回,若否,则说明该写记录所属的写操作为kv存储系统已经执行写入完成的写操作,则可以将该写记录操作作为查询结果返回。这样,可以避免查询到正在执行写入的写操作的部分写记录,以避免读取到错误的数据,进而提高数据读取的可靠性。本发明实施例同时可以保证多线程并行执行写操作的原子性。在一种可能的实施方式中,所述预设文件为哈希链表;所述第一写记录的标识包括所述第一写记录的键key和所述第一写操作的快照版本号。在另一种可能的实施方式中,所述方法还包括:在所述kv存储系统的所述可写内存表中查询到第二写记录;判断所述预设文件中是否包括所述第二写记录的标识;当所述预设文件中不包含所述第二写记录的标识,返回包含所述第二写记录的查询响应。第三方面,本发明实施例提供一种键值kv存储系统中的数据写入装置,包括记录模块和写入模块,分别用于实现本发明实施例第一方面各实现方式。第四方面,本发明实施例提供一种键值kv存储系统中的数据查询装置,包括查询模块、判断模块和返回模块,分别用于实现本发明实施例第二方面各实现方式。第五方面,本发明实施例提供一种kv存储系统中的数据写入设备,包括:存储器和处理器;所述处理器执行所述存储器中的计算机程序用于执行本发明实施例第一方面或其任一实现方式所述的kv存储系统中的数据写入方法。第六方面,本发明实施例提供一种键值kv存储系统中的数据查询设备,包括:存储器和处理器;所述处理器执行所述存储器中的计算机程序用于执行本发明实施例第二方面或其任一实现方式所述的kv存储系统中的数据查询方法。第七方面,本发明实施例一种存储介质,所述存储介质用于存储计算机程序,所述计算机程序用于实现第一方面或其任一实现方式提供的kv存储系统中的数据写入方法。第八方面,本发明实施例一种存储介质,所述存储介质用于存储计算机程序,所述计算机程序用于实现第二方面或其任一实现方式提供的kv存储系统中的数据查询方法。本发明实施例提供的kv存储系统中的数据读取方法、数据查询方法、装置及设备,在将第一写操作的多个写记录写入到可写内存表之前,先将第一写操作的多个写记录的标识记录到kv存储系统的预设文件,并将第一写操作的多个写记录写入到kv存储系统的写操作日志文件,然后,将第一写操作的各个写记录依次写入到kv存储系统的内存中的可写内存表中,在确定将第一写操作的所有写记录均写入之可写内存表之后,删除预设文件中的第一写操作的多个写记录的标识。相应的,在kv存储系统执行查询操作时,若在可写内存表中查询到一个写记录,先判断预设文件中是否存在该写记录的标识,若是,则说明该写记录所属的写操作为正在向可写内存表中写入的写操作,则不将该写记录作为查询结果返回,若否,则说明该写记录所属的写操作为kv存储系统已经执行写入完成的写操作,则可以将该写记录操作作为查询结果返回。这样,可以避免查询到正在执行写入的写操作的部分写记录,以避免读取到错误的数据,进而提高数据读取的可靠性。本发明实施例同时可以保证多线程并行执行写操作的原子性。附图说明图1为本发明实施例提供的kv存储系统的架构图;图2为本发明实施例提供的一种kv存储系统中的数据写入方法的流程示意图;图3为本发明实施例提供的哈希链表的结构示意图;图4为本发明实施例提供的另一种kv存储系统中的数据写入方法的流程示意图;图5为本发明实施例提供的一种kv存储系统中的数据查询方法的流程示意图;图6为本发明实施例提供的另一种kv存储系统中的数据查询方法的流程示意图;图7为本发明实施例提供的一种kv存储系统中的数据写入装置的结构示意图;图8为本发明实施例提供的另一种kv存储系统中的数据写入装置的结构示意图;图9为本发明实施例提供的kv存储系统中的数据查询装置的结构示意图;图10为本发明实施例提供的kv存储系统中的数据写入设备的结构示意图;图11为本发明实施例提供的kv存储系统中的数据查询设备的结构示意图。具体实施方式为了便于对本发明的理解,首先结合图1,对基于日志结构合并(logstructured-merge,简称lsm)树结构的kv存储系统进行说明。图1为本发明实施例提供的kv存储系统的架构图。请参见图1,kv存储系统包括内存和硬盘。示例性的,硬盘可以为机械硬盘,也可以为固态硬件(solidstatedisk,ssd),或者机械硬盘和ssd。内存中包括可写内存表(memtable)和不可写内存表(immutablememtable)。硬盘中存储多个排序字符串表(sortedstringtable,简称sst)文件、wal、manifest文件和current文件。sst文件进行分层管理,即全部的sst文件构成一种层级结构。每一层可以维护指定的文件个数或大小。例如,第0层为level0,可以包括1m的sst文件,第1层为level1,可以包括10m的sst文件,第2层为level2,可以包括100m的sst文件,第3层为level3,可以包括1g的sst文件,以此类推。其中,level0-n表示sst文件存放的不同层级,level序号从小到大代表数据库中的数据从新到老(即数据库接收数据的时间从早到晚)。每一层中的sst文件可以是按照主键的大小排序的,每个sst文件根据操作记录的主键存储一定主键范围内的操作,即每个sst文件有最小的主键和最大的主键,且每个sst文件的主键是不重叠的。因此在一层查找一个主键,只用查找一个sst文件。每个sst文件所属的层级信息可以记录在manifest文件中。为了准确查询kv存储系统中的操作,本发明实施例在执行写操作时,将写操作中每一条写记录的标识记录在预设文件中,将写操作的所有写记录写入wal和内存中的可写内存表,然后在预设文件中删除该写操作的标识。写记录的标识可以为写记录的key和写操作的快照版本号。相应的,在kv存储系统执行查询操作时,若在可写内存表中读取到一个写记录时,先判断预设文件中是否存在该写记录的标识,若是,则说明该写记录所属的写操作为正在向可写内存表中写入的写操作,则不将该记录作为查询结果返回,若否,则说明该写记录所属的写操作为kv存储系统已经执行写入完成的写操作,则可以将该写记录操作作为查询结果返回。这样,可以避免查询到正在执行写入的写操作的部分写记录,以避免读取到错误的数据,进而提高数据读取的可靠性。本发明实施例同时可以保证多线程并行执行写操作的原子性。下面,通过具体实施例对本发明实施例所示的技术方案进行详细说明。需要说明的是,下面几个具体实施例可以相互结合,对于相同或相似的内容,在不同的实施例中不再进行重复说明。图2为本发明实施例提供的一种kv存储系统中的数据写入方法的流程示意图。请参见图2,该方法可以包括:s201、将第一写操作的多个写记录的标识记录到kv存储系统的预设文件。可选的,一个写操作包括至少一个写记录。一个写记录对应一条数据。当写操作为批量(batch)操作时,一个写操作包括至少两个写记录。当写操作为非批量操作时,一个写操作包括一个写记录。每一条写记录对应一条kv,同一写操作中包括多个写记录的key不同。可选的,在执行一个写操作之前,先生成该写操作对应的快照版本号。一个写操作对应一个快照版本号,因此,一个写操作中包括的多个写记录对应的快照版本号相同,即,每一条写记录的快照版本号为该写记录所属的写操作的快照版本号。可选的,当kv存储系统当前只有一个写入操作需要执行时,则可以获取kv存储系统的最大快照版本号,并将最大快照版本号加1作为该一个写入操作的快照版本号。可选的,当kv存储系统当前有多个写入操作需要并行执行时,则可以根据最大快照版本号,依次为每个写入操作分配快照版本号,使得每个写入操作的快照版本号连续递增。例如,假设kv存储系统当前有三个写入操作需要并行执行时,该三个写入操作分别为写入操作1、写入操作2和写入操作3。再假设kv存储系统的最大快照版本号为4,则可以为写入操作1分配快照版本号5,为写入操作2分配快照版本号6,为写入操作3分配快照版本号7。可选的,针对第一写操作中的任意一个写记录,写记录的标识可以包括写记录的key和第一写操作的快照版本号。例如,假设第一写操作的快照版本号为snapshot1,再假设第一写操作中的第一写记录的key为key1,则第一写记录的标识可以为“key1,snapshot1”、或者“key1+snapshot1”等。可选的,预设文件可以为哈希链表。需要说明的是,在图4所示的实施例中,对预设文件为哈希链表时,向哈希链表中记录第一写操作的多个写记录的标识的过程进行详细说明,此处不再进行赘述。s202、将第一写操作的多个写记录写入kv存储系统的写操作日志文件。将第一写操作写入到写操作日志文件,这样,在kv存储系统故障时,可以避免内存中的数据丢失。s203、将第一写操作的第一写记录写入kv存储系统的内存中的可写内存表。可选的,第一写记录为第一写操作中的任意一个写记录。可选的,若第一写操作为批量操作时,则在将第一写操作的第一写记录写入之可写内存表之后,还顺序的将第一写操作的其它写记录依次写入到可写内存表。s204、在第一写操作的多个写记录均写入到可写内存表之后,删除预设文件中的第一写操作的多个写记录的标识。本发明实施例提供的kv存储系统中的数据写入方法,在将第一写操作的多个写记录写入到可写内存表之前,先将第一写操作的多个写记录的标识记录到kv存储系统的预设文件,并将第一写操作的多个写记录写入到kv存储系统的写操作日志文件,然后,将第一写操作的各个写记录依次写入到kv存储系统的内存中的可写内存表中,在确定将第一写操作的所有写记录均写入之可写内存表之后,删除预设文件中的第一写操作的多个写记录的标识。相应的,在kv存储系统执行查询操作时,若在可写内存表中查询到一个写记录,先判断预设文件中是否存在该写记录的标识,若是,则说明该写记录所属的写操作为正在向可写内存表中写入的写操作,则不将该写记录作为查询结果返回,若否,则说明该写记录所属的写操作为kv存储系统已经执行写入完成的写操作,则可以将该写记录操作作为查询结果返回。这样,可以避免查询到正在执行写入的写操作的部分写记录,以避免读取到错误的数据,进而提高数据读取的可靠性。本发明实施例同时可以保证多线程并行执行写操作的原子性。在上述任意一个实施例的基础上,下面,以第一写操作为批量写操作,且第一写操作包括第一写记录(对应第一kv)和第二写记录(对应第二kv),预设文件为哈希链表为例,对kv存储系统中的数据写入方法进行详细说明。具体的,请参见图4所示的实施例。为了便于对图4所示实施例的理解,首先结合图3,对哈希链表的结构进行详细说明。图3为本发明实施例提供的哈希链表的结构示意图。预先设置有哈希链表对应的最大哈希值,请参见图3,该哈希链表对应的最大哈希值为2047。哈希链表包括多个哈希值节点,哈希值节点的哈希值依次为0-2047。每个哈希节点有其对应的存储空间,可以在哈希节点对应的存储空间记录对应的key和快照版本号。请参见图3,第一个哈希节点(哈希值为0)对应的存储空间中存储的key与2047的余数为0,例如,第一个哈希节点对应的存储空间中的key可以为0、2047等。第二个哈希节点(哈希值为1)对应的存储空间中存储的key与2047的余数为1,例如,第一个哈希节点对应的存储空间中的key可以为1、2048等。需要说明的是,图3只是以示例的形式示意哈希链表,并非对哈希链表的格式及内从的限定,在实际应用过程中,可以根据实际需要设置哈希链表,本发明实施例对此不作具体限定。图4为本发明实施例提供的另一种kv存储系统中的数据写入方法的流程示意图。在图2-图3所示实施例的基础上,请参见图4,该方法可以包括:s401、生成第一写操作对应的第一快照版本号。第一写操作包括第一写记录和第二写记录,第一写记录对应第一kv,第二写记录对应第二kv,因此,第一kv和第二kv对应的快照版本号相同,均为第一写操作的快照版本号。s402、确定第一kv对应的第一哈希节点和第二kv对应的第二哈希节点。可选的,可以预设哈希链表对应的最大哈希值。例如,最大哈希值可以为1023、2047等。当然,在实际应用过程中,可以根据实际需要设置该最大哈希值,本发明实施例对此不作具体限定。可选的,可以根据第一kv的第一key和该最大哈希值确定第一哈希节点。可选的,可以将第一key与最大哈希值的余数确定为第一哈希值,并将哈希值为第一哈希值的哈希节点确定为第一哈希节点。例如,假设第一key为2050,最大哈希值为2047,则第一哈希值为2050mod2047=3,则将哈希值为3的节点确定为第一哈希节点。可选的,可以根据第二kv的第二key和该最大哈希值确定第二哈希节点。可选的,可以将第二key与最大哈希值的余数确定为第二哈希值,并将哈希值为第二哈希值的哈希节点确定为第二哈希节点。例如,假设第二key为2060,最大哈希值为2047,则第二哈希值为2060mod2047=13,则将哈希值为13的节点确定为第二哈希节点。s403、将第一kv的第一key和第一快照版本号记录到哈希链表中第一哈希节点对应的存储空间。s404、将第二kv的第二key和第一快照版本号记录到哈希链表中第二哈希节点对应的存储空间。需要说明的是,s403和s404可以顺序执行,也可以并行执行。当s403和s404顺序执行时,还可以先执行s404,再执行s403,本发明实施例对s403和s404的执行顺序不作具体限定。s405、将第一kv和第一快照版本号写入写操作日志文件,以及将第二kv和第二快照版本号写入写操作日志文件。可选的,可以并行向日志中写入第一kv和第一快照版本号,以及第二kv和第一快照版本号。可选的,可以顺序向日志中写入第一kv和第一快照版本号,以及第二kv和第一快照版本号。例如,可以先将第一kv和第一快照版本号追加至日志的末尾,再将第二kv和第一快照版本号追加至日志的末尾。或者,可以先将第二kv和第一快照版本号追加至日志的末尾,再将第一kv和第一快照版本号追加至日志的末尾。s406、将第一kv和第一快照版本号写入可写内存表,以及将第二kv和第一快照版本号写入可写内存表。可选的,可以顺序向可写内存表中写入第一kv和第一快照版本号,以及第二kv和第一快照版本号。例如,可以先向可写内存表中写入第一kv和第一快照版本号,再向可写内存表中写入第二kv和第一快照版本号。或者,可以先向可写内存表中写入第二kv和第一快照版本号,再向可写内存表中写入第一kv和第一快照版本号。s407、在将第一kv和第一快照版本号、以及第二kv和第一快照版本号均写入到可写内存表之后,在哈希链表中删除第一key和第一快照版本号,以及删除第二key和第一快照版本号。可选的,可以根据第一key计算第一哈希值,确定第一哈希值对应第一哈希节点,并在第一哈希节点对应的存储空间删除第一key和第一快照版本号。可选的,可以根据第二key计算第二哈希值,确定第二哈希值对应第二哈希节点,并在第二哈希节点对应的存储空间删除第二key和第一快照版本号。在图4所示的实施例中,当预设文件为哈希链表时,当需要在哈希链表中查找写记录的标识时,可以先根据写记录的key确定哈希节点,并在哈希节点对应的存储空间确定查找写记录的标识,这样,可以实现数据的快速查找。需要说明的是,非批处理写操作包括一个写记录,在非批处理写操作过程中与批处理写入操作的过程类似,此处不再进行赘述。在上述任意一个实施例的基础上,在执行第一写操作的过程中,还可以并行执行第二写操作,第二写操作的过程可以包括:将第二写操作的多个写记录标识记录到所述预设文件;将所述第二写操作的多条记录写入所述写操作日志文件;将所述第二写操作的多条记录写入到所述可写内存表;删除所述预设文件中的所述第二写操作的多个写记录标识。需要说明的是,第二写操作的执行过程可以参见上述第一写操作的执行过程,本发明实施例此处不再进行赘述。在上述任意一个实施例的基础上,可以通过如下可行的实现方式进行数据查询,具体的,请参见图5所示的实施例。图5为本发明实施例提供的一种kv存储系统中的数据查询方法的流程示意图。请参见图5,该方法可以包括:s501、在kv存储系统的可写内存表中查询到第一写记录。可选的,可以是在kv存储系统中查询到第一写记录对应的kv。s502、判断kv存储系统的预设文件中是否包括第一写记录的标识。其中,预设文件中包括第一写操作的多个写记录的标识,第一写记录为第一写操作的多个写记录中的任意一个。若是,则执行s503。若否,则执行s504。可选的,在记录查询(或者数据查询)过程中,先在可写内存表中进行查询,若在可写内存表中查询第一写记录,由于可写内存表中的写记录所属的写操作可能为正在执行的写操作能为正在写入的数据,因此,需要判断预设文件是否包括第一数据写记录的数据标识。需要说明的是,若在不可写内存表或者硬盘中查询到第一写记录,则可以返回包含该第一写记录的查询响应。其中,预设文件中的写记录的标识所指示的写记录所属的写操作为正在执行的写操作。可选的,预设文件可以为哈希链表。需要说明的是,在图6所示的实施例中,对预设文件为哈希链表时,判断哈希链表中是否包括第一写记录的标识的过程进行详细说明,此处不再进行赘述。s503、不执行返回包含第一写记录的查询响应。由于哈希链表中包括第一写记录的标识,说明第一写记录所属的写操作为正在执行的写操作,为了避免数据读取错误,则确定不执行返回包含第一写记录的查询响应。s504、返回包含第一写记录的查询响应。由于哈希链表中不包括第一写记录的标识,说明第一写记录所属的写操作为已执行完成的写操作则可以返回包含第一写记录的查询响应。本发明实施例提供的kv存储系统中的查询方法,在kv存储系统的可写内存表中查询到第一写记录之后,先判断预设文件中是否包括第一写记录的标识,若是,则说明第一写记录所属的写操作为正在执行的写操作,为了避免数据读取错误,则确定不执行返回包含第一写记录的查询响应,避免了对数据进行脏读,进而提高了数据读取的可靠性。在上述任意一个实施例的基础上,下面,以第一写记录对应第一kv,预设文件为哈希链表为例,对kv存储系统中的查询方法进行详细说明。具体的,请参见图6所示的实施例。图6为本发明实施例提供的另一种kv存储系统中的数据查询方法的流程示意图。请参见图6,该方法可以包括:s601、在值kv存储系统的可写内存表中查询到第一kv和第一kv对应的第一快照版本号。s602、根据第一kv的第一key,确定第一哈希节点。可选的,可以预设哈希链表对应的最大哈希值。例如,最大哈希值可以为1023、2047等。当然,在实际应用过程中,可以根据实际需要设置该最大哈希值,本发明实施例对此不作具体限定。可选的,可以根据第一key和该最大哈希值确定第一哈希节点。可选的,可以将第一key与最大哈希值的余数确定为第一哈希值,并将哈希值为第一哈希值的哈希节点确定为第一哈希节点。例如,假设第一key为2050,最大哈希值为2047,则第一哈希值为2050mod2047=3,则将哈希值为3的节点确定为第一哈希节点。s603、在第一哈希节点对应的存储空间判断是否存在第一key和第一快照版本号。若是,则执行s604。若是,则执行s605。s604、不执行返回包含第一kv的查询响应。s605、返回包含第一kv的查询响应。在图6所示的实施例中,当预设文件为哈希链表时,当判断预设文件中是否存在第一key和第一快照版本号时,先根据第一key确定第一哈希节点,再判断第一哈希节点对应的存储空间中是否存在第一key和第一快照版本号,这样,可以实现快速判断预设文件中是否存在第一key和第一快照版本号。下面,通过具体示例,对上述方法实施例所示的技术方案进行详细说明。示例性的,假设kv存储系统的最大快照号为4,当两个写入操作并发执行时,该两个写操作分别记为写操作1和写操作2。在执行写操作1之前,先生成写操作1的快照版本号为5(或者snapshot5)。假设写操作1为一个批处理(batch)操作,假设写操作1包括5个写记录,该5个写记录对应的5条kv分别记为kv1、kv2、kv3、kv4和kv5。再假设该5条kv的key分别为key1、key2、key3、key4、key5。在执行写操作1的过程中,需要依次执行:将key1+snapshot5、key2+snapshot5、key3+snapshot5、key4+snapshot5、key5+snapshot5记录到哈希链表。将kv1+snapshot5、kv2+snapshot5、kv3+snapshot5、kv4+snapshot5、kv5+snapshot5写入写操作日志文件。将kv1+snapshot5、kv2+snapshot5、kv3+snapshot5、kv4+snapshot5、kv5+snapshot5写入可写内存表。在将kv1+snapshot5、kv2+snapshot5、kv3+snapshot5、kv4+snapshot5、kv5+snapshot5全部写入可写内存表之后,在哈希链表中删除key1+snapshot5、key2+snapshot5、key3+snapshot5、key4+snapshot5、key5+snapshot5。在执行写操作2之前,先生成写操作2的快照版本号为6(或者snapshot6)。假设写操作2包括一个写记录,该一个写记录为kv6,则在执行写操作2的过程中,需要依次执行:将key6+snapshot6记录到哈希链表。将kv6+snapshot6写入写操作日志文件。将kv6+snapshot6写入可写内存表。在将kv6+snapshot6写入可写内存表之后,在哈希链表中删除key6+snapshot6。由于写操作2只需要写入一条kv,而写操作1需要写入5条kv,因此,在写操作1还没有写入完成时,写操作2可能已经写入完成,并将kv存储系统的最大快照号更新为6。此时,假设写操作1的6条kv的写入可写内存表的状态如表1所示:表1kv1+snapshot5kv2+snapshot5kv3+snapshot5kv4+snapshot5kv5+snapshot5未写入未写入未写入写入写入由于kv1+snapshot5、kv2+snapshot5、kv3+snapshot5还没有写入到可写内存表,因此,哈希链表中包括key1+snapshot5、key2+snapshot5、key3+snapshot5、key4+snapshot5、key5+snapshot5。假设此时,在进行查询操作时,由于kv存储系统的最大快照号为6,因此,可以在可写内存表中查询到快照号5对应的kv。假设在kv存储系统中查询到kv5+snapshot5,则判断哈希链表中是否存在kv5的标识key5+snapshot5,由于哈希链表中存在key5+snapshot5,则不执行返回包含kv5的查询响应。在上述过程中,尽管查询到了kv5,由于kv5所属的写操作1还没有执行完成,因此,不执行返回包含kv5的查询响应,以避免对写操作1对应的数据进行脏读。图7为本发明实施例提供的一种kv存储系统中的数据写入装置的结构示意图。请参见图7,该装置可以包括记录模块11和写入模块12,其中,记录模块11,用于将第一写操作的多个写记录的标识记录到所述kv存储系统的预设文件;写入模块12,用于将所述第一写操作的多个写记录写入所述kv存储系统的写操作日志文件,将所述第一写操作的第一写记录写入所述kv存储系统的内存中的可写内存表,所述第一写记录为所述多个写记录中的任意一个写记录。可选的,记录模块11可以执行图2实施例中的s201,写入模块12用于执行图2实施例中的s202和s203。记录模块11可以执行图4实施例中s401-s404,写入模块12用于执行图4实施例中的s405和s406。本发明实施例提供的键值kv存储系统中的数据写入装置可以执行上述方法实施例所示的技术方案,其实现原理以及有益效果类似,此处不再进行赘述。图8为本发明实施例提供的另一种kv存储系统中的数据写入装置的结构示意图。在图7所示实施例的基础上,请参见图8,所述装置还包括删除模块13,其中,所述删除模块13用于,在所述第一写操作的多个写记录均写入所述可写内存表之后,删除所述预设文件中的所述第一写操作的多个写记录的标识。可选的,删除模块13可以执行s204,以及图4实施例中的s407。在一种可能的实施方式中,所述预设文件为哈希链表;所述第一写操作的第一写记录的标识包括所述第一写记录的键key和所述第一写操作的快照版本号。在另一种可能的实施方式中,所述记录模块11具体用于:根据所述第一写记录的key确定所述第一写记录对应的哈希节点;在所述第一写记录对应的哈希节点所对应的存储空间中,记录所述第一写记录的标识。在另一种可能的实施方式中,所述记录模块11具体用于:将所述第一写记录的key与预设的最大哈希值的余数确定为第一哈希值;将所述第一哈希值对应的哈希节点确定为所述第一写记录对应的哈希节点。在另一种可能的实施方式中,所述记录模块11,还用于将第二写操作的多个写记录标识记录到所述预设文件;其中,所述第二写操作与所述第一写操作为并行执行的写操作;所述写入模块12,还用于将所述第二写操作的多条记录写入所述写操作日志文件,将所述第二写操作的多条记录写入到所述可写内存表;所述删除模块13,还用于删除所述预设文件中的所述第二写操作的多个写记录标识。本发明实施例提供的键值kv存储系统中的数据写入装置可以执行上述方法实施例所示的技术方案,其实现原理以及有益效果类似,此处不再进行赘述。图9为本发明实施例提供的kv存储系统中的数据查询装置的结构示意图。请参见图9,该装置可以包括查询模块21、判断模块22和返回模块23,其中,所述查询模块21,用于在所述键值kv存储系统的内存的可写内存表中查询到第一写记录;所述判断模块22,用于判断所述kv存储系统的预设文件中是否包括所述第一写记录的标识;所述预设文件中包括第一写操作的多个写记录的标识,所述第一写记录为所述多个写记录中一个;所述返回模块23,用于当所述判断模块判断所述预设文件中包含所述第一写记录的标识,则不执行返回包含所述第一写记录的查询响应。可选的,查询模块21可以执行图5实施例中的s501,以及图6实施例中的s601。判断模块22可以执行图5实施例中的s502,以及图6实施例中的s602-s603。返回模块23可以执行图5实施例中的s503-s504,以及图6实施例中的s604-s605。本发明实施例提供的键值kv存储系统中的数据查询装置可以执行上述方法实施例所示的技术方案,其实现原理以及有益效果类似,此处不再进行赘述。在另一种可能的实施方式中,所述预设文件为哈希链表;所述第一写记录的标识包括所述第一写记录的键key和所述第一写操作的快照版本号。在另一种可能的实施方式中,所述查询模块21,还用于在所述kv存储系统的所述可写内存表中查询到第二写记录;所述判断模块22,还用于判断所述预设文件中是否包括所述第二写记录的标识;所述返回模块23,还用于当所述判断模块判断所述预设文件中不包含所述第二写记录的标识,返回包含所述第二写记录的查询响应。本发明实施例提供的键值kv存储系统中的数据查询装置可以执行上述方法实施例所示的技术方案,其实现原理以及有益效果类似,此处不再进行赘述。图10为本发明实施例提供的kv存储系统中的数据写入设备的结构示意图。请参见图10,包括:存储器31和处理器32,存储器31和处理器32通信;示例性的,存储器31和处理器32通过通信总线33通信,所述存储器31用于存储计算机程序,所述处理器32执行所述计算机程序实现上述方法实施例所述的kv存储系统中的数据写入方法。可选的,处理器31可以执行图2实施例中的s201-s204,以及图4实施例中的s401-s407。本发明实施例提供的键值kv存储系统中的数据写入设备可以执行上述方法实施例所示的技术方案,其实现原理以及有益效果类似,此处不再进行赘述。图11为本发明实施例提供的kv存储系统中的数据查询设备的结构示意图。请参见图11,包括:存储器41和处理器42,存储器41和处理器42通信;示例性的,存储器41和处理器42通过通信总线43通信。所述存储器41用于存储计算机程序,所述处理器42执行所述计算机程序实现上述方法实施例所示的kv存储系统中的数据查询方法。可选的,处理器42可以执行图5实施例中的s501-s504,以及图6实施例中的s601-s605。本发明实施例提供的键值kv存储系统中的数据查询设备可以执行上述方法实施例所示的技术方案,其实现原理以及有益效果类似,此处不再进行赘述。在上述kv存储系统中的数据查询设备或kv存储系统中的数据查询设备的具体实现中,处理器的数量为至少一个,用来执行存储器存储的执行指令,即计算机程序。可选的,存储器还可以集成在处理器内部。本发明实施例提供一种存储介质,所述存储介质用于存储计算机程序,所述计算机程序用于实现上述任意方法实施例所述的kv存储系统中的数据写入方法。本发明实施例提供一种存储介质,所述存储介质用于存储计算机程序,所述计算机程序用于实现上述任意方法实施例所述的kv存储系统中的数据查询方法。在上述的kv存储系统中的数据写入设备或者kv存储系统中的数据查询设备的具体实现中,应理解,处理器可以是中央处理单元(英文:centralprocessingunit,简称:cpu),还可以是其他通用处理器、数字信号处理器(英文:digitalsignalprocessor,简称:dsp)、专用集成电路(英文:applicationspecificintegratedcircuit,简称:asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。在上述的kv存储系统中的数据写入设备或者kv存储系统中的数据查询设备可以为服务器,本发明实施例对此不作限定。在上述的kv存储系统中的数据写入设备或者kv存储系统中的数据查询设备中的各模块可以为纯硬件实现(如处理器),也可以为软件实现(计算机程序模块),还可以是硬件与软件的结合。其中,硬件与软件的结合实现方式可以是处理器执行存储器中的计算机程序以实现本发明各实施例的实现方式。本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1