发明内容
本申请实施例提供了一种数据处理方法、装置及计算机存储介质,可以保证获取到到的数据是最近更新的数据。所述技术方案如下:
一方面,提供了一种数据处理方法,所述方法包括:
接收携带数据标识的数据处理请求,所述数据处理请求包括数据更新请求和数据查询请求中的任一个;
根据所述数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行,所述多个进程中每个进程启动有多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求;
根据所述数据标识,从选择的进程启动的多个内存队列中选择一个内存队列;
将所述数据处理请求添加至选择的内存队列,所述选择的内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的。
在一种可能的示例中,所述数据处理请求包括数据更新请求;
所述将所述数据处理请求添加至选择的内存队列,包括:
根据所述数据更新请求,生成删除缓存操作请求和更新数据库操作请求;
将所述删除缓存操作请求和所述更新数据库操作请求依次添加至所述选择的内存队列。
在一种可能的示例中,所述数据处理请求包括数据查询请求;
所述将所述数据处理请求添加至选择的内存队列,包括:
从服务器的缓存中的查找与所述数据标识对应的数据;
当查找到与所述数据标识对应的数据时,将所述数据查询请求添加至所述选择的内存队列。
在一种可能的示例中,所述从服务器的缓存中的查找与所述数据标识对应的数据,包括:
当没有查找到与所述数据标识对应的数据时,根据所述查询请求,生成更新缓存操作请求和读取数据操作请求;
将所述更新缓存操作请求和所述读取数据操作请求依次添加至所述选择的内存队列。
在一种可能的示例中,所述根据所述数据标识,从多个进程中选择一个进程,包括:
对所述数据标识进行哈希求值,得到所述数据标识的哈希值;
根据所述哈希值从所述多个进程中选择一个进程,所述多个进程与多个哈希值一一对应。
在一种可能的示例中,所述根据所述待处理数据的标识,从选择的进程启动的多个内存队列中选择一个内存队列,包括:
将所述数据标识对所述哈希值进行取余;
根据取余后的数值从所述多个内存队列中选择一个内存队列。
另一方面、提供了一种数据处理装置,所述装置包括:
接收模块,用于接收携带数据标识的数据处理请求,所述数据处理请求包括数据更新请求和数据查询请求中的任一个;
第一选择模块,用于根据所述数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行,所述多个进程中每个进程启动有多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求;
第二选择模块,用于根据所述数据标识,从选择的进程启动的多个内存队列中选择一个内存队列;
添加模块,用于将所述数据处理请求添加至选择的内存队列,所述选择的内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的。
在一种可能的示例中,所述数据处理请求包括数据更新请求;
所述添加模块,具体用于:
根据所述数据更新请求,生成删除缓存操作请求和更新数据库操作请求;
将所述删除缓存操作请求和所述更新数据库操作请求依次添加至所述选择的内存队列。
在一种可能的示例中,所述数据处理请求包括数据查询请求;
所述添加模块,具体用于:
从服务器的缓存中的查找与所述数据标识对应的数据;
当查找到与所述数据标识对应的数据时,将所述数据查询请求添加至所述选择的内存队列。
在一种可能的示例中,所述添加模块,还具体用于:
当没有查找到与所述数据标识对应的数据时,根据所述查询请求,生成更新缓存操作请求和读取数据操作请求;
将所述更新缓存操作请求和所述读取数据操作请求依次添加至所述选择的内存队列。
在一种可能的示例中,所述第一选择模块,具体用于:
对所述数据标识进行哈希求值,得到所述数据标识的哈希值;
根据所述哈希值从所述多个进程中选择一个进程,所述多个进程与多个哈希值一一对应。
在一种可能的示例中,所述第二选择模块,具体用于:
将所述数据标识对所述哈希值进行取余;
根据取余后的数值从所述多个内存队列中选择一个内存队列。
另一方面、提供了一种数据处理装置,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述任一数据处理方法所述的步骤。
另一方面、提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,所述指令被处理器执行时实现上述任一数据处理方法所述的步骤。
另一方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行实现上述任一数据处理方法所述的步骤。
本申请实施例提供的技术方案带来的有益效果是:
在本申请中,在接收到携带数据标识的数据处理请求时,不管该数据处理请求为数据更新请求还是数据查询请求,均根据该数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行。由于每个进程启动有一个或多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求,因此,可以根据该数据标识继续从选择的进程启动的多个内存队列中选择一个内存队列,并将数据处理请求添加至选择的内存队列中。由此可知,在本申请中,针对同一数据的所有数据处理请求均被添加至同一个内存队列中了,而内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的,因此,在接收到数据更新请求之后,即使接收到针对同一数据的数据查询请求,由于内存队列中该数据查询请求位于数据更新请求的后面,因此在该数据更新请求未被处理完成之前,该数据查询请求将不会被处理,只有在该数据更新请求处理完成之后,该数据查询请求才会被处理,如此可以保证基于数据查询请求获取的数据是更新后的数据。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在对本申请实施例进行解释说明之前,先对本申请实施例涉及的应用场景进行解释说明。由于缓存的响应速度要远远大于数据库的响应速度,因此,将数据库中的热点数据备份至缓存之后,服务器在访问热点数据时,便可直接从缓存中访问该热点数据。只有在访问非热点数据时,才需要从数据库中访问。从而提高了服务器访问数据的整体速度。本申请实施例提供的数据处理方法就应用于对服务器同时配置缓存和数据库的场景中。当然,也可以应用于其他同时配置缓存和数据库的场景中,比如,可以应用于配置多级存储介质的终端中,本申请对此不作具体限定。
图1是本申请实施例提供的一种数据处理方法流程图,如图1所示,该方法包括如下几个步骤:
步骤101:接收携带数据标识的数据处理请求,数据处理请求包括数据更新请求和数据查询请求中的任一个。
在本申请实施例中,为了保证从服务器在更新数据之后基于数据查询请求获取的数据是更新之后的数据,对于任何数据处理器请求,不管该数据处理请求为数据更新请求还是数据查询请求,均通过下述步骤102至步骤104将该数据处理请求添加至内存队列中。
数据标识用于区分不同用户的数据,该数据标识可以为该数据所属的用户的标识。比如,对于直播过程中的任一用户,该用户在直播过程中产生一些数据,其他用户可以对该用户的数据进行访问。如此,可以采用每个用户的直播账号来区分不同用户的数据。
步骤102:根据该数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行,多个进程中每个进程启动有多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求。
由于不同的进程之间可以并行处理,因此,在本申请实施例中,预先配置有多个线程,用于同时处理不同的数据处理请求,从而提高服务器处理数据的速度。进一步地,为了使得携带数据标识相同的数据处理请求由同一进程执行,在接收到携带数据标识的数据处理请求时,需要先根据该数据标识从多个进程中选择一个进程。
需要说明的是,在本申请实施例中,携带同一数据标识的数据处理请求由同一进程处理。而一个进程是可以处理与多个不同数据标识分别对应的数据处理请求的。比如,携带数据标识A的数据处理请求均有线程一执行,携带数据标识B的数据处理请求也可以均有线程一执行,只需保证携带同一数据标识的数据处理请求由同一进程处理即可。
因此,在一种可能的实现方式中,步骤102的实现方式可以为:对该数据标识进行哈希求值,得到数据标识的哈希值;根据该哈希值从多个进程中选择一个进程,多个进程与多个哈希值一一对应。
由于哈希计算具有这样的特点:每个数据存在唯一对应的哈希值,但是不同的数据可以对应同一个哈希值。因此,在通过上述实现方式从多个进程中选择一个进程时,便可实现同一数据标识的数据处理请求由同一进程处理,而同一进程可以处理不同的数据标识的数据处理请求。
另外,为了保证针对同一数据标识的数据处理请求按照先后顺序依次执行,每个线程启动有多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求。也即是,每个内存队列对应一个数据标识。比如,携带数据标识A、数据标识B的数据处理请求均有进程一处理,具体地,将携带数据标识A的数据处理器请求与内存队列一对应,将携带数据标识B的数据处理器请求与内存队列二对应。
步骤103:根据该数据标识,从选择的进程启动的多个内存队列中选择一个内存队列。
基于步骤102可知,多个进程中每个进程启动有多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求。因此,在选择出进程之后,还可以根据该数据标识,从选择的进程启动的多个内存队列中继续选择一个内存队列。
基于步骤102可知,可以通过哈希计算的方式选择进程,因此,步骤103的实现方式可以为:将数据标识对哈希值进行取余;根据取余后的数值从多个内存队列中选择一个内存队列。虽然不同的数据标识可以对应同一哈希值,但是对应同一哈希值的不同的数据标识在对该哈希值取余后的数值肯定是不同的,因此,便可将内存队列和对哈希值取余后的数值对应起来,以便于步骤103中根据该数据标识选择一个内存队列。
步骤104:将该数据处理请求添加至选择的内存队列,选择的内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的。
在通过步骤103选择出内存队列之后,便可根据步骤104将该数据处理请求添加至选择的内存队列。
在本申请实施例中,每个线程在启动多个内存队列之后,还可以继续启动与多个内存对应一一对应的多个消费线程,以使每个消费线程并行地处理各自对应的内存队列中的数据处理请求。进一步提高了服务器处理数据的速度。
每个消费线程按照添加的时间从早到晚的顺序依次处理对应的内存队列中的数据处理请求。通过步骤102和步骤103可知,每个消费线程处理的是同一数据标识的数据处理请求。不同数据标识的数据处理请求由不同的消费线程处理。
另外,对于同时配置数据库和缓存的的服务器,更新数据的过程包括两个操作,一个是更新数据库的操作,一个是删除缓存的操作。因此,如果步骤101中的数据处理请求为数据更新请求时,步骤104中将数据处理请求添加至选择的内存队列的实现方式可以为:根据该数据更新请求,生成删除缓存操作请求和更新数据库操作请求;将删除缓存操作请求和更新数据库操作请求依次添加至选择的内存队列。
将删除缓存操作请求和更新数据库操作请求依次添加至选择的内存队列是指,将删除缓存操作请求放置在更新数据库操作请求的前面,以使消费线程先执行删除缓存操作,再执行更新数据库的操作。
另外,对于同时配置数据库和缓存的的服务器,服务器查询数据时通常是先查询缓存再查询数据库的,因此,如果步骤101中的数据处理请求为数据查询请求时,步骤104中将数据处理请求添加至选择的内存队列的实现方式可以为:从服务器的缓存中的查找与数据标识对应的数据;当查找到与数据标识对应的数据时,将数据查询请求添加至选择的内存队列。
相应地,当没有查找到与数据标识对应的数据时,根据查询请求,生成更新缓存操作请求和读取数据操作请求;将更新缓存操作请求和读取数据操作请求依次添加至选择的内存队列。
也即是,在本申请实施例中,如果步骤101中的数据处理请求为数据查询请求时,如果缓存中没有该数据标识对应的数据,为了便于后续读取该数据标识对应数据,可以在此次查询数据时,先将该数据标识对应的数据备份至缓存。
上述是将更新缓存操作请求和读取数据操作请求依次添加至选择的内存队列,也可以将读取数据操作请求和更新缓存操作请求依次添加至选择的内存队列,在此不做具体限定。
可选地,如果步骤101中的数据处理请求为数据查询请求,也可以直接将该数据查询请求添加到内存队列,当消费线程消费到该数据查询请求时,可以从服务器的缓存中的查找与数据标识对应的数据;当查找到与数据标识对应的数据时获取该数据。如果没有查找到,则从数据库中获取该数据。
图2是本申请实施提供的一种数据处理架构示意图。如图2所示,当服务器接收到数据处理请求时,服务器根据该数据标识从多个进程中选择一个进程,在选择的进程内,该进程包括多个内存队列,每个内存队列由一个消费线程来消费。服务器根据该数据标识继续选择一个内存队列,然后将该数据处理请求添加至选择的内存队列中。
图2中的服务器可以为nginx代理服务器或路由层上的服务器,用于处理各个用户的数据处理请求。
另外,上述将各个请求添加至内存队列时,可以将请求封装成消息体,然后将封装后的消息体添置至内存队列中,在此不再详述。
下面举例说明本申请实施例提供的数据处理方法的技术效果:
假设用户A和用户B都要对同一用户C的数据进行操作。用户A此时要进行一个数据更新的操作,会将删除缓存请求和更新数据库操作请求依次放到选择的内存队列里,该内存队列和用户C对应。如果与该内存队列对应的消费线程消费了删除缓存操作请求后,但还未消费更新数据库操作请求,也就是还未进行数据库的更新操作,那么此时缓存数据会是空的。如果此时服务器收到了用户B针对用户C的数据查询请求,服务器查找缓存是空的,则将更新缓存操作请求和读取数据操作请求依次放到该内存队列里,让更新缓存操作请求和读取数据操作请求在该内存队列里积压。等到之前更新数据库操作请求被消费并执行后,积压的更新缓存操作请求和读取数据操作请求就能被消费到,并重新更新了缓存。此时用户B查询拿到的数据是最新的。
由此可知,在本申请实施例中,在接收到携带数据标识的数据处理请求时,不管该数据处理请求为数据更新请求还是数据查询请求,均根据该数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行。由于每个进程启动有一个或多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求,因此,可以根据该数据标识继续从选择的进程启动的多个内存队列中选择一个内存队列,并将数据处理请求添加至选择的内存队列中。由此可知,在本申请实施例中,针对同一数据的所有数据处理请求均被添加至同一个内存队列中了,而内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的,因此,在接收到数据更新请求之后,即使接收到针对同一数据的数据查询请求,由于内存队列中该数据查询请求位于数据更新请求的后面,因此在该数据更新请求未被处理完成之前,该数据查询请求将不会被处理,只有在该数据更新请求处理完成之后,该数据查询请求才会被处理,如此可以保证基于数据查询请求获取的数据是更新后的数据。
图3是本申请实施例提供的一种数据处理装置,该装置300包括:
接收模块301,用于接收携带数据标识的数据处理请求,数据处理请求包括数据更新请求和数据查询请求中的任一个;
第一选择模块302,用于根据数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行,多个进程中每个进程启动有多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求;
第二选择模块303,用于根据数据标识,从选择的进程启动的多个内存队列中选择一个内存队列;
添加模块304,用于将数据处理请求添加至选择的内存队列,选择的内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的。
在一种可能的示例中,数据处理请求包括数据更新请求;
添加模块,具体用于:
根据数据更新请求,生成删除缓存操作请求和更新数据库操作请求;
将删除缓存操作请求和更新数据库操作请求依次添加至选择的内存队列。
在一种可能的示例中,数据处理请求包括数据查询请求;
添加模块,具体用于:
从服务器的缓存中的查找与数据标识对应的数据;
当查找到与数据标识对应的数据时,将数据查询请求添加至选择的内存队列。
在一种可能的示例中,添加模块,还具体用于:
当没有查找到与数据标识对应的数据时,根据查询请求,生成更新缓存操作请求和读取数据操作请求;
将更新缓存操作请求和读取数据操作请求依次添加至选择的内存队列。
在一种可能的示例中,第一选择模块,具体用于:
对数据标识进行哈希求值,得到数据标识的哈希值;
根据哈希值从多个进程中选择一个进程,多个进程与多个哈希值一一对应。
在一种可能的示例中,第二选择模块,具体用于:
将数据标识对哈希值进行取余;
根据取余后的数值从多个内存队列中选择一个内存队列。
在本申请实施例中,在接收到携带数据标识的数据处理请求时,不管该数据处理请求为数据更新请求还是数据查询请求,均根据该数据标识,从多个进程中选择一个进程,以使携带数据标识相同的数据处理请求由同一进程执行。由于每个进程启动有一个或多个内存队列,每个内存队列用于处理携带的数据标识相同的数据处理请求,因此,可以根据该数据标识继续从选择的进程启动的多个内存队列中选择一个内存队列,并将数据处理请求添加至选择的内存队列中。由此可知,在本申请实施例中,针对同一数据的所有数据处理请求均被添加至同一个内存队列中了,而内存队列中的数据处理请求是按照添加的时间从早到晚的顺序依次被处理的,因此,在接收到数据更新请求之后,即使接收到针对同一数据的数据查询请求,由于内存队列中该数据查询请求位于数据更新请求的后面,因此在该数据更新请求未被处理完成之前,该数据查询请求将不会被处理,只有在该数据更新请求处理完成之后,该数据查询请求才会被处理,如此可以保证基于数据查询请求获取的数据是更新后的数据。
需要说明的是:上述实施例提供的数据处理装置在进行数据处理时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据处理装置与数据处理方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图4是根据一示例性实施例示出的一种服务器结构示意图。该服务器可以是后台服务器集群中的服务器。具体来讲:
服务器400包括中央处理单元(CPU)401、包括随机存取存储器(RAM)402和只读存储器(ROM)403的***存储器404,以及连接***存储器404和中央处理单元401的***总线405。服务器400还包括帮助计算机内的各个器件之间传输信息的基本输入/输出***(I/O***)406,和用于存储操作***413、应用程序414和其他程序模块415的大容量存储设备407。
基本输入/输出***406包括有用于显示信息的显示器408和用于用户输入信息的诸如鼠标、键盘之类的输入设备409。其中显示器408和输入设备409都通过连接到***总线405的输入输出控制器410连接到中央处理单元401。基本输入/输出***406还可以包括输入输出控制器410以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入输出控制器410还提供输出到显示屏、打印机或其他类型的输出设备。
大容量存储设备407通过连接到***总线405的大容量存储控制器(未示出)连接到中央处理单元401。大容量存储设备407及其相关联的计算机可读介质为服务器400提供非易失性存储。也就是说,大容量存储设备407可以包括诸如硬盘或者CD-ROM驱动器之类的计算机可读介质(未示出)。
不失一般性,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、EPROM、EEPROM、闪存或其他固态存储其技术,CD-ROM、DVD或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知计算机存储介质不局限于上述几种。上述的***存储器404和大容量存储设备407可以统称为存储器。
根据本申请的各种实施例,服务器400还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即服务器400可以通过连接在***总线405上的网络接口单元411连接到网络412,或者说,也可以使用网络接口单元411来连接到其他类型的网络或远程计算机***(未示出)。
上述存储器还包括一个或者一个以上的程序,一个或者一个以上程序存储于存储器中,被配置由CPU执行。所述一个或者一个以上程序包含用于进行本申请实施例提供的数据处理方法的指令。
本申请实施例还提供了一种非临时性计算机可读存储介质,当所述存储介质中的指令由服务器的处理器执行时,使得服务器能够执行上述实施例提供的数据处理方法。
本申请实施例还提供了一种包含指令的计算机程序产品,当其在服务器上运行时,使得服务器执行上述实施例提供的数据处理方法。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。