本申请涉及服务器技术领域,尤其涉及一种服务器数据缓存方法、装置及服务器。
背景技术
服务器是网络中为客户端计算机提供各种服务的高性能的计算机。服务器在网络操作系统的控制下能将其相连的设备提供给网络上的客户点共享,亦能为网络用户提供几种计算、信息发布及数据管理等服务。
在服务器对下发数据时,为提高效率以及并发量,会对数据进行缓存。而目前所用的主流服务器主要是多进程进行工作,如nginx(enginex)服务器,主要通过多个工作进程来共同承担来自外部的请求,因此在服务器对下发数据时需要对每个工作进程进行数据缓存。同时,在服务器使用过程中,为保证各工作进程内数据的实时性和精确性,每个工作进程内缓存的数据需要不断进行缓存更新。
目前,而服务器的多进程工作方式导致在各工作进程进行数据存储与更新时,需要每个工作进程均是单独实现的数据存储与更新,即每个工作进程单独从服务器中获取数据然后对数据进行缓存存储和更新。因为每个工作进程都从服务器中获取数据进行进程内数据缓存和更新,占用了大量服务器接口资源,严重影响了服务器接口的访问速度,造成数据缓存以及更新效率低,无法保证数据的实时性和精确性。
技术实现要素:
本申请提供了一种服务器数据缓存方法、装置及服务器,提高服务器下发数据时数据缓存以及更新效率,保证数据的实时性和精确性。
第一方面,本申请提供了一种服务器数据缓存方法,所述方法包括:
根据第一工作进程接收到的请求从服务器中获取数据,将所述数据缓存至所述第一工作进程的内存,获得第一缓存数据;
将所述第一缓存数据写入共享内存,获得共享数据,所述共享数据包括数据更新序列号和第一缓存数据,所述数据更新序列号与所述第一缓存数据一一对应;
当更新所述第一缓存数据时,更新所述共享数据的数据更新序列号和第一缓存数据;
第二工作进程定期读取所述共享内存内的共享数据,获取当前时刻读取到的数据更新序列号和所述第二工作进程存储的数据更新序列号的差值,根据所述差值更新所述第二工作进程的缓存数据。
第二方面,本申请还提供了一种服务器数据缓存装置,所述服务器数据缓存装置包括处理器和存储器;
所述存储器,用于存储程序代码;
所述处理器,用于读取所述存储器中存储的程序代码,并作为具体部件执行上述任意一项所述的服务器数据缓存方法。
第三方面,本申请还提供了一种服务器,所述服务器包括服务器数据缓存装置,所述服务器数据缓存装置为上述所述的服务器数据缓存装置。
本申请提供的服务器数据缓存方法、装置及服务器,其中,所述方法中,当第一工作进程接收到的请求从服务器中获取数据,将获取的数据缓存至第一工作进程自身内存,获得第一缓存数据;在将数据缓存至第一工作进程自身内存的第一缓存数据时,将所述数据写入共享内存,获得共享数据;当第一工作进程进行其进程内存数据更新的时候,更新共享内存内的共享数据;当第二工作进程定期读取共享内存内的共享数据,进行第二工作进程自身内存内缓存数据的更新。如此,将缓存入第一工作进程的数据写入共享内存,根据第一工作进程自身缓存数据的更新,更新共享内存的共享数据,根据共享内存的共享数据进行第二工作进程内数据的缓存和更新,第二工作进程内数据的缓存和更新不需要占有服务器接口,节省大量服务器接口资源,保证服务器接口的访问速度。因此本申请提供的服务器数据缓存方法,解决了原有各工作进程内数据缓存和更新的数据需要从服务器中获取、大量占有服务器接口资源的问题,保证服务器接口的访问速度,有助于提高数据缓存以及更新效率,保证数据的实时性和精确性。
附图说明
为了更清楚地说明本申请的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的服务器数据缓存方法的结构流程图;
图2为本申请实施例提供的服务器数据缓存装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本申请实施例提供的服务器数据缓存方法,应用于服务器,所述服务器包含多个工作进程,根据终端或其他服务的访问请求,进行分配工作进程处理相应请求的处理。为便于对本申请实施例提供的技术方案的描述,将服务器中多个工作进程中的任意一个称作第一工作进程,第一工作进程以外其他任意进程统称为第二工作进程。
附图1,为本申请实施例提供的一种服务器数据缓存方法的结构流程图。如附图1所示,本申请实施例提供的服务器数据缓存方法包括:
s100:根据第一工作进程接收到的请求从服务器中获取数据,将所述数据缓存至所述第一工作进程的内存,获得第一缓存数据。
服务器开始工作后,当终端或其他服务发送请求,服务器分配一个工作进程进行该请求的处理,为便于描述,记所述工作进程为第一工作进程。所述第一工作进程根据接收到的请求,从服务器中获取数据,将获取到的数据缓存至所述第一工作进程的内存,获得第一缓存数据。终端或其他服务访问服务器可直接读取第一缓存数据。
为不影响终端或其他服务请求的返回速度,启动异步任务,异步任务首先将第一工作进程获取到的数据缓存至自身进程的内存。
s200:将所述第一缓存数据写入共享内存,获得共享数据,所述共享数据包括数据更新序列号和第一缓存数据,所述数据更新序列号与所述第一缓存数据一一对应。
在第一工作进程将获取到的数据缓存至自身内存后,获得第一缓存数据,将所述第一缓存数据写入共享内存,生成共享数据。为便于共享数据的使用,在将数据写入共享内存的时候按照一定的格式写入。在本申请具体实施方式中,生成的共享数据包括两部分,第一部分为数据更新序列号,第二部分为第一缓存数据,即缓存入第一工作进程中的第一缓存数据内容本身,对应第一工作进程将获取到的数据,其中,数据更新序列号和第一缓存数据一一对应。
在本申请具体实施方式中,建立共享内存是指在服务器进程初始化的时候,开辟一进程间共享内存,供各进程进行数据读写访问。该共享内存用作进程间的共享内存,但因为进程自身内存的读取速度要比进程间共享内存的读取速度快的多,所以该共享内存只是用来作为数据变化通知、更新使用,不提供各工作进程的业务缓存读写。
在本申请具体实施方式中,当第一工作进程将获取到的第一缓存数据写入共享内存时,数据以key-value形式写入共享内存。即,共享数据的数据更新序列号和第一缓存数据均以key-value的形式存在。具体的,第一部分,key定义为event_type,对应的value值用数字表示如“1”、“2”、“3”等;第二部分,key为event_data_i,其中i对应event_type对应的value值,如event_data_1、event_data_2、event_data_3等,该key对应的value则为具体需要各进程去存储或者更新到自身进程的缓存的内容,value用json或xml等形式存储,如{“data_type”:”data_content”}。第一部分,event_type的value为数字,且只存在一个key、value,存储空间小。
更进一步,共享数据的第二部分包括过期时间,保证共享内存的可回收性。具体的,在event_data_i中设置过期时间,存储占用空间小。
s300:当更新所述第一缓存数据时,更新所述共享数据的数据更新序列号和第一缓存数据。
当第一工作进程的缓存数据进行更新时,即更新第一缓存数据,根据更新后的第一缓存数据更新共享数据,即更新共享数据的数据更新序列号和第一缓存数据。具体的,所述第一工作进程读取所述共享内存的数据更新序列号,将所述数据更新序列号加1后写入共享内存,并将更新后的第一缓存数据写入共享内存,更新共享内存中原有的第一缓存数据,加1后写入共享内存的数据更新序列号与更新后的第一缓存数据相对应。如每当第一工作进程的缓存数据更新时,更新第一工作进程的缓存数据,同时读取共享内存event_type的值,并且对该值加1,接着写入event_data_i,以及该key对应的value。
具体的,当更新所述第一工作进程的缓存数据时,更新所述共享数据的数据更新序列号和第一缓存数据,包括:
设置第一进程数据过期时间;
当达到所述第一进程数据过期时间,更新所述第一缓存数据,根据更新后的所述第一缓存数据更新所述共享数据的数据更新序列号和第一缓存数据。
第一工作进程内设置第一进程数据过期时间,当达到第一进程数据过期时间,认为第一工作进程的缓存数据需要更新了,第一工作进程主动从服务器中重新获取数据从而更新其进程内的缓存数据,获得更新后的第一缓存数据。根据更新后的第一缓存数据,进行共享数据的数据更新序列号和第一缓存数据的更新。
另外,本申请具体实施方式中,当更新所述第一工作进程的缓存数据时,更新所述共享数据的数据更新序列号和第一缓存数据,包括:
当所述第一工作进程接收到数据更新通知时,根据所述数据更新通知,更新所述第一缓存数据时,根据更新后的所述第一缓存数据更新所述共享数据的数据更新序列号和第一缓存数据。
即服务器建立业务通知消息机制,当服务器内数据发生了更新则会发出数据更新通知,第一工作进程接收服务关于缓存数据的数据更新通知,根据所述数据更新通知从服务器中重新获取数据从而更新其进程内的缓存数据,即更新第一缓存数据。根据更新后的第一缓存数据,进行共享数据的数据更新序列号和第一缓存数据的更新。
s400:第二工作进程定期读取所述共享内存内的共享数据,获取当前时刻读取到的数据更新序列号和所述第二工作进程存储的数据更新序列号的差值,根据所述差值更新所述第二工作进程的缓存数据。
当有第一工作进程外的其他工作进程被分配用于处理终端或其他服务的请求时,记所述其他工作进程为第二工作进程。第二工作进程根据接收到的请求读取共享内存内的共享数据,从共享内存内的共享数据中获取数据,将获取到的数据缓存至所述第二工作进程的内存,获得第二工作进程的缓存数据。终端或其他服务访问服务器可直接读取第二工作进程的缓存数据。第二工作进程通过再次读取所述共享内存内的共享数据,当所述共享内存内的共享数据发生更新的时候更新其缓存数据。具体的在本申请中,第二工作进程定期读取所述共享内存内的共享数据,实现第二工作进程主动定期更新其缓存数据。
在本申请具体实施方式中,第二工作进程定期读取所述共享内存内的共享数据,包括:
设置第二工作进程读取所述共享内存内的共享数据的时间间隔;
根据所述时间间隔读取所述共享内存内的共享数据。
读取所述共享内存内的共享数据的时间间隔,通常根据服务器本身使用环境,若是服务器内数据更新比较频繁,则将所述时间间隔设置相对短一些如2s、3s等,通常在5s以内;若是服务器内数据只是偶尔更新,则将所述时间间隔设置相对长一些如5s、6s等,通常在20s以内,时间间隔的具体设置可根据实际需要任意选择。第二工作进程根据所述时间间隔定期读取共享内存内的共享数据。
具体的,第二工作进程读取共享内存内的共享数据,轮询共享内存内的共享数据,获取当前时刻读取到的数据更新序列号和所述第二工作进程存储的数据更新序列号的差值,根据所述差值更新所述第二工作进程的缓存数据,即根据共享内存内共享数据的数据更新序列号与第二工作进程存储的数据更新序列号的差值,获取所述差值范围内数据更新序列号对应共享内存内共享数据的第一缓存数据,将所述缓存数据以及相应的数据更新序列号存储至第二工作进程的内存,实现第二工作进程的缓存数据的更新。
如,第二工作进程定期从共享内存中读取event_type,并且记录event_type的值,当本次读取到event_type对应的value值与本进程之前存储的event_type值发生变化时,计算两次读取到value值的差值,差值部分即对应的event_data_i为还未更新过的内容,则将所述未更新过的内容缓存至第二工作进程的内存。假设,第二工作进程当前记录的event_type为100,若读取到的共享内存里的event_type的值为103,则说明event_type_101、event_type_102和event_type_103对应的value值是未更新内容,读取该event_type_101、event_type_102和event_type_103对应的value值,并将其缓存至第二工作进程,实现第二工作进程自身缓存的更新。因为event_type对应的value只是一个数字,所以读取数据带来的性能损耗可以忽略不计。
本申请提供的服务器数据缓存方法中,当第一工作进程接收到的请求从服务器中获取数据,将获取的数据缓存至第一工作进程自身内存,获得第一缓存数据;在将数据缓存至第一工作进程自身内存的第一缓存数据时,将所述数据写入共享内存,获得共享数据;当第一工作进程进行其进程内存数据更新的时候,更新共享内存内的共享数据;当第二工作进程定期读取共享内存内的共享数据,进行第二工作进程自身内存内缓存数据的更新。如此,将缓存入第一工作进程的数据写入共享内存,根据第一工作进程自身缓存数据的更新,更新共享内存的共享数据,根据共享内存的共享数据进行第二工作进程内数据的缓存和更新,第二工作进程内数据的缓存和更新不需要占有服务器接口,节省大量服务器接口资源,保证服务器接口的访问速度。并且各个工作进程不需要关心存储到本进程的数据内容,即与业务不发生耦合,只是简单的存储,更加便于数据的缓存。因此本申请提供的服务器数据缓存方法,解决了原有各工作进程内数据缓存和更新的数据需要从服务器中获取、大量占有服务器接口资源的问题,保证服务器接口的访问速度,有助于提高数据缓存以及更新效率,保证数据的实时性和精确性。
进一步,本申请实施例提供的服务器数据缓存方法中,所述根据所述差值更新所述第二工作进程的缓存数据,包括:
判断所述当前时刻读取到的数据更新序列号对应的数据是否可读;
当所述当前时刻读取到的数据更新序列号对应的数据可读时,根据所述当前时刻读取到的数据更新序列号以及其对应的数据缓存更新所述第二工作进程的缓存数据。
由于第二工作进程在读取数据更新序列号接着去读取其对应的数据,在某些时候,读取到数据更新序列号发生变化,而数据还在写入过程中,造成读取其对应的数据失败,导致第二工作进程内数据更新失败,重新读取其对应的数据。如当第一工作进程刚向共享内存写入event_type后,第二工作进程的定时任务,恰好读到了该event_type值的变化,则接着去读event_data_i。由于第一工作进程还没将event_data_i的value值写入共享内存,而第二工作进程却去读event_data_i的value,所以会出现无法读取数据的情况。为保证第二工作进程内数据的更新,重新读取该event_data_i的value。
本申请具体实施方式中,为解决此问题,在第二工作进程读取共享内存内共享数据时,读取到数据更新序列号后,判断当前时刻读取到的数据更新序列号对应的数据是否可读,当所述当前时刻读取到的数据更新序列号对应的数据可读时,根据当前时刻读取到的数据更新序列号以及其对应的数据缓存更新第二工作进程的缓存数据。即,第二工作进程读取到event_type值的变化时,先判断此event_type对应event_data_i的value是否可读,当可读取时,读取event_data_i的value。
基于本申请实施例提供的服务器数据缓存方法,本申请实施例还提供了一种服务器数据缓存装置。如附图2所示,本申请实施例提供的服务器数据缓存装置200包括处理器201和存储器202;
所述存储器202,用于存储程序代码;
所述处理器201,用于读取所述存储器202中存储的程序代码,并作为具体部件执行上述实施例所述的服务器数据缓存方法。
其中,处理器201内部设置有微存储器,用于存储程序,程序可以包括程序代码,程序代码包括计算机操作指令。微存储器可能包含随机存取存储器(randomaccessmemory,简称ram),也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。当然,微存储器可以为一个,也可以根据需要,为多个微处理器。微处理器,用于读取存储器202中存储的程序代码。存储器202,用于存储服务器数据缓存程序。
基于本申请实施例提供的服务器数据缓存装置,本申请实施例还提供了一种服务器,所述服务器包括服务器数据缓存装置,所述服务器数据缓存装置为上述实施例所述的服务器数据缓存装置。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处,相关之处参见方法实施例的部分说明即可。本领域技术人员在考虑说明书及实践这里的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未发明的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。