一种数据更新方法及装置
技术领域
本公开涉及计算机技术领域,具体而言,涉及一种数据更新方法及装置。
背景技术
程序在运行过程中,程序员可能需要对某些代码进行修改,修改后的代码在提交之后能同步到运行的程序中,这种更新方式叫做热更新。
Node.js是脚本语言JavaScript的运行环境,由于Node.js并不具备热更新的能力,因此在调用Node.js服务时,一般在检测到代码发生变化之后,可以借助nodemon工具自动重启程序,以将修改的代码应用到程序中。
然而在自动重启程序的过程中,会导致一些暂时存储在内存中的数据将会被清除,从而影响Node.js在调试过程中的调试效率。
发明内容
本公开实施例至少提供一种数据更新方法及装置。
第一方面,本公开实施例提供了一种数据更新方法,包括:
设置目标文件对应的自定义加载处理函数;
通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,其中,所述初始模块对象的引用地址指向所述目标文件的内容在内存中的存储地址;
确定并存储所述初始模块对象的引用地址;
当检测到本地存储的目标文件发生更新时,基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新。
一种可能的实施方式中,所述设置目标文件对应的自定义加载处理函数,包括:
确定所述目标文件的文件类型;
为所述目标文件设置与所述文件类型对应的自定义加载处理函数。
一种可能的实施方式中,所述通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,包括:
调用加载函数获取所述目标文件中的文件内容;
调用所述目标文件对应的默认加载处理函数对所述目标文件中的文件内容进行封装,得到所述目标文件对应的初始模块对象,并将所述初始模块对象存储在内存中;
所述确定并存储所述初始模块对象的引用地址,包括:
确定所述初始模块对象的引用地址,并将所述初始模块对象的引用地址以及所述初始模块对象对应的目标文件的文件名称对应存储在内存中。
一种可能的实施方式中,根据以下方法确定发生更新的目标文件的初始模块对象的引用地址:
基于所述发生更新的目标文件的文件名称,从所述内存中查找所述发生更新的目标文件的文件名称所对应的引用地址。
一种可能的实施方式中,所述基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新,包括:
重新调用所述发生更新的目标文件对应的自定义加载处理函数对所述发生更新的目标文件进行处理,确定所述发生更新的目标文件对应的更新模块对象的引用地址;
将所述发生更新的模块对象的初始模块对象的引用地址中所存储的内容,更新为所述更新模块对象的引用地址中所存储的内容。
第二方面,本公开实施例还提供一种数据更新装置,包括:
设置模块,用于设置目标文件对应的自定义加载处理函数;
处理模块,用于通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,其中,所述初始模块对象的引用地址指向所述目标文件的内容在内存中的存储地址;
确定模块,用于确定并存储所述初始模块对象的引用地址;
更新模块,用于当检测到本地存储的目标文件发生更新时,基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新。
一种可能的实施方式中,所述设置模块,在设置目标文件对应的自定义加载处理函数时,用于:
确定所述目标文件的文件类型;
为所述目标文件设置与所述文件类型对应的自定义加载处理函数。
一种可能的实施方式中,所述处理模块,在通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象时,用于:
调用加载函数获取所述目标文件中的文件内容;
调用所述目标文件对应的默认加载处理函数对所述目标文件中的文件内容进行封装,得到所述目标文件对应的初始模块对象,并将所述初始模块对象存储在内存中;
所述确定模块,在确定并存储所述初始模块对象的引用地址时,用于:
确定所述初始模块对象的引用地址,并将所述初始模块对象的引用地址以及所述初始模块对象对应的目标文件的文件名称对应存储在内存中。
一种可能的实施方式中,所述更新模块,用于根据以下方法确定发生更新的目标文件的初始模块对象的引用地址:
基于所述发生更新的目标文件的文件名称,从所述内存中查找所述发生更新的目标文件的文件名称所对应的引用地址。
一种可能的实施方式中,所述更新模块,在基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新时,用于:
重新调用所述发生更新的目标文件对应的自定义加载处理函数对所述发生更新的目标文件进行处理,确定所述发生更新的目标文件对应的更新模块对象的引用地址;
将所述发生更新的模块对象的初始模块对象的引用地址中所存储的内容,更新为所述更新模块对象的引用地址中所存储的内容。
第三方面,本公开实施例还提供一种计算机设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的数据更新方法,可以通过自定义加载处理函数将初始模块对象的引用地址传递出来,然后当检测到本地存储的目标文件发生更新时,基于初始模块对象的引用地址和更新后的目标文件,对初始模块对象的引用地址所指向的内存中的内容进行更新,由此,可以实现在Node环境下的热更新,热更新的过程中,暂时存储在内存中的数据也并不会被清楚,从而可以提高调试效率。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本公开实施例所提供的一种数据更新方法的流程图;
图2示出了本公开实施例所提供的一种数据更新装置的架构示意图;
图3示出了本公开实施例所提供的一种计算机设备300的结构示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
相关技术中,在Node的运行环境下,由于加载函数只执行一次,因此不具备热更新的能力,一般都是通过重启的方式来实现修改的文件的重新加载,然而这种方式会导致部分存在内存中的数据丢失,因此会影响调试效率。
基于上述研究,本公开提供了一种本公开实施例提供的数据更新装置,可以通过自定义加载处理函数将初始模块对象的引用地址传递出来,然后当检测到本地存储的目标文件发生更新时,基于初始模块对象的引用地址和更新后的目标文件,对初始模块对象的引用地址所指向的内存中的内容进行更新,由此,可以实现在Node环境下的热更新,热更新的过程中,暂时存储在内存中的数据也并不会被清楚,从而可以提高调试效率。
针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种数据更新方法进行详细介绍,本公开实施例所提供的数据更新方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:电脑、智能电视、或服务器等。对于其他可运行Node环境的计算机设备本公开也并不限制。
参见图1所示,为本公开实施例提供的一种数据更新方法的流程图,所述方法包括步骤101~步骤104,其中:
步骤101、设置目标文件对应的自定义加载处理函数。
其中,所述目标文件为待加载的文件,该文件可以是不同的文件类型,例如在Node.js的运行环境下,所述目标文件可以是js文件,也可以是json文件。
在同一运行环境下不同类型的文件都会有对应的默认加载处理函数,例如在Node.js的运行环境下,会有js文件对应的默认加载处理函数,也会有json文件对应的默认加载处理函数。加载处理函数负责对目标文件的文件内容进行处理,生成该目标文件对应的模块对象,该模块对象为引用类型,其引用地址为目标文件的文件内容在内存中的存储地址,程序在运行过程中,当运行到包含该模块对象的代码时,可以先执行内存中该模块对象的引用地址对应的目标文件的文件内容。
以js文件为例,相关技术中,在加载目标js文件时,通过加载函数require读取目标js文件的文件内容,然后加载函数require会自动调用目标js文件对应的默认加载处理函数,默认加载处理函数再对目标js文件的文件内容进行处理,得到目标js文件对应的模块对象,并将模块对象保存在内存中。
而本公开所提供的方案中,加载函数require自动调用为目标文件对应的自定义加载处理函数,所述自定义加载处理函数,可以如以下代码所示:
function customJsFileHandler(module,filename){
defaultJsFileHandler(module,filename);
jsModuleMap[filename]=module;}
其中,所述defaultJsFileHandler(module,filename)为调用默认的加载处理函数,所述jsModuleMap[filename]=module表示输出模块对象的引用地址。
这里,自定义加载处理函数并未对默认加载处理函数进行任何处理,指示在调用默认加载处理函数之后,将模块对象的引用地址通过赋值的方式输出。
所述设置目标文件对应的自定义加载处理函数,可以是选择哪些目标文件需进行热更新,具体实施中可以通过require.extensions函数来给js文件注册自定义加载处理函数,示例性的其执行代码可以如下所示:
const defaultJsFileHandler=require.extensions['.js'];
require.extensions['.js']=customJsFileHandler;
这里,所述require.extensions['.js']=customJsFileHandler表示使用自定义加载处理函数处理js文件。
实际应用中,代码在执行过程中可以有部分目标文件使用默认的加载处理方式,部分目标文件使用自定义的加载处理函数,具体可以根据require.extensions函数的位置,在require.extensions函数之后的加载的目标文件,可以通过自定义的加载处理函数进行加载处理,在require.extensions函数之前加载的目标文件,可以通过默认的加载处理函数进行加载。
这里,由于自定义加载处理函数将模块对象的引用地址输出并保存,因此在后续的执行过程中,使用自定义加载处理函数的目标文件可以实现热更新,而对于使用默认加载处理函数的目标文件则无法实现热更新。
在一种可能的实施方式中,在设置目标文件对应的自定义加载处理函数时,可以先确定目标文件的文件类型,然后为目标文件设置与该目标文件的文件类型对应的自定义加载处理函数。
其中,不同的文件类型对应的自定义加载处理函数之间的区别在于,加载函数所调用的默认加载处理函数不同,例如在js文件对应的自定义加载处理函数中,是先调用js文件对应的默认加载处理函数,然后将模块对象的引用地址输出;而在json文件对应的自定义加载处理函数中,是先调用json文件对应的默认加载处理函数,然后将模块对象的引用地址输出。
步骤102、通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,其中,所述初始模块对象的引用地址指向所述目标文件的内容在内存中的存储地址。
这里,在调用自定义加载处理函数对本地存储的目标文件进行处理时,可以是先通过加载函数获取本地存储的目标文件的文件内容,加载函数会自动调用自定义加载处理函数对获取的目标文件的文件内容进行处理。
具体的,自定义加载处理函数在对获取的目标文件的文件内容进行处理时,可以先调用目标文件对应的默认加载处理函数,将获取的目标文件的文件内容进行封装,得到目标文件对应的模块对象,该模块对象为引用类型,其引用地址为目标文件的文件内容在内存中的存储地址,然后可以通过赋值的方式,将目标文件的模块对象的引用地址输出。
步骤103、确定并存储所述初始模块对象的引用地址。
在一种可能的实施方式中,所述确定并存储初始模块对象的引用地址,可以先确定初始模块对象的引用地址,然后将初始模块对象的引用地址和初始模块对象对应的目标文件的文件名称对应存储在内存中。
示例性的,可以是将自定义加载处理函数中所输出的初始模块对象的引用地址以映射数据表的方式进行存储,其中映射的键为文件名称,值为模块对象的引用地址。
这里,所述存储初始模块对象的引用地址可以是在内存中存储初始模块对象的引用地址。
步骤104、当检测到本地存储的目标文件发生更新时,基于所述初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新。
具体实施中,可以设置监听函数监听本地存储的目标文件,例如可以调用fs.watch添加监听函数。
当通过监听函数检测到本地存储的目标文件发生更新时,可以先确定发生更新的目标文件的初始模块对象的引用地址,然后基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对引用地址所指向的内存中的内容进行更新。
具体的,在确定发生更新的目标文件的初始模块对象的引用地址时,可以根据预先存储在内存中的映射数据表中,根据发生更新的目标文件的文件名称,查找对应的初始模块对象的引用地址。
在基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对引用地址所指向的内存中的内容进行更新时,可以重新调用发生更新的目标文件对应的自定义加载处理函数对发生更新的目标文件进行处理,确定发生更新的目标文件对应的更新模块对象的引用地址,然后将发生更新的模块对象的初始模块对象的引用地址中所存储的内容,更新为更新模块对象的引用地址中所存储的内容。
其中,所述重新调用发生更新的目标文件对应的自定义加载处理函数对发生更新的目标文件进行处理,可以先调用加载函数获取发生更新的目标文件对应的文件内容,然后加载函数会自动调用自定义加载处理函数对获取的发生更新的目标文件对应的文件内容进行处理,生成更新模块对象。
更新模块对象也为引用类型,其引用地址为新加载的发生更新的目标文件的文件内容在内存中的存储位置,在实际应用中,已经加载的初始模块对象的引用地址是不能进行更改的,但是可以根据初始模块对象的引用地址,对初始模块对象所指向的内容进行更改,即对初始模块对象的引用地址对应的存储内容进行更改。
具体实施中,可以分别根据发生更新的目标文件的初始模块对象的引用地址和更新模块对象的引用地址,查找对应的在内存中的存储内容,然后用更新模块对象的引用地址对应的在内存中的存储内容替换,初始模块对象的引用地址对应的在内存中的存储内容。
这里需要说明的是,在调用加载函数获取目标文件的文件内容时,是调用初始模块对象对应的父模块的加载函数来获取目标文件的文件内容。示例性的,若A文件需要调用B文件,则A文件中所添加的调用信息为B文件对应的初始模块对象,当检测到B文件发生更新时,B文件对应的父模块为A文件中添加B文件对应的初始模块对象的调用信息的模块。
本公开实施例提供的数据更新方法,可以通过自定义加载处理函数将初始模块对象的引用地址传递出来,然后当检测到本地存储的目标文件发生更新时,基于初始模块对象的引用地址和更新后的目标文件,对初始模块对象的引用地址所指向的内存中的内容进行更新,由此,可以实现在Node环境下的热更新,热更新的过程中,暂时存储在内存中的数据也并不会被清楚,从而可以提高调试效率。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与数据更新方法对应的数据更新装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述数据更新方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图2所示,为本公开实施例提供的一种数据更新装置的架构示意图,所述装置包括:设置模块201、处理模块202、确定模块203、以及更新模块204;其中,
设置模块201,用于设置目标文件对应的自定义加载处理函数;
处理模块202,用于通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,其中,所述初始模块对象的引用地址指向所述目标文件的内容在内存中的存储地址;
确定模块203,用于确定并存储所述初始模块对象的引用地址;
更新模块204,用于当检测到本地存储的目标文件发生更新时,基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新。
一种可能的实施方式中,所述设置模块201,在设置目标文件对应的自定义加载处理函数时,用于:
确定所述目标文件的文件类型;
为所述目标文件设置与所述文件类型对应的自定义加载处理函数。
一种可能的实施方式中,所述处理模块202,在通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象时,用于:
调用加载函数获取所述目标文件中的文件内容;
调用所述目标文件对应的默认加载处理函数对所述目标文件中的文件内容进行封装,得到所述目标文件对应的初始模块对象,并将所述初始模块对象存储在内存中;
所述确定模块203,在确定并存储所述初始模块对象的引用地址时,用于:
确定所述初始模块对象的引用地址,并将所述初始模块对象的引用地址以及所述初始模块对象对应的目标文件的文件名称对应存储在内存中。
一种可能的实施方式中,所述更新模块204,用于根据以下方法确定发生更新的目标文件的初始模块对象的引用地址:
基于所述发生更新的目标文件的文件名称,从所述内存中查找所述发生更新的目标文件的文件名称所对应的引用地址。
一种可能的实施方式中,所述更新模块204,在基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新时,用于:
重新调用所述发生更新的目标文件对应的自定义加载处理函数对所述发生更新的目标文件进行处理,确定所述发生更新的目标文件对应的更新模块204对象的引用地址;
将所述发生更新的模块对象的初始模块对象的引用地址中所存储的内容,更新为所述更新模块204对象的引用地址中所存储的内容。
本公开实施例提供的数据更新装置,可以通过自定义加载处理函数将初始模块对象的引用地址传递出来,然后当检测到本地存储的目标文件发生更新时,基于初始模块对象的引用地址和更新后的目标文件,对初始模块对象的引用地址所指向的内存中的内容进行更新,由此,可以实现在Node环境下的热更新,热更新的过程中,暂时存储在内存中的数据也并不会被清楚,从而可以提高调试效率。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
基于同一技术构思,本申请实施例还提供了一种计算机设备。参照图3所示,为本申请实施例提供的计算机设备300的结构示意图,包括处理器301、存储器302、和总线303。其中,存储器302用于存储执行指令,包括内存3021和外部存储器3022;这里的内存3021也称内存储器,用于暂时存放处理器301中的运算数据,以及与硬盘等外部存储器3022交换的数据,处理器301通过内存3021与外部存储器3022进行数据交换,当计算机设备300运行时,处理器301与存储器302之间通过总线303通信,使得处理器301在执行以下指令:
设置目标文件对应的自定义加载处理函数;
通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,其中,所述初始模块对象的引用地址指向所述目标文件的内容在内存中的存储地址;
确定并存储所述初始模块对象的引用地址;
当检测到本地存储的目标文件发生更新时,基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新。
一种可能的实施方式中,处理器301执行的指令中,所述设置目标文件对应的自定义加载处理函数,包括:
确定所述目标文件的文件类型;
为所述目标文件设置与所述文件类型对应的自定义加载处理函数。
一种可能的实施方式中,处理器301执行的指令中,所述通过调用所述自定义加载处理函数对本地存储的所述目标文件进行处理,得到所述目标文件对应的初始模块对象,包括:
调用加载函数获取所述目标文件中的文件内容;
调用所述目标文件对应的默认加载处理函数对所述目标文件中的文件内容进行封装,得到所述目标文件对应的初始模块对象,并将所述初始模块对象存储在内存中;
所述确定并存储所述初始模块对象的引用地址,包括:
确定所述初始模块对象的引用地址,并将所述初始模块对象的引用地址以及所述初始模块对象对应的目标文件的文件名称对应存储在内存中。
一种可能的实施方式中,处理器301执行的指令中,根据以下方法确定发生更新的目标文件的初始模块对象的引用地址:
基于所述发生更新的目标文件的文件名称,从所述内存中查找所述发生更新的目标文件的文件名称所对应的引用地址。
一种可能的实施方式中,处理器301执行的指令中,所述基于发生更新的目标文件的初始模块对象的引用地址和更新后的目标文件,对所述引用地址所指向的内存中的内容进行更新,包括:
重新调用所述发生更新的目标文件对应的自定义加载处理函数对所述发生更新的目标文件进行处理,确定所述发生更新的目标文件对应的更新模块对象的引用地址;
将所述发生更新的模块对象的初始模块对象的引用地址中所存储的内容,更新为所述更新模块对象的引用地址中所存储的内容。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的数据更新方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例所提供的数据更新方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的数据更新方法的步骤,具体可参见上述方法实施例,在此不再赘述。
本公开实施例还提供一种计算机程序,该计算机程序被处理器执行时实现前述实施例的任意一种方法。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software DevelopmentKit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。