一种数据处理的方法、装置、电子设备及介质
技术领域
本发明涉及数据存储
技术领域
,特别是涉及一种数据处理的方法、装置、电子设备及介质。背景技术
目前在越来越多的数据分析场景中,需要将频繁查询的数据缓存到CPU二级缓存中。后续进行实时数据分析时,可以直接读取二级缓存中的数据,无需频繁地读取外置缓存或内存中的数据,实现数据高效计算和分析。
二级缓存中的数据可以通过单链表的形式缓存,单链表的每个节点可以缓存多个键值(key-value)对。随着单链表中缓存的数据量逐步增长,可能会出现多个key发生冲突的问题,这种情况下可以将冲突的多个数据缓存在单链表的同一结点中,多个冲突的数据之间通过指针连接。在单链表中有大量冲突的键值对时,需要对单链表中的数据进行整理,在整理过程中,无法处理对单链表中的数据的访问请求,会影响业务的运行。
发明内容
本发明实施例的目的在于提供一种数据处理的方法、装置、电子设备及介质,用以解决对数据整理过程中影响业务运行的问题。具体技术方案如下:
第一方面,本申请实施例提供一种数据处理方法,包括:
将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移;
如果接收到针对待访问数据的数据访问请求,则暂停数据转移,从所述主数据结构中查找所述待访问数据;
如果从所述主数据结构中查找到所述待访问数据,则基于查找到的待访问数据处理所述数据访问请求,并继续进行数据转移;
如果未从所述主数据结构中查找到所述待访问数据,则从所述辅助数据结构中查找所述待访问数据,基于查找到的待访问数据处理所述数据访问请求,并继续进行数据转移,直至所述主数据结构中缓存的数据被全部转移到所述辅助数据结构。
在一种可能的实现方式中,所述方法还包括:
在数据转移过程中,如果接收到针对待写入数据的数据写入请求,则暂停数据转移,将所述待写入数据写入所述辅助数据结构;
在所述待写入数据写入成功后,继续进行数据转移。
在一种可能的实现方式中,在所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移之前,所述方法还包括:
在初始化过程中,从内存或者硬盘中读取指定数据,将所述指定数据缓存于所述二级缓存的所述主数据结构中。
在一种可能的实现方式中,所述主数据结构中的数据以键值对的形式缓存;在所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移之前,所述方法还包括:
检测所述主数据结构中缓存的键值对的冲突率;
如果所述冲突率达到预设冲突率阈值,则在所述二级缓存中创建所述辅助数据结构,并执行所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移的步骤。
在一种可能的实现方式中,在所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移之前,所述方法还包括:
如果指定时长内接收到的待写入数据的数据量大于预设数据量阈值,则在所述二级缓存中创建所述辅助数据结构,并将所述待写入数据写入所述辅助数据结构;
在将所述待写入数据全量写入所述辅助数据结构之后,执行所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移的步骤。
在一种可能的实现方式中,所述主数据结构为单链表或单向切片,所述辅助数据结构为单链表或者单向切片。
第二方面,本申请实施例提供一种数据处理装置,包括:
转移模块,用于将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移;
查找模块,用于如果接收到针对待访问数据的数据访问请求,则触发所述转移模块暂停数据转移,从所述主数据结构中查找所述待访问数据;如果从所述主数据结构中查找到所述待访问数据,则基于查找到的待访问数据处理所述数据访问请求,并触发所述转移模块继续进行数据转移;
所述查找模块,还用于如果未从所述主数据结构中查找到所述待访问数据,则从所述辅助数据结构中查找所述待访问数据,基于查找到的待访问数据处理所述数据访问请求,并触发所述转移模块继续进行数据转移,直至所述主数据结构中缓存的数据被全部转移到所述辅助数据结构。
在一种可能的实现方式中,所述装置还包括:
写入模块,用于在所述转移模块进行数据转移过程中,如果接收到针对待写入数据的数据写入请求,则触发所述转移模块暂停数据转移,将所述待写入数据写入所述辅助数据结构;以及在所述待写入数据写入成功后,触发所述转移模块继续进行数据转移。
在一种可能的实现方式中,所述装置还包括:
初始化模块,用于在初始化过程中,从内存或者硬盘中读取指定数据,将所述指定数据缓存于所述二级缓存的所述主数据结构中。
在一种可能的实现方式中,所述主数据结构中的数据以键值对的形式缓存;所述装置还包括:
检测模块,用于检测所述主数据结构中缓存的键值对的冲突率;
创建模块,用于如果所述冲突率达到预设冲突率阈值,则在所述二级缓存中创建所述辅助数据结构,并触发所述转移模块执行所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移的步骤。
在一种可能的实现方式中,所述装置还包括:
创建模块,用于如果指定时长内接收到的待写入数据的数据量大于预设数据量阈值,则在所述二级缓存中创建所述辅助数据结构;
写入模块,用于将所述待写入数据写入所述辅助数据结构;在将所述待写入数据全量写入所述辅助数据结构之后,触发所述转移模块执行所述将二级缓存的主数据结构中缓存的数据向所述二级缓存的辅助数据结构中转移的步骤。
第三方面,本申请实施例还提供一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现上述任一所述的数据处理方法步骤。
第四方面,本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现第一方面中所述的数据处理方法。
第五方面,本申请实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面中所述的数据处理方法。
本申请实施例有益效果:
采用上述技术方案,可以将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移,在数据转移过程中,如果接收到针对待访问数据的数据访问请求,那么则可以暂停数据转移,优先从主数据结构中查找待访问数据,如果未查找到,则可进一步从辅助数据结构中查找待访问数据。如此,通过增加辅助数据结构,使得数据整理过程中也可处理数据访问请求,在处理数据访问请求后,可以继续进行数据转移。既实现了数据整理,又避免了数据整理过程影响业务的运行。
当然,实施本发明的任一产品或方法并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的实施例。
图1为本申请实施例提供的一种数据处理方法的流程图;
图2为本申请实施例提供的另一种数据处理方法的流程图;
图3为本申请实施例提供的一种单链表的示例性示意图;
图4为本申请实施例提供的另一种单链表的示例性示意图;
图5为本申请实施例提供的一种数据处理装置的结构示意图;
图6为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员基于本申请所获得的所有其他实施例,都属于本发明保护的范围。
在相关技术中,为了实现海量数据的存储和分析,可以采用MySQL或者ORACLE本身的存储缓存技术,将需要频繁使用的数据缓存到CPU的二级缓存中。比如在运行结构化查询语言(Structured Query Language,SQL)语句后,将SQL的哈希值和该SQL语句的查询结果缓存在二级缓存中。后续如果需要运行相同的SQL语句,则可以直接从二级缓存中获取查询结果,无需重新执行查询过程,可以快速获取到需要查询的数据,提高查询速度。或者还可以采用Redis数据库,Redis数据库中被频繁访问的数据缓存到CPU的二级缓存中,以提高数据查询速度。
上述CPU的二级缓存中有单链表,可以通过单链表对数据进行缓存,当单链表中存在大量的冲突键值对时,为了解决大量键值对冲突的问题,需要对单链表进行扩容,并对单链表中缓存的数据进行整理。在整理过程中,无法查询单链表中缓存的数据,在完成数据整理后,才可以对单链表中的数据进行查询。单链表中缓存的数据一般为对实时性要求较高的业务的数据,且被访问的频次较高,而数据整理过程需要较长的时间,将会影响业务的运行。
为了解决上述问题,本申请实施例提供了一种数据处理方法、装置、电子设备及介质,以下进行详细介绍。
如图1所示,本申请实施例提供一种数据处理方法,该方法应用于电子设备,以下以该电子设备为服务器为例进行说明,该方法包括:
S101、将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移。
本申请实施例中的主数据结构可以为单链表或单向切片,相应地,辅助数据结构也可以为单链表或单向切片。
其中,主数据结构和辅助数据结构中的数据均以键值对(key-value)的形式缓存,当主数据结构中缓存的数据存在大量的键值对冲突时,可以开始将主数据结构中缓存的数据向辅助数据结构中转移。其中,辅助数据结构所占用的内存空间大于主数据结构所占用的内存空间,如此,可以尽量避免辅助数据结构中出现键值对冲突。
其中,在数据转移过程中,需要重新计算各数据的哈希值,从而将主数据结构中存在冲突的键值对转移到辅助数据结构的不同结点中。
S102、如果接收到针对待访问数据的数据访问请求,则暂停数据转移,从主数据结构中查找待访问数据。
其中,上述数据访问请求可以为来自客户端的数据访问请求,或者是服务器执行服务过程中在需要获取执行该服务所需的数据时产生的数据访问请求。
S103、如果从主数据结构中查找到待访问数据,则基于查找到的待访问数据处理数据访问请求,并继续进行数据转移。
如果该数据访问请求为来自客户端的数据访问请求,则服务器可在查找到待访问数据后,向客户端发送携带待访问数据的数据访问响应;如果该数据访问请求为服务器产生的数据访问请求,则服务器可以直接获取查找到的待访问数据。
S104、如果未从主数据结构中查找到待访问数据,则从辅助数据结构中查找待访问数据,基于查找到的待访问数据处理数据访问请求,并继续进行数据转移,直至主数据结构中缓存的数据被全部转移到辅助数据结构。
其中,在主数据结构中缓存的数据被全部转移到辅助数据结构后,辅助数据结构即可被作为主数据结构,相应地,原来的主数据结构将被删除。
在一种实施方式中,如果从主数据结构和辅助数据结构中均未查找到待访问数据,说明待访问数据未被缓存在二级内存中,这种情况下可以继续从内存或者硬盘中查询待访问数据。
采用上述技术方案,可以将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移,在数据转移过程中,如果接收到针对待访问数据的数据访问请求,那么则可以暂停数据转移,优先从主数据结构中查找待访问数据,如果未查找到,则可进一步从辅助数据结构中查找待访问数据。如此,通过增加辅助数据结构,使得数据整理过程中也可处理数据访问请求,在处理数据访问请求后,可以继续进行数据转移。既实现了数据整理,又避免了数据整理过程影响业务的运行。
在本申请另一实施例中,图1所示的方法还可以应用于对数据压缩整理的过程中,假设二级缓存中所需缓存的数据变少,即主数据结构中出现了大量的空闲结点,则可以对数据进行压缩整理,这种情况下,辅助数据结构所占用的内存空间小于主数据结构所占用的内存空间。
可以看出,本申请实施例中对数据结构的整理或扩容不是一次性集中式德完成,而是可以分为多次进行滚动式的完成,降低数据整理过程对服务器性能的影响。
在本申请另一实施例中,在上述数据转移过程中,如果接收到针对待写入数据的数据写入请求,则暂停数据转移,将待写入数据写入辅助数据结构,在待写入数据写入成功后,继续进行数据转移。
可见,在数据整理过程中,如果需要向二级缓存中写入待写入数据,则可以将待写入数据写入辅助数据结构中,避免了因数据整理而不能向二级缓存中写入数据的问题。
在本申请另一实施例中,提供了两种触发上述S101的情形,以下分别进行说明。
情形一、检测主数据结构中缓存的键值对的冲突率,如果该冲突率达到预设冲突率阈值,则在二级缓存中创建辅助数据结构,并执行上述S101,将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移。
其中,预设冲突率阈值可以根据实际需求提前设置。
情形二、如果指定时长内接收到的待写入数据的数据量大于预设数据量阈值,则在二级缓存中创建辅助数据结构,并将待写入数据写入辅助数据结构,在将待写入数据全量写入辅助数据结构后,执行上述S101,将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移。
在本申请实施例中,如果短时间内存在大量的待写入数据,将这些待写入数据写入主数据结构所需的时间较长,长时间的数据写入可能会影响电子设备读取主数据结构中缓存的数据。所以这种情况下可以进行数据扩容,创建一个辅助数据结构,在将待写入数据写入辅助数据结构的过程中,如果接收到数据访问请求,则可以暂停数据写入过程,在处理数据访问请求之后,继续进行数据写入。如此当大量待写入数据需要写入二级缓存中时,可以通过滚动式增加的方式逐渐将待写入数据写入辅助数据结构,不会影响服务器的代码执行。
本申请实施例的上述实现方式可以应用于主数据结构中已经缓存了需要被频繁访问的数据的场景下。在另一种实施方式中,可以在初始化过程中,从内存或者硬盘中读取指定数据,将指定数据缓存于二级缓存的主数据结构中。
其中,指定数据为预先设置的需要被频繁访问的数据。
采用该方法,因为指定数据是需要被频繁访问的数据,相比于相关技术中在这部分数据被频繁访问后再写入二级缓存中,本申请实施例中在初始化过程中直接将指定数据缓存于二级缓存中,可以进一步提高数据访问速度,在代码层面实现了内存数据的缓存和查询。
以下结合具体场景对本申请实施例提供的数据整理方法进行介绍,如图2所示,该方法包括:
S201、服务器在系统初始化时,将从内存和/或硬盘中读取的指定数据以单链表的形式写入二级缓存中。
如图3所示,图3中示例性地示出了单链表包括的5个结点,每个结点中包括一个键值对(例如,结点1中的key-value和结点5中的key-value)和一个指针“next”,指针用于指示后继结点的地址信息。
后续服务器还可以将被频繁访问的其他数据写入上述单链表中。
S202、当单链表中的数据量逐步增长后,如果存在多个数据的key值发生冲突的情况,将多个冲突的键值对缓存于一个结点中,并通过指针相连。
如图4所示,如果经计算,两个数据的key值相同,则这两个数据都需要写入同一个结点中,比如图4中的结点3。这种情况下,可以将这两个数据的键值对(key-value)都缓存于结点3中,两个键值对之间通过指针“next”相连。
可以理解的是,随着被写入单链表中的数据增多,可能会存在一个结点中缓存多个冲突的键值对的情况,将会导致从单链表中查询数据的耗时边长,这对于追求速度的应用影响较大。
作为示例,假设结点3中缓存了5个key值相同的键值对,比如key均为3,value值分别为北京、上海、合肥、杭州、西安。如果需要查询的数据为“西安”,则首先将计算出key值为3,然后查找到结点3中的键值对1(3:北京);通过键值对1的指针,可以查找到结点3中的键值对2(3:上海);通过键值对2的指针,可以查找到结点3中的键值对3(3:合肥);依次按照这种方式查找,通过5次查找才可以查找到“西安”这一数据,显然查询所需的时间会边长。
所以,当单链表中的键值对冲突率达到预设冲突率阈值时,可以执行S203,以对键值对进行整理。
S203、当单链表中的键值对冲突率达到预设冲突率阈值时,创建辅助单向切片。
S204、将单链表中的数据转移到辅助单向切片中。
其中,在将单链表中的数据转移到辅助单向切片的过程中,需重新计算各数据的哈希值,以使得数据被分散的缓存于辅助单向切片的各节点中,避免键值对冲突。
S205、如果接收到针对待访问数据的数据访问请求,则暂停数据转移过程,并处理数据访问请求。
其中,服务器可以优先从单链表中查询待访问数据,如果未查找到,说明待访问数据可能已经被转移到单向切片中,所以可以继续从单向切片中查找待查询数据。
S206、在处理数据访问请求后,继续将单链表中的数据转移到辅助单向切片中,直至单链表中的数据全部被转移到辅助单向切片中。
在此过程中,如果再次接收到数据访问请求,则再次暂停数据转移过程,优先处理数据访问请求,从而实现了对数据整理的过程不影响服务器的业务执行。
对应于上述方法实施例,本申请实施例还提供了一种数据处理装置,如图5所示,该装置包括:
转移模块501,用于将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移;
查找模块502,用于如果接收到针对待访问数据的数据访问请求,则触发转移模块暂停数据转移,从主数据结构中查找待访问数据;如果从主数据结构中查找到待访问数据,则基于查找到的待访问数据处理数据访问请求,并触发转移模块501继续进行数据转移;
查找模块502,还用于如果未从主数据结构中查找到待访问数据,则从辅助数据结构中查找待访问数据,基于查找到的待访问数据处理数据访问请求,并触发转移模块501继续进行数据转移,直至主数据结构中缓存的数据被全部转移到辅助数据结构。
在本申请另一实施例中,该装置还包括:
写入模块,用于在转移模块501进行数据转移过程中,如果接收到针对待写入数据的数据写入请求,则触发转移模块501暂停数据转移,将待写入数据写入辅助数据结构;以及在待写入数据写入成功后,触发转移模块501继续进行数据转移。
在本申请另一实施例中,该装置还包括:
初始化模块,用于在初始化过程中,从内存或者硬盘中读取指定数据,将指定数据缓存于二级缓存的主数据结构中。
在本申请另一实施例中,主数据结构中的数据以键值对的形式缓存,该装置还包括:
检测模块,用于检测主数据结构中缓存的键值对的冲突率;
创建模块,用于如果冲突率达到预设冲突率阈值,则在二级缓存中创建辅助数据结构,并触发转移模块501执行将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移的步骤。
在本申请另一实施例中,该装置还包括:
创建模块,用于如果指定时长内接收到的待写入数据的数据量大于预设数据量阈值,则在二级缓存中创建辅助数据结构;
写入模块,用于将待写入数据写入辅助数据结构;在将待写入数据全量写入辅助数据结构之后,触发转移模块501执行将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移的步骤。
采用上述技术方案,可以将二级缓存的主数据结构中缓存的数据向二级缓存的辅助数据结构中转移,在数据转移过程中,如果接收到针对待访问数据的数据访问请求,那么则可以暂停数据转移,优先从主数据结构中查找待访问数据,如果未查找到,则可进一步从辅助数据结构中查找待访问数据。如此,通过增加辅助数据结构,使得数据整理过程中也可处理数据访问请求,在处理数据访问请求后,可以继续进行数据转移。既实现了数据整理,又避免了数据整理过程影响业务的运行。
本发明实施例还提供了一种电子设备,如图6所示,包括处理器601、通信接口602、存储器603和通信总线604,其中,处理器601,通信接口602,存储器603通过通信总线604完成相互间的通信,
存储器603,用于存放计算机程序;
处理器601,用于执行存储器603上所存放的程序时,实现上述方法实施例中的方法步骤。
上述电子设备提到的通信总线可以是外设部件互连标准(Peripheral ComponentInterconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口用于上述电子设备与其他设备之间的通信。
存储器可以包括随机存取存储器(Random Access Memory,RAM),也可以包括非易失性存储器(Non-Volatile Memory,NVM),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
在本发明提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一数据处理方法的步骤。
在本发明提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一数据处理方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本发明的较佳实施例,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。