一种集群数据获取方法、装置及设备
技术领域
本申请涉及计算机技术领域,尤其涉及一种集群数据获取方法、装置及设备。
背景技术
集群是一组相互独立的,通过高速网络互联的计算机。所有互联的计算机构成一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。
传统的集群大多采用一个主节点连接多个从节点的架构。从节点一般分布在不同的机房,客户端在访问不同机房从节点时通常是配置从节点的ip地址,通过访问从节点的ip地址达到同机房访问的效果。
现有技术中,在通过配置客户端的ip地址访问从节点时,如果从节点发生宕机,工作人员察觉不到,仍然会配置ip地址对该从节点进行访问,导致客户端获取数据失败。
发明内容
有鉴于此,本申请实施例提供了一种集群访问及监控方法、装置及设备,用于解决如果从节点发生宕机,需要人工干预进行切换到其他可用的从节点,处理效率低,增加客户端获取数据的时间成本的问题。
为解决上述技术问题,本说明书实施例是这样实现的:
本说明书实施例提供的一种集群数据获取方法,包括:
接收用户触发的数据访问指令,所述数据访问指令中携带第一标识;
根据所述第一标识确定存储集群;
获取所述存储集群的可用从节点列表;
访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据。
可选的,在所述获取所述存储集群的可用从节点列表之前,还包括:
发送节点访问请求至监控集群,所述节点访问请求中携带所述存储集群的名称;
接收所述监控集群根据所述名称返回的初始从节点列表;
根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表。
可选的,所述根据预存的动态路由算法对所述初始从节点信息进行过滤,得到所述存储集群的可用从节点列表,具体包括:
获取所述初始从节点列表中第二标识为可用的从节点,得到初始可用从节点列表;
依次发送ping命令至所述初始可用从节点列表中的从节点,确定各从节点的ping值;
从所述各从节点的ping值中确定ping值最小的第一目标从节点;
将预设阈值与所述第一目标从节点的ping值相加,得到筛选阈值;
根据所述筛选阈值对所述初始可用从节点列表中的从节点的ping值进行筛选,得到ping值小于所述筛选阈值的可用从节点,形成所述存储集群的可用从节点列表。
可选的,在所述接收用户触发的数据访问指令,所述数据访问指令中携带第一标识之前,还包括:
获取集群列表和待写入数据,其中,所述待写入数据携带第一标识;
根据预设的写入算法确定存储集群,其中,所述目标集群为所述第一标识对应的待写入数据待要写入的集群;
将所述待写入数据写入所述存储集群的主节点;
接收所述主节点将所述待写入数据同步更新到所述主节点对应的从节点的提示;
存储所述第一标识与所述待写入数据的对应关系。
可选的,在所述根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表之后,还包括:
控制计时器开始计时,得到第一时长;
判断所述第一时长是否超过预设的更新时长,得到判断结果;
若所述判断结果表示所述第一时长超过所述更新时长,重复执行所述根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表步骤。
可选的,当所述待获取数据为热门信息数据时,所述访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据,具体包括:
访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的热门信息数据;
在所述访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的热门信息数据步骤之后,还包括:
确定所述热门信息数据的显示位置;
根据所述显示位置在显示界面上显示所述热门信息。
本说明书实施例提供的一种集群数据获取装置,包括:
接收模块,用于接收用户触发的数据访问指令,所述数据访问指令中携带第一标识;
确定模块,用于根据所述第一标识确定存储集群;
获取模块,用于获取所述存储集群的可用从节点列表;
访问模块,用于访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据。
可选的,在所述获取模块之前,还包括:
发送模块,用于发送节点访问请求至监控集群,所述节点访问请求中携带所述存储集群的名称;
返回模块,用于接收所述监控集群根据所述名称返回的初始从节点列表;
过滤模块,用于根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表。
本说明书实施例提供的一种集群访问设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行所述集群数据获取方法。
一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,所述指令被处理器执行时实现所述集群数据获取方法的方法步骤。
本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:采用上述方案后,能根据用户触发的数据访问指令中携带的标识来确定要访问的从节点的存储集群,然后再访问该存储集群的可用从节点列表中的从节点来获取标识对应的待获取数据,保证了在访问从节点时,该从节点是可用的,能随时获取到从节点中的数据。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本说明书实施例提供的一种集群架构示意图;
图2为本说明书实施例提供的一种集群数据获取方法的步骤流程图;
图3为本说明书实施例提供一种写入算法的原理示意图;
图4为本说明书实施例提供的一种客户端显示的界面示意图;
图5为本说明书实施例提供的对应于图2的一种集群数据获取装置的结构示意图;
图6为本说明书实施例提供的对应于图2的一种集群数据获取设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为本说明书实施例提供的一种集群架构示意图,该集群架构可以采用分布式集群架构,本申请依赖该集群架构运行,具体可以包括:
监控集群101、集群102和客户端103。
所述集群102包括主节点1021和若干从节点1022,所述主节点1021连接所述若干从节点1022,所述监控集群用于监控所述主节点的工作状态。一个节点为一个服务器。
所述客户端103用于向所述主节点1021写入数据和向所述从节点1022读取数据。
现有技术中,Redis Cluster是Redis在3.0版本之后推出的分布式集群解决方案。在该方案中,整个集群被划分为16384个slots(槽),集群中每个节点可以负责一定数量的slots。同时,每个key(标识)可以映射到一个具体的slot上。
其中,客户端可以为Redis客户端。
Redis客户端不知道要查询的key会映射到哪个节点上,一般通过重定向来确定,具体的重定向过程可以包括:
Redis客户端请求集群中的任意一个节点,节点通过crc16(key)/16384计算出该Redis客户端请求的数据属于哪个slot。如果请求的节点负责这个slot,且key在这个slot中,则返回key对应的value数据。如果该slot不由请求的节点负责,则返回MOVED重定向请求给Redis客户端。MOVED重定向请求包括该key对应的slot及ip端口等信息。Redis客户端再根据MOVED重定向请求重新请求新的节点。
如果Redis客户端请求集群时,发生了重定向,那重定向的过程会增加Redis客户端获取数据的时间成本。
传统的Redis主从架构集群的从节点一般分布在不同的机房,业务机器访问不同机房从节点时通常是配置Redis的从节点ip,从而达到同机房访问的效果。如果从节点宕机,工作人员在配置从节点ip时,是不知道从节点发生宕机的,仍然会配置该从节点进行访问。进行访问时,由于从节点宕机了,访问失败,工作人员才知道该从节点宕机了,然后再重新配置ip地址来访问其他的从节点,增加了获取数据的时间成本,获取数据的效率低。
本申请的集群架构为基于Redis-Sentinel搭建的多套MSS
(Master-Slave-Slave,主节点-从节点-从节点)架构的Redis集群。首先可以搭建N套Redis集群。每套Redis集群都是一主多从的架构,即一个主节点(Master),多个从节点(Slave)的架构。主节点只负责写入数据,从节点只负责读取数据。写入主节点的数据会同步给从节点。然后再搭建Redis-Sentinel集群,监控N套Redis集群,即Sentinel集群为监控集群。当Sentinel发现有Master宕机时,能自动进行主节点和从节点设备的切换。其中,可以采用分布式系统的Raft算法确定目标从节点,并将目标从节点作为新的主节点。
图2为本说明书实施例提供的一种集群数据获取方法的步骤流程图,从程序角度而言,流程的执行主体可以为部署在客户端上的程序。该流程可以包括以下步骤:
步骤S201:接收用户触发的数据访问指令,所述数据访问指令中携带第一标识。
步骤S202:根据所述第一标识确定存储集群。
在客户端要获取数据时,是根据待获取数据的标识来先确定待获取数据的存储位置。其中,待获取数据的标识与待获取数据可以以键值对的形式进行存储。例如,待获取数据为热门信息中的“学霸学习日常”,待获取数据的标识为hot-info,最终可以以{hot-info:学霸学习日常}的形式进行存储。
步骤S203:获取所述存储集群的可用从节点列表。
在确定出待获取数据的存储集群后,从存储集群中获取可用的从节点列表。存储集群的架构为主节点和若干从节点,主节点连接若干从节点。客户端从从节点中读取数据。有的从节点可能会发生宕机无法进行数据的读取,如果客户端仍然从宕机的从节点读取数据,会导致数据读取失败,影响数据的读取效率。为了避免出现上述情况,先从存储集群中获取可用的从节点列表,将宕机的从节点或者请求超时的从节点筛除掉。
步骤S204:访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据。
用户想要查看某些数据时,会在前台界面上点击该数据对应的显示模块,客户端在感应到用户点击了显示模块时,会根据点击的显示模块对应生成数据访问指令,数据访问指令中携带该模块的标识。例如,在手机端的yy应用程序中,用户想看一下最近的热门直播都有哪些,会点击热门模块的按钮。客户端在感应到用户点击了热门模块的按钮时,会生成携带热门模块标识的数据访问指令来访问集群,请求热门直播对应的数据。
从节点中的数据与主节点写入的数据是同步更新的。一个主节点对应多个从节点,每个从节点中存储的数据可以是完全相同的,也可以是预设数量的从节点存储相同的数据,其他预设数据的从节点存储另外一部分相同的数据。
例如,主节点中写入了一份数据A,可以将A写入到每个从节点中,从节点的数量为9个,使得9个从节点中都存储相同的数据A。还可以将数据A分成三份,三个从节点中存储第一份A的数据,三个从节点中存储第二份A的数据,剩下三个从节点中存储第三份A的数据。哪些数据存储在哪里都有相关的记录,根据数据的标识可以查找到数据存储的从节点。
筛选出存储有待获取数据且可用的从节点形成可用从节点。当所有从节点中存储的数据一致时,存储有带获取数据的从节点即为所有的从节点。当从节点中存储的数据不完全一致时,筛选出的是存储有待获取数据的从节点。
采用上述方案后,能根据用户触发的数据访问指令中携带的标识来确定要访问的从节点的存储集群,然后再访问该存储集群的可用从节点列表中的从节点来获取标识对应的待获取数据,保证了在访问从节点时,该从节点是可用的,能随时获取到从节点中的数据。
基于图2的方法,本说明书实施例还提供了该方法的一些具体实施方案,下面进行说明。
在一个具体实施方式中,在所述获取所述存储集群的可用从节点列表之前,还可以包括:
发送节点访问请求至监控集群,所述节点访问请求中携带所述存储集群的名称。
接收所述监控集群根据所述名称返回的初始从节点列表。
根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表。
监控集群中存储有监控的所有集群的从节点信息,且从节点是按照集群名称进行划分的。客户端发送节点访问请求至监控集群,例如,可以发送sentinel slaves mymaster命令访问监控集群,其中,mymaster为要访问的存储集群的名称。
当监控集群接收到节点访问请求时,会根据节点访问请求中存储集群的名称返回存储集群中的所有从节点信息。
例如,当存储集群的名称为master1时,可以向监控集群发送sentinel slavesmaster1后,收到的从节点列表信息如下:
1)1)"slave1"
2)"14.116.173.78:7001"
3)"ip"
4)"14.116.173.78"
5)"port"
6)"7001"
7)"runid"
8)"ceb54935f563f69abbd9778e75841d84a629f82f"
9)"flags"
10)"slave"
2)1)"slave2"
2)"127.0.0.1:7001"
3)"ip"
4)"127.0.0.1"
5)"port"
6)"7001"
7)"runid"
8)"ceb54935f563f69abbd9778e75841d84a629f82f"
9)"flags"
10)"slave"
再根据预存的动态路由算法对所有的从节点进行筛选,去除掉不符合条件的从节点,得到可用从节点列表。客户端通过可用从节点列表获取数据时,既保证了能成功得到数据,又缩短了数据获取的时间,提高了数据获取的效率。
在一个具体实施方式中,所述根据预存的动态路由算法对所述初始从节点信息进行过滤,得到所述存储集群的可用从节点列表,具体可以包括:
获取所述初始从节点列表中第二标识为可用的从节点,得到初始可用从节点列表。
具体的,从节点信息中包括第二标识,所述第二标识表示从节点的状态,根据从节点的状态可以判断该从节点是否可用。例如,flags可以代表从节点的状态。flags可以为slave,代表该从节点可用。还可以为disconnected,代表该从节点断开连接。还可以为s_down,代表该从节点是监控集群主观上认为该节点宕机的状态。还可以为o_down,代表该从节点是监控集群客观上认为该节点宕机的状态。剔除掉从节点信息中flags为disconnected、s_down和o_down的从节点。
同时,ip地址为127.0.0.1的地址为回环地址,回环地址代表本地虚拟接口,所以默认被看作是永远不会宕掉的接口。通常在安装网卡前就可以ping通这个本地回环地址,一般都会用来检查本地网络协议、基本数据接口等是否正常的测试地址。因此,将ip地址为127.0.0.1的子节点也过滤掉。
经过以上获取和筛选后,会得到一份初始可用从节点列表。
依次发送ping命令至所述初始可用从节点列表中的从节点,确定各从节点的ping值。
从所述各从节点的ping值中确定ping值最小的第一目标从节点。
将预设阈值与所述第一目标从节点的ping值相加,得到筛选阈值。
根据所述筛选阈值对所述初始可用从节点列表中的从节点的ping值进行筛选,得到ping值小于所述筛选阈值的可用从节点,形成所述存储集群的可用从节点列表。
具体的,ping命令可以检查网络是否连通,进而分析和判定网络故障。ping值是指从客户端对网络服务器发送数据到接收到服务器反馈数据的时间。一般以毫秒计算。
客户端再去ping这份初始可用从节点列表中的每个从节点,取ping值最小的节点的ping值记为T1。再自定义一个阈值记为T2,形成筛选阈值T1+T2。然后再筛选所有从节点的ping值,将ping值小于筛选阈值的从节点留下,形成可用从节点列表。
其中,为了达到访问分布在不同机房的节点类似于在同一个机房的效果,可以将T2设置为1ms。筛选阈值T1+T2的值可以为0~30ms之间。
采用上述方案后,可以保证访问从节点时,从节点均为可用的,并且耗时是相对较低的,提高了数据获取的效率。
在一个具体实施方式中,在所述接收用户触发的数据访问指令,所述数据访问指令中携带第一标识之前,还可以包括:
获取集群列表和待写入数据,其中,所述待写入数据携带第一标识。
根据预设的写入算法确定存储集群,其中,所述存储集群为所述第一标识对应的待写入数据要写入的集群。
将所述待写入数据写入所述存储集群的主节点。
接收所述主节点将所述待写入数据同步更新到所述主节点对应的从节点的提示。
存储所述第一标识与所述待写入数据的对应关系。
如图3所示,为本申请实施例提供的一种写入算法的原理示意图,具体可以包括:
其中,预设的写入算法可以为一致性Hash算法,首先求出Redis服务器(节点)的哈希值,即存储集群的哈希值,并将其配置到0~232的数值圆上。
然后采用同样的方法求出存储数据的键的哈希值,即第一标识的哈希值,并映射到相同的圆上。
然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。通过一致性Hash算法中哈希环及虚拟节点的特性,提高了集群的可扩展性。
主节点在将数据同步更新完成至对应的从节点时,会发送更新完成提示至客户端。客户端在收到该提示后,知道数据已经在从节点存储完成,然后再存储上标识与待写入数据的对应关系,方便以后查找数据。其中,可以以映射表的形式存储标识与待写入数据的对应关系。
在一个具体实施方式中,在所述根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表之后,还包括:
控制计时器开始计时,得到第一时长。
判断所述第一时长是否超过预设的更新时长,得到判断结果。
若所述判断结果表示所述第一时长超过所述更新时长,重复执行所述根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表步骤。
从节点在工作一段时间之后,可能会发生故障,导致宕机。为了保障可用从节点列表中的从节点均为可用的,需要每隔一段时间对可用从节点列表中的节点进行更新,剔除掉不符合条件的从节点,或者加入其它符合条件的从节点。即每隔预设时间重复执行所述根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表步骤。其中,预设时间可以根据实际情况进行设置。例如,可以为0-10s。优选的,可以为5s。
如图4所示,为本申请实施例提供的一种客户端显示的界面示意图,具体可以包括:
用户在客户端触发了热门信息按钮,即待获取数据为热门信息数据,所述访问所述可用从节点列表中的任一从节点来得到所述标识对应的待获取数据,具体包括:
访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的热门信息数据。
在所述访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的热门信息数据步骤之后,还包括:
确定所述热门信息数据的显示位置。
根据所述显示位置在显示界面上显示所述热门信息。
其中,热门信息可以有多个,即可以包括好多小的分类,按照预设的分类规则将热门信息显示到界面上。例如,可以分两列进行显示。即在一个界面上,每一行都同时显示两个热门信息。
基于同样的思路,本说明书实施例还提供了上述方法对应的装置。
图5为本说明书实施例提供的对应于图2的一种集群数据获取装置的结构示意图。
如图5所示,该装置可以包括:
接收模块501,用于接收用户触发的数据访问指令,所述数据访问指令中携带第一标识。
确定模块502,用于根据所述第一标识确定存储集群。
获取模块503,用于获取所述存储集群的可用从节点列表。
访问模块504,用于访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据。
采用上述方案后,能根据用户触发的数据访问指令中携带的标识来确定要访问的从节点的存储集群,然后再访问该存储集群的可用从节点列表中的从节点来获取标识对应的待获取数据,保证了在访问从节点时,该从节点是可用的,能随时获取到从节点中的数据。
在一个具体实施方式中,在所述获取模块之前,还可以包括:
发送模块,用于发送节点访问请求至监控集群,所述节点访问请求中携带所述存储集群的名称。
返回模块,用于接收所述监控集群根据所述名称返回的初始从节点列表。
过滤模块,用于根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表。
在一个具体实施方式中,所述过滤模块,具体可以包括:
获取所述初始从节点列表中第二标识为可用的从节点,得到初始可用从节点列表。
依次发送ping命令至所述初始可用从节点列表中的从节点,确定各从节点的ping值。
从所述各从节点的ping值中确定ping值最小的第一目标从节点。
将预设阈值与所述第一目标从节点的ping值相加,得到筛选阈值。
根据所述筛选阈值对所述初始可用从节点列表中的从节点的ping值进行筛选,得到ping值小于所述筛选阈值的可用从节点,形成所述存储集群的可用从节点列表。
在一个具体实施方式中,在所述接收模块之前,还可以包括:
列表获取模块,用于获取集群列表和待写入数据,其中,所述待写入数据携带第一标识。
确定模块,用于根据预设的写入算法确定存储集群,其中,所述存储集群为所述第一标识对应的待写入数据要写入的集群。
写入模块,用于将所述待写入数据写入所述存储集群的主节点。
同步模块,用于接收所述主节点将所述待写入数据同步更新到所述主节点对应的从节点的提示。
存储模块,用于存储所述第一标识与所述待写入数据的对应关系。
在一个具体实施方式中,在所述过滤模块之后,还可以包括:
计时模块,用于控制计时器开始计时,得到第一时长。
时长判断模块,用于判断所述第一时长是否超过预设的更新时长,得到判断结果。
重复模块,用于若所述判断结果表示所述第一时长超过所述更新时长,重复执行所述根据预存的动态路由算法对所述初始从节点列表进行过滤,得到所述存储集群的可用从节点列表步骤。
在一个具体实施方式中,当所述待获取数据为热门信息数据时,所述访问模块,具体还可以包括:
访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的热门信息数据。
在所述访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的热门信息数据步骤之后,还可以包括:
位置确定模块,用于确定所述热门信息数据的显示位置。
显示模块,用于根据所述显示位置在显示界面上显示所述热门信息。
基于同样的思路,本说明书实施例还提供了上述方法对应的设备。
图6为本说明书实施例提供的对应于图2的一种集群数据获取设备的结构示意图。如图6所示,设备600可以包括:
至少一个处理器610;以及,
与所述至少一个处理器通信连接的存储器630;其中,
所述存储器630存储有可被所述至少一个处理器610执行的指令620,所述指令被所述至少一个处理器610执行,以使所述至少一个处理器610能够:
接收用户触发的数据访问指令,所述数据访问指令中携带第一标识。
根据所述第一标识确定存储集群。
获取所述存储集群的可用从节点列表。
访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据。
采用上述方案后,能根据用户触发的数据访问指令中携带的标识来确定要访问的从节点的存储集群,然后再访问该存储集群的可用从节点列表中的从节点来获取标识对应的待获取数据,保证了在访问从节点时,该从节点是可用的,能随时获取到从节点中的数据。
基于同样的思路,本说明书实施例还提供了上述方法对应的计算机可读存储介质。
一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,其特征在于,所述指令被处理器执行时实现以下步骤:
接收用户触发的数据访问指令,所述数据访问指令中携带第一标识。
根据所述第一标识确定存储集群。
获取所述存储集群的可用从节点列表。
访问所述可用从节点列表中的任一从节点来得到所述第一标识对应的待获取数据。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。