周期型数据的分布式缓存运维方法及装置与流程

文档序号:11841999阅读:192来源:国知局
周期型数据的分布式缓存运维方法及装置与流程

本发明涉及计算机领域,尤其涉及一种周期型数据的分布式缓存运维方法及装置。



背景技术:

在监控平台等众多领域中,分布式缓存被广泛使用,业界成熟的技术有memcache、tair等产品。这些产品都根据自身的场景实现了优秀的可扩展性方案。

传统的分布式缓存在解决key‐value形式的数据缓存时,由不同形式的“数据分布”算法来决定各个key的value应该放置在哪些节点上,所述节点为缓存服务器。相应的,该种算法不仅要保证数据分布的均衡性,而且节点发生变化时不能影响数据的可用性并且依然要保持负载均衡。从本质上来说这是需要很多技术保障才能解决的问题,例如:假设有N条data,有M个缓存节点,我们希望每个节点上负责缓存N/M条数据,进一步的,当节点数量从M变成M+X时,M为增量,数据的分布必然有所调整,而调整的过程中client的读写请求依然还在持续发生,不能暂停。

然而分布式缓存毕竟是有状态设计,现有技术始终无法避免在机器扩容减容、故障处理时对内存中状态的冲击,即难以避免数据迁移成本(如停机扩容等)。

例如,现在有海量的数据(data[key:value]),有100台机器,通过策略让这些数据能负载均衡的发给各台机器。现有的策略是:intindex=Math.abs(key.hashCode)%100,如此,即可得到一个唯一的、确定的[0,99]中序号,按此序号发给对应的机器,最终能达到负载均衡的效果。然而,在 现有技术的方案中,若新增机器,例如由100台增加到130台,此时,大部分老数据的key执行上述策略后得到的index会发生变化,这也就意味着对它们的检索都会发往错误的机器,导致命中失败。

再如,现在有海量的数据(data[key:value]),现有的策略是:假想已有一万台机器,将一万台机器命名为虚拟节点,简称vnode,vnode的序号简称为vnodeId,之后将vnode与真实机器建立多对一映射关系,例如,每个真实机器上100个vnode。在路由时,先按上述例子得到vnodeId,再执行一次映射,找到真实机器。该方案的实施前提是:确保在未来的发展中,机器数量不会涨到超过一万台,如此才能保证一个key永远对应某个vnodeId不会发生改变。然而,在扩容时,必然会改变vnode与真实机器的映射关系,所述此映射关系一改,即会不可避免的导致数据命中失败。

上述两个现有技术的例子,其导致数据命中失败的原因在于,在实施过程中,上述两个例子均包含下述公式:

int machine_id=assign_function1(data.key,x),其中machine_id指最终路由的机器,assign_function1代表路由策略函数,data.key代表数据的key;x在第一个例子中就是机器数量100,在第二个例子中就是vnode数量以及vnode与机器的映射关系。明显地,该公式中一直存在未知数x,一旦所述x发生变化,assign_function1的执行结果就可能改变。



技术实现要素:

本发明的目的之一在于提供一种周期型数据的分布式缓存运维方法及装置。

为实现上述发明目的之一,本发明一实施方式提供了一种周期型数据的分布式缓存运维方法,其包括:

记录每次运维时的运维完成时间及运维设备数量;

将隶属周期在上次运维完成时间至本次运维完成时间内的数据的存储设备,与上次运维后的存储设备总数量m匹配,以m台存储设备中分布式缓存数 据;

将隶属周期在本次运维完成时间至下次运维完成时间内的数据的存储设备,与本次运维后的存储设备总数量n匹配,以n台存储设备中分布式缓存数据。

作为本发明一实施方式的进一步改进,所述方法包括:

将相邻的运维完成时间形成运维周期,以在读取缓存时确定读取数据的隶属周期。

作为本发明一实施方式的进一步改进,所述方法包括:

记录运维周期、存储设备总数量的关联关系,以在读取缓存时,根据读取数据的隶属周期确定存储设备总数量。

作为本发明一实施方式的进一步改进,所述方法包括:

记录运维周期、存储设备总数量和存储设备的序号区间的关联关系,以在读取缓存时,根据读取数据的隶属周期确定存储设备总数量和存储设备的序号区间。

作为本发明一实施方式的进一步改进,运维完成时间为:运维完成的即刻时间+同步时间差,其中,所述同步时间差为将所述关联关系同步至客户端的时间。

作为本发明一实施方式的进一步改进,所述方法包括:

将隶属周期早于预设最早时间阈值的数据从缓存设备中转出或删除。

作为本发明一实施方式的进一步改进,所述方法包括:

将时间周期早于预设最早时间阈值的关联关系删除。

为实现上述发明目的之一,本发明一实施方式提供了一种周期型数据的分布式缓存运维装置,其包括:

存储模块,用于记录每次运维时的运维完成时间及运维设备数量;

匹配运算模块,用于将隶属周期在上次运维完成时间至本次运维完成时间内的数据的存储设备,与上次运维后的存储设备总数量m匹配,以m台存储设备中分布式缓存数据;以及,

将隶属周期在本次运维完成时间至下次运维完成时间内的数据的存储设备,与本次运维后的存储设备总数量n匹配,以n台存储设备中分布式缓存数据。

作为本发明一实施方式的进一步改进,所述匹配运算模块还用于:

将相邻的运维完成时间形成运维周期,以在读取缓存时确定读取数据的隶属周期。

作为本发明一实施方式的进一步改进,所述匹配运算模块还用于:

记录运维周期、存储设备总数量的关联关系,以在读取缓存时,根据读取数据的隶属周期确定存储设备总数量。

作为本发明一实施方式的进一步改进,所述匹配运算模块还用于:

记录运维周期、存储设备总数量和存储设备的序号区间的关联关系,以在读取缓存时,根据读取数据的隶属周期确定存储设备总数量和存储设备的序号区间。

作为本发明一实施方式的进一步改进,运维完成时间为:运维完成时间为:运维完成的即刻时间+同步时间差,其中,所述同步时间差为将所述关联关系同步至客户端的时间。

作为本发明一实施方式的进一步改进,所述周期型数据的分布式缓存运维装置还包括:

清理模块,用于将隶属周期早于预设最早时间阈值的数据从缓存设备中转出或删除。

作为本发明一实施方式的进一步改进,所述周期型数据的分布式缓存运维装置还包括:

清理模块,用于将时间周期早于预设最早时间阈值的关联关系删除。

与现有技术相比,本发明的有益效果是:充分利用周期型数据的本质属性,在保障命中成功的前提下避免数据迁移等消耗,以在周期型数据缓存场景下用最低的成本解决机器扩容减容、故障处理时的损耗,实现低成本的可扩展性方案,显著提高了运维的效率。

附图说明

图1是本发明一实施方式的周期型数据的分布式缓存运维方法的流程图。

图2是本发明一实施方式的周期型数据的分布式缓存运维装置的模块图。

图3是本发明一实施方式的实现周期型数据的分布式缓存运维方法的算法的模块示意图。

具体实施方式

以下将结合附图所示的各实施方式对本发明进行详细描述。但这些实施方式并不限制本发明,本领域的普通技术人员根据这些实施方式所轻易做出的结构、方法、或功能上的变换均包含在本发明的保护范围内。

如图1所示,在本发明一实施方式中,所述周期型数据的分布式缓存运维方法包括以下步骤:

记录每次运维时的运维完成时间及运维设备数量;在本实施方式中,所述运维包括对设备数量的增加和减少。所述运维完成时间,即对设备数量进行扩容或减容完成的时间。其中,所述设备用于存储周期型数据,每个周期型数据都包括相应隶属的某个周期,所述周期是根据统计的粒度需要而设置的,比如是日、小时、分钟、秒等。例如:数据:“一个账户的余额是1000元”,该为非周期型数据;数据:“某账户在2014‐11‐11 11:11分发生了3次存款,存款额为1000元”,该数据为周期型数据,即周期型数据一定要包括事件,以及事件发生的时间。

相应的,上一次运维发生时,记录上一次运维完成设备变更的时间T_last,及上一次运维变更结束时的设备数量m;当前运维时,记录当前运维完成设备变更的时间T_now,及当前运维变更结束时的设备数量n。

将相邻的运维完成时间形成运维周期,以在读取缓存时确定读取数据的隶属周期。例如,上一次运维完成时间至本次运维完成时间所形成的运维周 期为[T_last,T_now],表示从T_last开始到T_now结束;本次运维完成时间至下一次运维完成时间所形成的运维周期为[T_now,T_next],所述T_next表示下一个运维完成时所处的时间。

当然,在不确定下一次运维完成时间时,可将该运维周期标注为:[T_now,null],直至下一次运维完成,再将所述运维周期改写为[T_now,T_next]。

记录运维周期、存储设备总数量的关联关系,以在读取缓存时,根据读取数据的隶属周期确定存储设备总数量和存储设备。

相应的,记录存储设备总数量和存储设备的序号区间的关联关系,一般的,为了方便调取,所述存储设备总数量和存储设备的序号之间可按照相应规则产生,在本实施方式中,所述存储设备的序号按照从小到大顺序编号,即设备总数量为m的设备编号所在区间为[a,a+m‐1],设备总数量为n的设备编号所在区间为[a,a+n‐1]。例如,假设有100台设备用于存储数据,那么所述设备编号所在区间为[a,a+99]。其中,a为自然数,是数据的存储设备的起始编号。例如:周期型数据“某账户在2014‐11‐11 11:11分发生了3次存款,存款额为1000元”,经过分析,得知该周期型数据的隶属周期区间为[T_last,T_now],之后根据所述隶属周期区间[T_last,T_now],确定该隶属区间内存储设备总量为m,存储设备序号所在区间为[a,a+m‐1]。

将隶属周期在上次运维完成时间至本次运维完成时间内的数据的存储设备,与上次运维后的存储设备总数量m匹配,以在序号区间为[a,a+m‐1]的m台存储设备中分布式缓存数据;

将隶属周期在本次运维完成时间至下次运维完成时间内的数据的存储设备,与本次运维后的存储设备总数量n匹配,以在序号区间为[a,a+n‐1]的n台存储设备中分布式缓存数据。

在本发明一实施方式中,所述运维完成时间为:运维完成的即刻时间+同步时间差,其中,所述同步时间差为将所述关联关系同步至客户端的时间。具体的,所述关联关系是缓存在发起读写请求的客户端中的,因为该关联关 系数据量很小,放在客户端中的内存中压力不大,且可避免多次RPC。

在实际的分布环境下,数据的发生和接收并不是同时进行的,而是存在同步时间差,所述同步时间差为将所述关联关系同步至客户端的时间,为了保护该时间差,就需要将每次的运维完成时间进行“延后”生效,例如,将本次运维周期变更为[T_now+同步时间差,T_next],将上次运维周期变更为[T_last+同步时间差,T_now]。

进一步的,为了保障结果的一致性,可将本次运维周期变更为[T_now+同步时间差*p,T_next],即是在同步时间差上再乘以一个系数p,以确保该关联关系在所述客户端中集体生效。

进一步的,为了提高设备存储空间的利用率,所述方法还包括:将隶属周期早于预设最早时间阈值的数据从缓存设备中转出或删除,和/或将时间周期早于预设最早时间阈值的关联关系删除。

相应的,周期型数据在使用时,其使用具有“冷热之分”,即:绝大部分场景都有实时性要求,越是最近发生的数据越有价值,而年代久远的数据会随着时间流逝而价值递减。例如,在国庆节期间希望快速得知当前XX市的各个酒店的入住情况、各条高速公路上车的流量情况,以利于做出旅游线路、公交安排、交通管制等决策;而在3年以前的上述数据,相比3年内的上述数据而言,可参考的价值较低,只是在回顾历史等时候才会调取。因此,在周期型数据的分布式缓存场景中,价值高的需要缓存在内存做高速读写,价值较低的就可以转入持久化存储,如转入数据库或NOSQL,甚至转入更廉价的存储设备;亦或是永久删除。

同理,也可将时间周期早于预设最早时间阈值的关联关系从设备和/或客户端中删除,如此可增加查询数据时的命中速度。

结合图3所示,在本发明的一实施方式中,上述方法可通过以下公式实现:

Map<termRange,term_function>term_function_map=…;

term_function={

final x=…;//集群中的节点信息

assign_function1(data.key,x)={…;return machine_id};

assign_function3(data.key){return assign_function1(data.key,x);}

}

calculateTermRange=function(data.term){…;return termRange;}

int machine_id=term_function_map.get(calculateTermRange(data.term)).assign_function3(data.key);

其中,map只是个理论上的结构,如伪代码,并不强制它是个简单的<key‐value>结构,该map真实、明确地存在。termRange为运维周期,也是map中的key;term_function为元数据;term_function_map为函数周期地图;machine_id为节点序号;assign_function1和前述背景技术中的assign_function2类似,在此不做详细赘述。

相应的,在TermRange随着运维变更不断产生的时刻,也会将它们的变更记录存储到term_function_map中,而value就是该TermRange下的term_function,x表示此次变更后新的节点信息,例如:节点服务器扩容了一台机器后x中就会增加这台服务器的信息;在data.key和x两个参数的配合下按一定算法,例如:hash取模,计算出对应的machine_id;assign_function3则是term_function向外提供的服务,外界只需要提供data.key,它就能返回对应的节点序号,之后assign_function3获取到足够的参数后在内部调用assing_function1。

在周期型数据特征下,data都有term属性,表示它隶属于哪个周期。此时我们可以提供一个calculateTermRange函数,它以data.term作为参数,在term_function_map的keySet()中遍历搜寻data.term所隶属的TermRange,通过简单的算法就能判断隶属关系,TermRange是连续时间的开闭区间,如[T_last,T_now]。

得到TermRange即能够在term_function_map中得出该term对应的唯一term_function,调用它向外界提供的服务assign_function3,传入data.key参数, 即可返回assign_function1,通过assign_function1和集群节点信息x,即可得到相应的machine_id。如此,即可命中所要查询的数据。

与现有技术相比,以此公式不会遇到传统方案里的命中失败问题;在本发明的方案中,x是固定值。原因在于,每次导致x发生变化的的Operation对会产生一个新的term_function,一旦产生,就会以此次Operation之后的节点信息作为x,并且永远不会去修改它。而每个Term则必然可以对应到它所隶属的唯一一个term_function,所以x是固定值,也就不会导致命中失败。另外,本发明的term_function_map只有极少的数据量,即使是在发展速度很快的业务场景下,也至多一周做一次扩容操作,也就是一周才会在map中新增一条记录,而每条记录也就是简单的节点信息等元数据,只占用很少的存储空间。由于周期型数据“冷热之分”的特点,久远的历史数据会逐渐从缓存中踢出,所以term_function_map也可以逐渐删除久远的记录,不会随着时间流逝而无穷无尽的增加记录。故,也可以降低设备的存储成本。

进一步的,在上述内容中,介绍了对设备进行扩容的场景,在设备进行减容操作时,可以执行减节点动作,即在减容变更时刻执行减容操作,导致x变化、产生新的termRange和term_function,此时,不要撤掉减容的设备,保留该设备继续正常运行。在“冷热之分”的前提下,此机器上的数据会慢慢沦为久远的历史数据,不再需要提供缓存服务,原因在于,该设备不会存在于减容变更时刻之后的term_function.x中,亦不会被后来的周期数据使用。如此,一段时间后,当该设备上的数据被完全转移或删除后,就可以撤掉该设备。相应的,如果设备节点发生故障,那处理过程也于对设备进行减容相似,例如:减去发生故障的机器,产生新的x;或者减去故障机器的同时也从资源池中获取一台新机器加进去,产生新的x,在此不做详细赘述。

当然,在扩容后,由于新加入的设备中只存储有本次运维完成时间至下次运维完成时间之间的周期型数据,而未能完全分担已有设备中的数据,但因新加入的设备存储量低,在数据写入时,根据分布式缓存的规则,会优先写入新加入的设备,逐渐达到平衡。当然,也可选择服务器访问次数较低的 时间对数据进行迁移。

如图2所示,本发明一实施方式,周期型数据的分布式缓存运维装置包括:存储模块100,匹配运算模块200,清理模块300。

存储模块100用于记录每次运维时的运维完成时间及运维设备数量,以备匹配运算模块200调用。

在本实施方式中,所述运维包括对设备数量的增加和减少。所述运维完成时间,即对设备数量进行扩容或减容完成的时间。其中,所述设备用于存储周期型数据,每个周期型数据都包括相应隶属的某个周期,所述周期是根据统计的粒度需要而设置的,比如是日、小时、分钟、秒等。例如:数据:“一个账户的余额是1000元”,该为非周期型数据;数据:“某账户在2014‐11‐11 11:11分发生了3次存款,存款额为1000元”,该数据为周期型数据,即周期型数据一定要包括事件,以及事件发生的时间。

相应的,上一次运维发生时,存储模块100记录上一次运维完成设备变更的时间T_last,及上一次运维变更结束时的设备数量m;当前运维时,存储模块100记录当前运维完成设备变更的时间T_now,及当前运维变更结束时的设备数量n。

匹配运算模块200用于将相邻的运维完成时间形成运维周期,以在读取缓存时确定读取数据的隶属周期。

例如,匹配运算模块200将上一次运维完成时间至本次运维完成时间所形成的运维周期为[T_last,T_now],表示从T_last开始到T_now结束;匹配运算模块200将本次运维完成时间至下一次运维完成时间所形成的运维周期为[T_now,T_next],所述T_next表示下一个运维完成时所处的时间。

当然,在匹配运算模块200不确定下一次运维完成时间时,可将该运维周期标注为:[T_now,null],直至下一次运维完成,再将所述运维周期改写为[T_now,T_next]。

匹配运算模块200用于记录运维周期、存储设备总数量的关联关系,以在读取缓存时,根据读取数据的隶属周期确定存储设备总数量和存储设备。

相应的,匹配运算模块200记录存储设备总数量和存储设备的序号区间的关联关系,一般的,为了方便调取,所述存储设备总数量和存储设备的序号之间可按照相应规则产生,在本实施方式中,所述存储设备的序号按照从小到大顺序编号,即设备总数量为m的设备编号所在区间为[a,a+m‐1],设备总数量为n的设备编号所在区间为[a,a+n‐1]。例如,假设有100台设备用于存储数据,那么所述设备编号所在区间为[a,a+99]。其中,a为自然数,是数据的存储设备的起始编号。例如:周期型数据“某账户在2014‐11‐11 11:11分发生了3次存款,存款额为1000元”,经过分析,得知该周期型数据的隶属周期区间为[T_last,T_now],之后根据所述隶属周期区间[T_last,T_now],确定该隶属区间内存储设备总量为m,存储设备序号所在区间为[a,a+m‐1]。

匹配运算模块200用于将隶属周期在上次运维完成时间至本次运维完成时间内的数据的存储设备,与上次运维后的存储设备总数量m匹配,以在序号区间为[a,a+m‐1]的m台存储设备中分布式缓存数据;

将隶属周期在本次运维完成时间至下次运维完成时间内的数据的存储设备,与本次运维后的存储设备总数量n匹配,以在序号区间为[a,a+n‐1]的n台存储设备中分布式缓存数据。

在本发明一实施方式中,所述运维完成时间为:运维完成的即刻时间+同步时间差,其中,所述同步时间差为匹配运算模块200将所述关联关系同步至客户端的时间。具体的,所述关联关系是缓存在发起读写请求的客户端中的,因为该关联关系数据量很小,放在客户端中的内存中压力不大,且可避免多次RPC。

在实际的分布环境下,匹配运算模块200对数据的发生和接收并不是同时进行的,而是存在同步时间差,所述同步时间差为将所述关联关系同步至客户端的时间,为了保护该时间差,就需要将每次的运维完成时间进行“延后”生效,例如,匹配运算模块200将本次运维周期变更为[T_now+同步时间差,T_next],将上次运维周期变更为[T_last+同步时间差,T_now]。

进一步的,为了保障结果的一致性,匹配运算模块200可将本次运维周期变更为[T_now+时间差*p,T_next],即是在同步时间差上再乘以一个系数p,以确保该关联关系在所述客户端中集体生效。

进一步的,为了提高设备存储空间的利用率,清理模块300用于将隶属周期早于预设最早时间阈值的数据从缓存设备中转出或删除,和/或将时间周期早于预设最早时间阈值的关联关系删除。

相应的,周期型数据在使用时,其使用具有“冷热之分”,即:绝大部分场景都有实时性要求,越是最近发生的数据越有价值,而年代久远的数据会随着时间流逝而价值递减。例如,在国庆节期间希望快速得知当前XX市的各个酒店的入住情况、各条高速公路上车的流量情况,以利于做出旅游线路、公交安排、交通管制等决策;而在3年以前的上述数据,相比之下价值较低,只是在回顾历史等时候才会调取。因此,在周期型数据的分布式缓存场景中,清理模块300将价值高的需要缓存在内存做高速读写,价值较低的就可以转入持久化存储,如转入数据库或NOSQL,甚至转入更廉价的存储设备;亦或是永久删除。

同理,清理模块300也可将时间周期早于预设最早时间阈值的关联关系从设备和/或客户端中删除,如此可增加查询数据时的命中速度。

进一步的,匹配运算模块200在设备进行减容操作时,可以执行减节点动作,即在减容变更时刻执行减容操作,此时,不要撤掉减容的设备,保留该设备继续正常运行。在“冷热之分”的前提下,此机器上的数据会慢慢沦为久远的历史数据,不再需要提供缓存服务。如此,一段时间后,当该设备上的数据被完全转移或删除后,就可以撤掉该设备。相应的,如果设备节点发生故障,那处理过程也于对设备进行减容相似,例如:减去发生故障的机器;或者减去故障机器的同时也从资源池中获取一台新机器加进去,在此不做详细赘述。

当然,在扩容后,由于新加入的设备中只存储有本次运维完成时间至下次运维完成时间之间的周期型数据,而未能完全分担已有设备中的数据,但 因新加入的设备存储量低,在数据写入时,根据分布式缓存的规则,会优先写入新加入的设备,逐渐达到平衡。当然,也可选择服务器访问次数较低的时间对数据进行迁移。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法实施方式中的对应过程,在此不再赘述。

与现有技术相比,本发明的周期型数据的分布式缓存运维方法及装置,充分利用周期型数据的本质属性,在保障命中成功的前提下避免数据迁移等消耗,以在周期型数据缓存场景下用最低的成本解决机器扩容减容、故障处理时的损耗,实现低成本的可扩展性方案,显著提高了运维的效率。

需要说明的是,本发明不仅可以用于周期型数据缓存,也可以用于流式计算的中间计算节点上。比如用Storm来统计apache日志计算PV,PV本身就是周期型数据,例如:计算某一秒的PV、某一分钟的PV,如果没有任何保障,那Storm的计算节点发生扩容时就会产生数据分流,即某一分钟的PV数据有一半在机器A、另一半在机器B,影响计算逻辑复杂度,在此不做详细赘述。

在本发明所提供的几个实施方式中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施方式仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施方式方案的目的。

另外,在本发明各个实施方式中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以2个或2个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机装置(可以是个人计算机,服务器,或者网络装置等)或处理器(processor)执行本发明各个实施方式所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read‐Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上实施方式仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施方式对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施方式所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施方式技术方案的精神和范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1