一种基于TCMU虚拟块设备的缓存数据访问方法及系统
技术领域
本发明涉及智能终端技术领域,特别涉及一种基于TCMU虚拟块设备的缓存数据访问方法及系统。
背景技术
在大数据蓬勃发展的今天,随着云计算、虚拟化、网络等技术的日渐成熟,作为整个生态基石的存储,也在扮演着越来越重要的角色。在云计算中,存储大多以分布式的形态呈现。而在对生成虚拟块设备的诸多尝试中,Linux内核3.18合入的TCMU给出了一个较为圆满的虚拟块设备生成方式。
TCMU作为Linux操作系统的内核模块,需要及时处理其请求,否则会引起Linux内核的crash。如何为TCMU设计一套高速、有效的缓存系统则成为了性能优化的关键问题。现有的缓存算法普遍采用根据数据的历史访问频率来淘汰方法、根据数据的历史访问记录来淘汰方法或者两者相结合的方法。但是,对于TCMU的IO读写特性则没有涉及,混杂块大小的IO可能会导致TCMU读写性能低下。同时,一次小IO的扫盘或大IO的读写可能导致之前有效的缓存被污染。
因而现有技术还有待改进和提高。
发明内容
本发明要解决的技术问题在于,针对现有技术的不足,提供一种基于TCMU虚拟块设备的缓存数据访问方法及系统,以解决现有缓存方法导致的TCMU读写性能低的问题。
为了解决上述技术问题,本发明所采用的技术方案如下:
一种基于TCMU虚拟块设备的缓存数据访问方法,其包括:
接收应用程序的访问请求,其中,所述访问请求携带访问数据的长度及访问TCMU虚拟块设备的位置;
根据所述长度确定其所属的处理池,并在所述处理池对应的缓存哈希表内查找所述位置对应的访问次数;
当所述访问请求为写请求且所述访问次数大于等于1时,将所述访问次数加一,并将所述写请求对应的数据保存至缓存哈希表,以及在所述处理池对应的缓存链表中查找所述位置;
当未查找到所述位置时,将所述位置及访问次数插入所述缓存链表头部。
所述基于TCMU虚拟块设备的缓存数据访问方法,其还包括:
当所述访问请求为读请求且所述访问次数大于等于1时,读取所述读请求对应的数据;
将所述访问次数加一,并在所述缓存链表中查找所述位置。
所述基于TCMU虚拟块设备的缓存数据访问方法,其中,所述当所述访问请求为读请求且所述访问次数大于等于1时,读取所述数据具体包括:
当所述访问请求为读请求且所述访问次数大于1时,从缓存哈希表内读取所述读请求对应的数据;
当所述访问请求为读请求且所述访问次数等于1时,从后端存储设备中读取所述读请求对应的数据。
所述基于TCMU虚拟块设备的缓存数据访问方法,其还包括:
当所述访问请求为读请求且所述访问次数小于1时,从后端存储设备中读取所述读请求对应的数据,并以所述位置为键值散列入缓存哈希表,以及将所述位置被访问次数记为1。
所述基于TCMU虚拟块设备的缓存数据访问方法,其还包括:
当所述访问请求为写请求且所述访问次数小于1时,以所述位置为键值散列入缓存哈希表,并将所述位置被访问次数记为1,以及将所述写请求对应的数据发送至后端存储设备。
所述基于TCMU虚拟块设备的缓存数据访问方法,其中,所述若未查找到所述位置,则将所述位置及访问次数插入所述缓存链表头部具体包括:
若未查找到所述位置,则判断所述缓存链表是否存满;
当所述缓存链表存满时,将所述缓存链表尾部的访问记录删除,并将所述访问记录对应的位置从缓存哈希表内删除;
当所述缓存链表未存满或删除访问记录时,将所述位置及访问次数插入所述缓存链表头部。
所述基于TCMU虚拟块设备的缓存数据访问方法,其还包括:
若查找到所述位置,则更新缓存链表中所述位置对应的访问时间及访问次数,并根据所述访问时间重新排列所述缓存链表。
所述基于TCMU虚拟块设备的缓存数据访问方法,其中,所述接收应用程序的访问请求,其中,所述访问请求携带访问数据的长度及访问TCMU虚拟块设备的位置之前还包括:
根据TCMU的IO访问特性预先创建若干处理池,并为每个数据处理池建立相应的缓存哈希表及缓存链表。
一种基于TCMU虚拟块设备的缓存数据访问系统,其包括:
接收模块,用于接收应用程序的访问请求,其中,所述访问请求携带访问数据的长度及访问TCMU虚拟块设备的位置;
查找模块,用于根据所述长度确定其所属的处理池,并在所述处理池对应的缓存哈希表内查找所述位置对应的访问次数;
写入模块,用于当所述访问请求为写请求且所述访问次数大于等于1时,将所述访问次数加一,并将所述写请求对应的数据保存至缓存哈希表,以及在所述处理池对应的缓存链表中查找所述位置;
插入模块,用于当未查找到所述位置时,将所述位置及访问次数插入所述缓存链表头部。
所述基于TCMU虚拟块设备的缓存数据访问系统,其还包括:
读取模块,用于当所述访问请求为读请求且所述访问次数大于等于1时,读取所述读请求对应的数据,并将所述访问次数加一,以及在所述缓存链表中查找所述位置。
有益效果:与现有技术相比,本发明提供了一种基于TCMU虚拟块设备的缓存数据访问方法及系统,所述方法包括:接收应用程序的访问请求;根据所述长度确定其所属的处理池,并在所述处理池对应的缓存哈希表内查找所述位置对应的访问次数;当所述访问请求为写请求且所述访问次数大于等于1时,将所述访问次数加一,并将所述写请求对应的数据保存至缓存哈希表,以及在所述处理池对应的缓存链表中查找所述位置;当未查找到所述位置时,将所述位置及访问次数插入所述缓存链表头部。本发明契合TCMU的IO读写特性,提高读取和写入性能;并采用二次确认的哈希表加按照访问时间淘汰的缓存链表,能有效缓存最近多次访问过的热点数据及过滤突然大量偶发性的数据访问,防止缓存污染。
附图说明
图1为本发明提供的基于TCMU虚拟块设备的缓存数据访问方法较佳实施的流程图。
图2为本发明应用的分布式块存储系统的架构图。
图3为本发明中TCMU虚拟块设备读写方式的示意图。
图4为本发明中提供基于TCMU虚拟块设备的缓存数据访问方法的处理流程图。
图5为本发明中提供基于TCMU虚拟块设备的缓存数据访问方法实施例一的流程图。
图6为本发明中提供基于TCMU虚拟块设备的缓存数据访问方法实施例二的流程图。
图7为本发明提供的基于TCMU虚拟块设备的缓存数据访问系统的结构原理图。
图8为本发明提供的基于TCMU虚拟块设备的缓存数据访问系统的一个实施例的结构原理图。
具体实施方式
本发明提供一种基于TCMU虚拟块设备的缓存数据访问方法及系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本发明中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,“模块”、“部件”或“单元”可以混合地使用。
终端设备可以以各种形式来实施。例如,本发明中描述的终端可以包括诸如移动电话、智能电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、导航装置等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。然而,本领域技术人员将理解的是,除了特别用于移动目的的元件之外,根据本发明的实施方式的构造也能够应用于固定类型的终端。
下面结合附图,通过对实施例的描述,对发明内容作进一步说明。
请参照图1和图2,图1为本发明提供的基于TCMU虚拟块设备的缓存数据访问方法的较佳实施例的流程图,图2为本发明应用的分布式块存储系统的架构图。本发明提供的基于TCMU虚拟块设备的缓存数据访问方法应用于分布式块存储系统,所述系统分为策略主机、存储主机以及控制主机。所述策略主机为分布式块存储的“大脑”,当控制主机需要创建TCMU虚拟块设备时,根据需求调度出满足条件的存储主机,并在其上生成存储组件以供控制主机连接使用。所述存储主机为分布式块存储系统中数据最终的存放点,将实际的存储设备虚拟抽象成多个存储组件供系统使用。所述控制主机为生成TCMU虚拟块设备,为TCMU虚拟块设备准备缓存,作为存储数据路径的前端主机,完成数据接收、缓存、转发等功能。所述控制主机上设置有前端TCMU虚拟块设备,所述存储主机为后端存储设备。相应的,所述方法包括:
S100、接收应用程序的访问请求,其中,所述访问请求携带访问数据的长度及访问TCMU虚拟块设备的位置;
S200、根据所述长度确定其所属的处理池,并在所述处理池对应的缓存哈希表内查找所述位置对应的访问次数;
S300、当所述访问请求为写请求且所述访问次数大于等于1时,将所述访问次数加一,并将所述写请求对应的数据保存至缓存哈希表,以及在所述处理池对应的缓存链表中查找所述位置;
S400、当未查找到所述位置时,将所述位置及访问次数插入所述缓存链表头部。
本实施例提供了一种基于TCMU虚拟块设备的缓存数据访问方法及系统,其预先根据TCMU的IO读写特性,将所述TCMU虚拟块设备划分为若干处理池,并且每个处理池对应一组缓存哈希表和缓存链表,所述缓存哈希表为二次确认哈希表,所述缓存链表为按照访问时间排序的缓存链表,并根据访问时间淘汰其存储的信息,这使得所述方法符合预先根据TCMU的IO读写特性,没有IO分片及聚合开销,提高读取和写入性能;同时,采用二次确认的哈希表加按照访问时间进行淘汰的存储链表,能有效缓存最近多次访问过的热点数据,并且能过滤突然大量偶发性的数据访问,防止缓存污染。
具体的来说,在所述步骤S100中,所述接收应用程序的访问请求指的是前端TCMU虚拟块设备接收到应用主机的访问请求,所述访问请求中携带需要访问数据的访问数据的长度及访问TCMU虚拟块设备的位置。所述访问请求可以为读请求也可以为写请求,其中,所述读请求为从前端TCMU虚拟块设备读取数据,所述写请求为向前端TCMU虚拟块设备写入数据。相应的,所述访问请求除了携带访问数据的长度及访问TCMU虚拟块设备的位置之外,还可以根据访问请求的类型携带不同的信息。当所述访问请求为读请求时,所述访问请求还携带所述数据需要写入的buffer所述并且读请求和写请求携带的参数信息不同。当所述访问请求为写请求时,所述访问请求还可以携带需要写入的数据。
在本实施例中,如图3所示,所述前端TCMU虚拟块设备读取/写入都是一次读取/写入一块连续的数据。当所述访问请求为应用程序的写入操作时,所述访问请求携带offset、length及data;当所述访问请求为应用程序的读取操作时,所述访问请求携带offset、length及buffer。其中,所述offset表示读写TCMU虚拟块设备的位置,起始位置为0,offset为距离起始位置的偏移量;所述length表示读写TCMU虚拟块设备数据的长度;所述data表示需要写入TCMU虚拟块设备的数据,所述buffer表示将TCMU虚拟块设备中的对应数据填入buffer中。
进一步,所述前端TCMU虚拟块设备的IO读写特性是最小写为4K,最大写为128K,并且数据4K对齐。这样可以根据所述IO读写的特性建立相应的处理池,每个处理池用于处理一个范围内的IO读写,并且为每个处理池创建其对应的缓存哈希表以及缓存链表,以使得IO读写不会交叉污染,并且快速准确地返回数据。相应的,所述接收应用程序的访问请求,其中,所述访问请求携带访问数据的长度及访问TCMU虚拟块设备的位置之前还可以包括:
S001、根据TCMU的IO访问特性预先创建若干处理池,并为每个数据处理池建立相应的缓存哈希表及缓存链表。
具体地,所述所若干处理次可以为6个,也就是说,根据所述TCMU虚拟块设备的IO读写特性预设创建6个处理池,依次设置为处理池1、处理池2、......、处理池6,所述处理池1至处理池6依次对应4K、8K、16K、32K、64K和128K,这样就可以根据访问数据的长度将其分别至相应的处理进行处理。
在所述步骤S200中,所述长度为所述访问请求携带的,也就是说,当接收到所述访问请求时,获取所述放弃请求携带的被访问数据的长度,并根据所述长度查找用于处理所述访问的处理池。这里以所述处理池为6,并且依次分配4K、8K、16K、32K、64K和128K为例加以说明。当获取到所述长度时,获取大于从所述处理池对应的长度中选取大于等于所述长度的最小值,将所述最小值对应的处理池确定为所述长度对应的处理池。例如,长度为4K,则将其发往4K对应的处理池,长度为36K,则将其发往64K对应的处理池。
进一步,在确定处理此次访问的处理池后,获取所述处理池对应的缓存哈希表和缓存链表,并在所述缓存哈希表内查找所述位置对应的访问次数。也就是说,判断所述位置是否已经被访问过。所述缓存哈希表(hash表,又称散列表)是根据键信息直接进行访问的数据结构,用来根据键信息查找对应的内存块,内存块中放的就是缓存内容(包括key和对应的value)。该数据结构通过把键映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。
在所述步骤S300中,所述缓存链表用于存储所述TCMU虚拟块设备被访问的位置以及所述位置对应的访问次数,并且当且仅当所述位置对应的访问次数大于等于2时,所述位置及其对应的访问次数才存储于所述缓存链表内。在本实施例中,所述缓存链表按照其存储的位置对应的访问时间的先后顺序排列所述位置。
所述访问次数大于等于1指的是所述缓存哈希表中存储有所述位置,也就是说,所述位置已经访问过。此时,将所述位置被访问的次数加一,并且将所述写请求携带的数据保存至缓存哈希表内。在实际应用中,当所述访问次数大于等于1时,判断所述访问次数是否大于1,当不大于1时,将所述写请求携带的数据直接保存至所述缓存哈希表,并所述数据与所述位置及访问次数相关联;当大于1时,采用所述写请求携带的数据替换缓存哈希表内所述位置对应的数据。这样使得所述缓存哈希表仅保存知识被访问过2次的位置对应的数据,进而可以高效地缓存热点数据。
进一步,所述缓存哈希表内可以未存储所述位置,也就是说,所述访问次数小于1。相应的,所述基于TCMU虚拟块设备的缓存数据访问方法,其还可包括:
S301、当所述访问请求为写请求且所述访问次数小于1时,以所述位置为键值散列入缓存哈希表,并将所述位置被访问次数记为1,以及将所述写请求对应的数据发送至后端存储设备。
具体地,所述访问次数小于1,则说明所述缓存哈希表未存储所述位置。此时以所述位置为键值散列入所述缓存哈希表,并且将所述位置IDE被访问次数记为1。也就是说,所述缓存好像表以所述位置为键值建立一个数据结构,所述数据结构包括以所述位置为键值的key和以访问次数及数据为值的value。当所述访问次数为1时,所述value中仅保存所述访问次数,未存储数据。也就是说访问次数为1时,此次写请求对应的数据不保存在所述缓存哈希表内,仅将所述写请求对应的数据发送至后端存储设备。所述后端存储设备与所述前端TCMU虚拟块设备可以通过网络连接。
在本发明的一个实施例中,所述访问请求还可以是读请求。而当所述访问请求为读请求时,会根据所述读请求进行相应的读取操作。相应的,所述基于TCMU虚拟块设备的缓存数据访问方法,其还包括:
S300a、当所述访问请求为读请求且所述访问次数大于等于1时,读取所述读请求对应的数据,并将所述访问次数加一,以及在所述缓存链表中查找所述位置。
具体地,由于所述缓存哈希表内仅存储被访问次数大于1的缓存数据,从而在所述访问次数大于等于1时,还需要判断所述访问次数等于1或者大于1,以确定读取所述数据的位置。相应的,所述当所述访问请求为读请求且所述访问次数大于等于1时,读取所述数据具体包括:
S301a、当所述访问请求为读请求且所述访问次数大于1时,从缓存哈希表内读取所述读请求对应的数据,并将所述访问次数加一,以及在所述缓存链表中查找所述位置;
S302a、当所述访问请求为读请求且所述访问次数等于1时,从后端存储设备中读取所述读请求对应的数据,并将所述访问次数加一,以及在所述缓存链表中查找所述位置。
进一步,所述缓存哈希表内可以未存储所述位置,也就是说,所述访问次数小于1。相应的,所述基于TCMU虚拟块设备的缓存数据访问方法,其还可包括:
S300b、当所述访问请求为读请求且所述访问次数小于1时,从后端存储设备中读取所述读请求对应的数据,并以所述位置为键值散列入缓存哈希表,以及将所述位置被访问次数记为1。
具体地,所述访问次数小于1说明在所述缓存哈希表内中,所述位置对应的value内未存储数据,此时需要从端存储设备中读取所述请求对应的数据,并且在所述缓存哈希表内以所述位置为键值建立数据结构,并将所述位置对应的访问次数1存储于所述数据结构内。值得说明的,当以所述位置为键值散列入哈希缓存表时,其对应的数据结构内为存储数据,仅有存储访问次数,所述访问次数为1。
在所述步骤S400中,所述缓存链表预先设置其占用存储空间大小,从而在将位置及访问次数插入所述缓存链表时需要判断所述缓存链表是否已经存满,以保证所述位置及访问次数插入成功。相应的,所述若未查找到所述位置,则将所述位置及访问次数插入所述缓存链表头部具体包括:
S401、若未查找到所述位置,则判断所述缓存链表是否存满;
S402、当所述缓存链表存满时,将所述缓存链表尾部的访问记录删除,并将所述访问记录对应的位置从缓存哈希表内删除;
S403、当所述缓存链表未存满或删除访问记录时,将所述位置及访问次数插入所述缓存链表头部。
具体地,将所述访问记录对应的位置从缓存哈希表内删除指的是将以访问记录对应的位置为键值的数据结构从所述缓存哈希表内删除,可以避免缓存污染。
在本发明的一个实施例中,所述缓存链表内可以保存所述位置,相应的,所述基于TCMU虚拟块设备的缓存数据访问方法还可以包括:
S400a、若查找到所述位置,则更新缓存链表中所述位置对应的访问时间及访问次数,并根据所述访问时间重新排列所述缓存链表。
具体地,在查找到所述位置时,获取所述访问请求对应的访问时间以及所述缓存哈希表中所述位置对应的访问次数,采用所述访问时间及访问次数更新缓存链表已存储的访问时间及访问次数,并根据所述更新后的访问时间重新排列所述缓存链表。这样在删除缓存链表末尾的访问记录时,淘汰了最久远的访问记录,同时清空缓存哈希表中的该offset,高效地缓存热点数据并有效避免格式化和全盘扫描的缓存污染。同时,本发明通过二次确认的缓存哈希表及按访问时间淘汰的缓存链表,有效缓存最近多次访问过的热点数据,过滤突然大量偶发性的数据访问,防止缓存污染。
为了进一步说明本发明提供的基于TCMU虚拟块设备的缓存数据访问方法,下面结合两个具体实施例做进一步说明。
实施例一
本实施例提供了一种基于TCMU虚拟块设备的缓存数据访问方法,所述访问为写入访问,如图4和图5,所述方法包括:
S10、当接收到携带(offset,length,data)的写请求时,根据所述length将写请求分发到其对应的处理池,其中,所述处理池与4K、8K、16K、32K、64K及128K中一个对应;
S20、在所述处理池对应的缓存哈希表内查找所述offset,若果未查找到,则执行步骤S30,若查找到,则执行步骤S40;
S30、以offset为key散列入哈希表,并将其count记为1以及执行步骤80,其中,所述缓存哈希表不缓存所述data;
S40、将所述offset对应的访问次数count加1,并所述data缓存至所述缓存哈希表;
S50、将offset和count发往所述处理池对应的缓存链表以查找所述offset,如果未查找到,则执行步骤S60,如果查找到,则执行步骤S70;
S60、将offset插入缓存链表头部,并执行步骤S80,其中,当所述缓存链表已满时,淘汰缓存链表尾部的最远访问记录,并从缓存哈希表删除被淘汰的offset;
S70、更新其访问时间和次数,并根据所述访问时间重新排序缓存链表;
S80、将写入访问对应的数据通过网络发往后端存储设备。
实施例二
本实施例提供了一种基于TCMU虚拟块设备的缓存数据访问方法,所述访问为读取访问,如图4和图6,所述方法包括:
M10、当接收到携带(offset,length,buffer)的写请求时,根据所述length将写请求分发到其对应的处理池,其中,所述处理池与4K、8K、16K、32K、64K及128K中一个对应;
M20、在所述处理池对应的缓存哈希表内查找所述offset,若果未查找到,则执行步骤S30,若查找到,则执行步骤S40;
M30、通过网络从后端存储设备读取所述数据,并以offset为key散列入哈希表,并将所述位置的访问次数count记为1,其中,所述缓存哈希表不缓存所述data;
M40、将所述访问次数count与1进行比较,若等于1,则执行不是M50,若大于1,则执行步骤M60;
M50、通过网络从后端存储设备读取数据,将所述count加1,并将所述数据缓存至缓存哈希表,以及将offset和count发往所述处理池对应的缓存链表,执行步骤M70;
M60、从缓存哈希表读取所述数据,将所述count加1,并将offset和count发往所述处理池对应的缓存链表,执行步骤M70;
M70、判断所述offset是否存在于所述缓存链表中,若未存在,则执行步骤M80,若存在,则执行步骤M90;
M80、将offset插入缓存链表头部,其中,当所述缓存链表已满时,淘汰缓存链表尾部的最远访问记录,并从缓存哈希表删除被淘汰的offset;
M90、更新所述位置对应的访问时间和访问次数,并根据所述访问时间重新排序缓存链表。
本发明还提供了一种基于TCMU虚拟块设备的缓存数据访问系统,如图7所示,其包括:
接收模块101,用于接收应用程序的访问请求,其中,所述访问请求携带访问数据的长度及访问TCMU虚拟块设备的位置;
查找模块102,用于根据所述长度确定其所属的处理池,并在所述处理池对应的缓存哈希表内查找所述位置对应的访问次数;
写入模块103,用于当所述访问请求为写请求且所述访问次数大于等于1时,将所述访问次数加一,并将所述写请求对应的数据保存至缓存哈希表,以及在所述处理池对应的缓存链表中查找所述位置;
插入模块104,用于当未查找到所述位置时,将所述位置及访问次数插入所述缓存链表头部。
所述基于TCMU虚拟块设备的缓存数据访问系统,如图8所示,其还包括:
读取模块105,用于当所述访问请求为读请求且所述访问次数大于等于1时,读取所述读请求对应的数据,并将所述访问次数加一,以及在所述缓存链表中查找所述位置。
上述基于TCMU虚拟块设备的缓存数据访问系统的各个模块在上述方法中已经详细说明,在这里就不再一一陈述。
在本发明所提供的实施例中,应该理解到,所揭露的系统和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。