一种文件合并方法及装置转让专利

申请号 : CN201710245993.2

文献号 : CN108733306B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 朱云生

申请人 : 华为技术有限公司

摘要 :

本发明实施例提供了一种文件合并方法、装置和存储系统所述存储系统包括控制器和固态硬盘。所述控制器读取所述固态硬盘的第一文件和第二文件,其中第一文件包括第一数据以及所述第一数据的关键字。第二文件包括第二数据以及第二数据的关键字。所述控制器中保存有第一数据的物理地址与第一文件的标识之间的对应关系,以及所述第二数据的物理地址与第二文件的标识之间的对应关系。然后,所述控制器判断所述第一数据的关键字与所述第二数据的关键字是否相同,当所述第一数据的关键字与所述第二数据的关键字不相同时,所述控制器创建第三文件,将所述第一数据和第二数据分别重定向到所述第三文件。可以消除固态硬盘的写放大。

权利要求 :

1.一种文件合并方法,其特征在于,所述方法应用于存储系统中,所述存储系统包括控制器和固态硬盘,包括:所述控制器读取所述固态硬盘中的第一文件和第二文件,其中,所述第一文件包括第一数据以及所述第一数据的关键字,所述第二文件包括第二数据以及所述第二数据的关键字,所述第一数据存储于所述固态硬盘中的实际地址为所述第一数据的物理地址,所述第二数据存储于所述固态硬盘中的实际地址为所述第二数据的物理地址,所述控制器中保存有所述第一数据的物理地址与第一文件的标识之间的对应关系,并且所述控制器中保存有所述第二数据的物理地址与第二文件的标识之间的对应关系;

所述控制器判断所述第一数据的关键字与所述第二数据的关键字是否相同;

当所述第一数据的关键字与所述第二数据的关键字不相同时,所述控制器创建第三文件,为所述第三文件分配标识;

所述控制器创建所述第一数据的物理地址与所述第三文件的标识之间的对应关系,并且创建所述第二数据的物理地址与所述第三文件的标识之间的对应关系;

所述控制器删除所述第一数据的物理地址与所述第一文件的标识之间的对应关系,以及删除所述第二数据的物理地址与所述第二文件的标识之间的对应关系。

2.根据权利要求1所述的方法,其特征在于,所述存储系统采用日志结构合并树的结构存储数据,所述日志结构合并树包括至少两个层级,其中至少两个层级中的第一层级中的多个文件均是没有经过合并的文件,所述至少两个层级中的第二层级中的文件是由所述第一层级中的多个文件合并而来的文件,第一层级包括所述第一文件和所述第二文件,所述第二层级包括所述第三文件。

3.根据权利要求2所述的方法,其特征在于,还包括:

所述控制器从所述第一文件所位于的所述固态硬盘的一个或多个擦除块中选择第一擦除块,所述第一擦除块存储的有效数据的数据量高于设定阈值,所述第一数据是所述第一擦除块存储的有效数据的一部分或者全部;

所述控制器从所述第二文件所位于的所述固态硬盘的一个或多个擦除块中选择第二擦除块,所述第二擦除块存储的有效数据的数据量高于所述设定阈值,所述第二数据是所述第二擦除块存储的有效数据的一部分或者全部。

4.根据权利要求2或3所述的方法,其特征在于,还包括:

所述控制器监控所述第一层级所包含的文件的数量;

确定所述第一层级所包含的文件的数量达到预设阈值时,所述控制器从所述第一层级所包含的文件中选择所述第一文件和所述第二文件。

5.根据权利要求2所述的方法,其特征在于,所述第一层级还包括第四文件,所述方法还包括:

所述控制器读取所述固态硬盘中的第四文件,所述第四文件包括第三数据以及所述第三数据的关键字,所述第三数据存储于所述固态硬盘中的实际地址为所述第三数据的物理地址,所述控制器中保存有所述第三数据的物理地址与所述第四文件的标识之间的对应关系;

所述控制器判断所述第一数据的关键字和所述第三数据的关键字是否相同;

当所述第一数据的关键字与所述第三数据的关键字相同时,所述控制器确定所述第三数据写入所述固态硬盘的时间点是否早于所述第一数据写入所述固态硬盘的时间点;

当所述第三数据写入所述固态硬盘的时间点早于所述第一数据写入所述固态硬盘的时间点时,所述控制器删除所述第三数据。

6.一种文件合并装置,其特征在于,所述装置位于存储系统的控制器中,所述存储系统还包括固态硬盘,所述装置包括:读取模块,用于读取所述固态硬盘中的第一文件和第二文件,其中,所述第一文件包括第一数据以及所述第一数据的关键字,所述第二文件包括第二数据以及所述第二数据的关键字,所述第一数据存储于所述固态硬盘中的实际地址为所述第一数据的物理地址,所述第二数据存储于所述固态硬盘中的实际地址为所述第二数据的物理地址;

存储模块,用于保存所述第一数据的物理地址与第一文件的标识之间的对应关系,以及所述第二数据的物理地址与第二文件的标识之间的对应关系;

判断模块,用于判断所述第一数据的关键字与所述第二数据的关键字是否相同;

创建模块,用于当所述第一数据的关键字与所述第二数据的关键字不相同时,创建第三文件,为所述第三文件分配标识;创建所述第一数据的物理地址与所述第三文件的标识之间的对应关系,并且创建所述第二数据的物理地址与所述第三文件的标识之间的对应关系;

删除模块,用于删除所述第一数据的物理地址与所述第一文件的标识之间的对应关系,以及删除所述第二数据的物理地址与所述第二文件的标识之间的对应关系。

7.根据权利要求6所述的装置,其特征在于,所述存储系统采用日志结构合并树的结构存储数据,所述日志结构合并树包括至少两个层级,其中至少两个层级中的第一层级中的多个文件均是没有经过合并的文件,所述至少两个层级中的第二层级中的文件是由所述第一层级中的多个文件合并而来的文件,第一层级包括所述第一文件和所述第二文件,所述第二层级包括所述第三文件。

8.根据权利要求7所述的装置,其特征在于,还包括:

选择模块,用于从所述第一文件所位于的所述固态硬盘的一个或多个擦除块中选择第一擦除块,所述第一擦除块存储的有效数据的数据量高于设定阈值,所述第一数据是所述第一擦除块存储的有效数据的一部分或者全部;以及从所述第二文件所位于的所述固态硬盘的一个或多个擦除块中选择第二擦除块,所述第二擦除块存储的有效数据的数据量高于所述设定阈值,所述第二数据是所述第二擦除块存储的有效数据的一部分或者全部。

9.根据权利要求8所述的装置,其特征在于,

所述选择模块,还用于监控所述第一层级所包含的文件的数量;确定所述第一层级所包含的文件的数量达到预设阈值时,从所述第一层级所包含的文件中选择所述第一文件和所述第二文件。

10.根据权利要求7所述的装置,其特征在于,所述第一层级还包括第四文件,所述读取模块,还用于读取所述固态硬盘中的第四文件,所述第四文件包括第三数据以及所述第三数据的关键字,所述第三数据存储于所述固态硬盘中的实际地址为所述第三数据的物理地址;

所述存储模块,还用于保存所述第三数据的物理地址与所述第四文件的标识之间的对应关系;

所述判断模块,还用于判断所述第一数据的关键字和所述第三数据的关键字是否相同;当所述第一数据的关键字与所述第三数据的关键字相同时,确定所述第三数据写入所述固态硬盘的时间点是否早于所述第一数据写入所述固态硬盘的时间点;

所述删除模块,还用于当所述第三数据写入所述固态硬盘的时间点早于所述第一数据写入所述固态硬盘的时间点时,删除所述第三数据。

11.一种存储系统,其特征在于,包括控制器和固态硬盘;

所述控制器,用于读取所述固态硬盘中的第一文件和第二文件,其中,所述第一文件包括第一数据以及所述第一数据的关键字,所述第二文件包括第二数据以及所述第二数据的关键字,所述第一数据存储于所述固态硬盘中的实际地址为所述第一数据的物理地址,所述第二数据存储于所述固态硬盘中的实际地址为所述第二数据的物理地址,所述控制器中保存有所述第一数据的物理地址与第一文件的标识之间的对应关系,并且所述控制器中保存有所述第二数据的物理地址与第二文件的标识之间的对应关系;

判断所述第一数据的关键字与所述第二数据的关键字是否相同;

当所述第一数据的关键字与所述第二数据的关键字不相同时,创建第三文件,为所述第三文件分配标识;

创建所述第一数据的物理地址与所述第三文件的标识之间的对应关系,并且创建所述第二数据的物理地址与所述第三文件的标识之间的对应关系;

删除所述第一数据的物理地址与所述第一文件的标识之间的对应关系,以及删除所述第二数据的物理地址与所述第二文件的标识之间的对应关系。

12.根据权利要求11所述的存储系统,其特征在于,所述存储系统采用日志结构合并树的结构存储数据,所述日志结构合并树包括至少两个层级,其中至少两个层级中的第一层级中的多个文件均是没有经过合并的文件,所述至少两个层级中的第二层级中的文件是由所述第一层级中的多个文件合并而来的文件,第一层级包括所述第一文件和所述第二文件,所述第二层级包括所述第三文件。

13.根据权利要求12所述的存储系统,其特征在于,

所述控制器,还用于从所述第一文件所位于的所述固态硬盘的一个或多个擦除块中选择第一擦除块,所述第一擦除块存储的有效数据的数据量高于设定阈值,所述第一数据是所述第一擦除块存储的有效数据的一部分或者全部;以及从所述第二文件所位于的所述固态硬盘的一个或多个擦除块中选择第二擦除块,所述第二擦除块存储的有效数据的数据量高于所述设定阈值,所述第二数据是所述第二擦除块存储的有效数据的一部分或者全部。

14.根据权利要求12或13所述的存储系统,其特征在于,

所述控制器,还用于监控所述第一层级所包含的文件的数量;以及确定所述第一层级所包含的文件的数量达到预设阈值时,所述控制器从所述第一层级所包含的文件中选择所述第一文件和所述第二文件。

15.根据权利要求12所述的存储系统,其特征在于,所述第一层级还包括第四文件,所述控制器,还用于读取所述固态硬盘中的第四文件,所述第四文件包括第三数据以及所述第三数据的关键字,所述第三数据存储于所述固态硬盘中的实际地址为所述第三数据的物理地址,所述控制器中保存有所述第三数据的物理地址与所述第四文件的标识之间的对应关系;判断所述第一数据的关键字和所述第三数据的关键字是否相同;当所述第一数据的关键字与所述第三数据的关键字相同时,确定所述第三数据写入所述固态硬盘的时间点是否早于所述第一数据写入所述固态硬盘的时间点;当所述第三数据写入所述固态硬盘的时间点早于所述第一数据写入所述固态硬盘的时间点时,删除所述第三数据。

16.一种计算机可读取存储介质,其特征在于,所述计算机可读取存储介质存储有计算机程序,所述计算机程序被计算机设备执行时能够实现权利要求1-5任一所述的方法。

说明书 :

一种文件合并方法及装置

技术领域

[0001] 本发明实施例涉及存储技术领域,尤其涉及一种文件合并方法及装置。

背景技术

[0002] 日志结构合并树(log structured merge tree,LSMtree)是相对应B+树的一种数据结构,其主要是为了克服B+树的大量随机IO导致性能低的问题,本质是实现读写之前取得平衡,牺牲读性能来大幅度提高写性能。
[0003] 业界有很多基于LSMtree原理实现的KV存储引擎,这些存储引擎被广泛应用各种数据存储系统中。这些应用实现KV存储引擎的核心思想是将随机IO转化为顺序IO写入,数据再通过内存整理为局部有序的文件存储到文件系统,最后再对多个文件系统中的文件进行合并和排序提升读取性能。具体的,存储引擎先从固态硬盘中获取待合并的多个文件,对这些文件执行合并操作,再将合并后的数据写入固态硬盘中。然而待合并的文件中通常包含一些关键字不同的数据,而对于关键字不同的数据在合并的过程中并不会产生新的数据。因此存储引擎将这些数据再次写入固态硬盘会造成固态硬盘的写放大。

发明内容

[0004] 本发明公开了一种文件合并方法、装置和存储系统,可以消除固态硬盘的写放大。
[0005] 第一方面提供了一种文件合并方法,该方法应用于存储系统中。所述存储系统包括控制器和固态硬盘。所述控制器读取所述固态硬盘的第一文件和第二文件,其中第一文件包括第一数据以及所述第一数据的关键字。第二文件包括第二数据以及第二数据的关键字。所述第一数据存储于所述固态硬盘中的实际地址为第一数据的物理地址,所述第二数据存储于所述固态硬盘中的实际地址为所述第二数据的物理地址。所述控制器中保存有第一数据的物理地址与第一文件的标识之间的对应关系,以及所述第二数据的物理地址与第二文件的标识之间的对应关系。然后,所述控制器判断所述第一数据的关键字与所述第二数据的关键字是否相同,当所述第一数据的关键字与所述第二数据的关键字不相同时,所述控制器创建第三文件,为所述第三文件分配标识。所述控制器创建所述第一数据的物理地址与所述第三文件的标识之间的对应关系,并且创建所述第二数据的物理地址与所述第三文件的标识之间的对应关系,删除所述第一数据的物理地址与所述第一文件的标识之间的对应关系,以及删除所述第二数据的物理地址与所述第二文件的标识之间的对应关系。
[0006] 按照第一方面提供的文件合并方法,对于关键字不同的数据,控制器重新建立关键字不同的数据的关键字与新的文件标识之间的对应关系,删除关键字与原有的文件标识之间的对应关系,而并没有将这些关键字不同的数据再次写入固态硬盘,从而消除了固态硬盘的写放大。
[0007] 基于第一方面,在第一种实现方式中,所述存储系统采用日志结构合并树的结构存储数据。所述日志结构合并树包括至少两个层级,其中至少两个层级中的第一层级中的多个文件均是没有经过合并的文件,所述至少两个层级中的第二层级中的文件是由所述第一层级中的多个文件合并而来的文件。第一层级包括所述第一文件和所述第二文件,所述第二层级包括所述第三文件。
[0008] 结合第一方面的第一种实现方式,在第一方面的第二种实现方式中,所述控制器从所述第一文件所位于的所述固态硬盘的一个或多个擦除块中选择第一擦除块。所述第一擦除块存储的有效数据的数据量高于设定阈值,所述第一数据是所述第一擦除块存储的有效数据的一部分或者全部。并且,所述控制器从所述第二文件所位于的所述固态硬盘的一个或多个擦除块中选择第二擦除块。所述第二擦除块存储的有效数据的数据量高于设定阈值,所述第二数据是所述第二擦除块存储的有效数据的一部分或者全部。在这种实现方式中,所述第一文件和所述第二文件分别位于所述固态硬盘的一个或多个擦除块中。然而,并不是所述第一文件和所述第二文件所位于的所有擦除块都需要按照第一方面描述的方式执行,仅仅是那些有效数据的数据量高于所述设定阈值的擦除块才按照第一方面描述的方式执行。而对于那些有效数据的数据量没有高于所述设定阈值的擦除块,即使数据的关键字不相同,也仍然需要重新分配擦除块,将这些数据写入新的擦除块中。这种实现方式的好处在于,可以将离散地分布在擦除块中的有效数据整合在一起,对于有效数据含量高的擦除块则不需要整合,从而进一步减小了固态硬盘的写放大。
[0009] 结合第一方面的第一种或第二种实现方式,在第三种实现方式中,所述控制器监控所述第一层级所包含的文件的数量。确定所述第一层级所包含的文件的数量达到预设阈值时,所述控制器从所述第一层级所包含的文件中选择所述第一文件和所述第二文件。所述第一层级可能仅包含所述第一文件和所述第二文件,也可能除了所述第一文件和所述第二文件之外,还包括其他文件。按照所述第三种实现方式,文件合并的触发条件为第一层级所包含的文件的数量达到预设阈值。这是因为,随着第一层级所包含的文件的增多,读数据的效率会随之下降,因此当所述文件的数量达到预设阈值时,开始启动文件合并的操作有利于提高读数据的效率。
[0010] 结合第一方面的第一种实现方式,在第四种实现方式中,所述第一层级还包括第四文件,在这种实现方式中,所述控制器读取所述固态硬盘中的第四文件。所述第四文件包括第三数据以及所述第三数据的关键字,所述第三数据存储于所述固态硬盘中的实际地址为所述第三数据的物理地址。所述控制器中保存有所述第三数据的物理地址与所述第四文件的标识之间的对应关系。然后,所述控制器判断所述第一数据的关键字和所述第三数据的关键字是否相同,当所述第一数据的关键字与所述第三数据的关键字相同时,所述控制器确定所述第三数据写入所述固态硬盘的时间点是否早于与所述第一数据写入所述固态硬盘的时间点。当所述第三数据写入所述固态硬盘的时间点早于与所述第一数据写入所述固态硬盘的时间点时,所述控制器删除所述第三数据。这是文件合并的另一种情况:对于关键字相同的多个数据,比较数据的版本信息,仅保留最新版本的数据,删除旧版本的数据,由此可以节省存储空间。
[0011] 本申请第二方面提供了一种文件合并装置,用于执行第一方面以及第一方面任意一种实现方式提供的方法。
[0012] 本申请第三方面提供了一种存储系统,用于执行第一方面以及第一方面任意一种实现方式提供的方法。
[0013] 本申请第四方面提供了一种计算机程序产品,包括计算机指令,所述指令用于执行前述第一方面以及所述第一方面的任意一种可能的实现方式中所述的方法。

附图说明

[0014] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍。
[0015] 图1为本发明实施例提供的一种存储系统的组成图;
[0016] 图2为本发明实施例提供的一种控制器11的结构示例图;
[0017] 图3为本发明实施例提供的日志结构合并树示意图;
[0018] 图4为本发明实施例提供的控制器11组织数据的结构图;
[0019] 图5为本发明实施例提供的另一种存储系统的组成图;
[0020] 图6为本发明实施例提供的文件合并方法的流程示意图;
[0021] 图7为本发明实施例提供的文件合并装置的结构图。

具体实施方式

[0022] 下面将结合附图,对本发明实施例中的技术方案进行清楚、完整地描述。
[0023] 层级数据库(level database)数据存储采用日志结构合并树(Log-Structured Merge Tree,LSM-Tree)的结构,将十亿级别规模的Key-Value型数据进行持久化存储,Key-Value型数据为关键字(英文:key)和值(英文:value)的组合,所述关键字可以唯一标识所述数据,所述值是指待写入存储系统的数据(以下简称为数据)。LSM-Tree将硬盘的随机写转化为顺序写,从而提高了写数据的速度。本发明实施例将LSM-Tree应用于包含固态硬盘(英文:Solid State Disk,SSD)的存储系统中。
[0024] 下面结合图1和图2,对本实施例所描述的,将LSM-Tree应用于包含固态硬盘的一种存储系统进行介绍。
[0025] 如图1所示,存储系统包括至少一个控制器11和至少一个固态硬盘44。
[0026] 控制器11通过存储区域网络(英文:storage area network,SAN)与主机(图中未示出)连接。控制器11可以是一种计算设备,如服务器、台式计算机等等。在控制器11上安装有写入系统以及应用程序。控制器11可以接收来自主机的输入输出(I/O)请求。控制器11还可以存储I/O请求中携带的数据,并且将该数据写入固态硬盘44中。控制器11属于系统控制器,系统控制器是独立的设备,不同于固态硬盘44中的控制芯片。本实施例将固态硬盘44的控制芯片称为固态硬盘控制器。如无特别指明,本实施例中的控制器都是指系统控制器。
[0027] 固态硬盘44是以闪存(英文:flash memory)芯片为存储介质的存储器,又名固态驱动器(Solid State Drive,SSD)。
[0028] 图2是图1中的控制器11的结构示例图,如图2所示,控制器11包括接口卡110、处理器112、存储器111和接口卡113。
[0029] 接口卡110,用于和主机通信,用于接收主机发送的指令,控制器11可以通过接口卡110接收主机的写入指令。例如,写入指令包括关键字(英文:key)和值(英文:value),,所述关键字是所述值的标识。举一个具体的例子,所述值可以是学生的各种信息,所述关键字可以是该学生的学号,或者其他表示该学生某一方面属性的标识。
[0030] 接口卡113,用于和固态硬盘44通信,控制器11可以通过接口卡113将写数据指令(包括上面描述的写入指令中的关键字和数据,以及控制器11为所述数据分配的逻辑地址)发送给固态硬盘44存储。
[0031] 处理器112,是一个中央处理器(英文:central processing unit,CPU)。在本发明实施例中,处理器112可以用于接收来自主机的写入指令或者读取指令并且处理这些指令。处理器112还可以将所述写入指令中的数据发送给固态硬盘44。此外,处理器112,还可以用于在一定条件下执行文件的合并操作。处理器112,还用于为所述数据分配逻辑地址,保存所述关键字与所述分配的逻辑地址之间的对应关系,以用于将来根据关键字与所述分配的逻辑地址之间的对应关系,读取所述数据。存储器111,包括易失性存储器,非易失性存储器或其组合。易失性存储器例如为随机访问存储器(英文:random-access memory,RAM)。非易失性存储器例如为软盘、硬盘、固态硬盘(solid state disk,SSD)、光盘等各种可以存储程序代码的机器可读介质。存储器111具有保电功能,保电功能是指系统发生掉电又重新上电时,存储器111中存储的数据也不会丢失。存储器111可以有一个或者多个,用于临时存储从主机接收的数据或从固态硬盘44读取的数据,例如控制器11接收主机发送的多个写入指令时,可以将所述多个写入指令中的数据暂时保存在存储器111中。
[0032] 此外,存储器111还保存有内存表(英文:memtable)和不可写内存表(英文:immutable memtable)。根据LSM-Tree机制,memtable用于存储一段时间内接收的主机发送的写入指令。示例性的,memtable中存储的写入指令可以如表1所示:
[0033]
[0034]
[0035] 表1
[0036] 如表1所示,memtable中保存有多组数据。控制器11将数据写入存储器111的memtable中的同时,还会将数据的版本信息保存至memtable中,即memtable中保存的每组数据都包括关键字、值和版本信息。关键字和值已在上面的段落中进行了介绍,这里不再赘述。版本信息是指数据写入的时间信息,或者其他用以标识数据写入的先后顺序的信息。可以理解的是,本实施例中的版本信息(也可以称为版本或时间点)可以精确到月,也可以精确到日、时、分、秒。本实施例并不对版本信息的形式和精确度进行任何限定。另外,只要在这段时间内写入的数据都会保存在所述memtable中。因此,所述memtable中包含对应不同关键字的数据。数据的关键字在memtable中按照由小到大的顺序排布,便于后续快速查找数据,控制器11通过对关键字key进行大小排序,将新写的数据写入memtable中的合适的位置上,以保持memtable中存储的数据的关键字Key的有序性排列。
[0037] 如图3所示,根据LSM-Tree机制,主机的应用(英文:application)通过API接口发送写入指令至控制器11,控制器11接收到所述写入指令后,生成日志文件(英文:LOG),日志文件记录有数据的版本信息(英文:Version),然后控制器11将数据保存至存储器111中的memtable中。当memtable中保存的所有数据的数据量达到预设阈值时,所述memtable将转化为immutable memtable。immutable memtable不会再接收新的数据,存储器111中会再创建一个新的memtable。所述新的memtable将继续接收数据。因此存储器111中可能保存有一个或多个immutable memtable,但只有一个memtable。每个immutable memtable中的数据是固化的,而memtable可以不断接收新写入的数据。在LSM-Tree机制中,每个immutable memtable中的数据被倾倒(英文:dump)在一个静态排序表(Static Sorted Table,SST)文件(以下简称为文件)中。可以理解的是,所述存储系统中包含多个文件,每个文件与一个immutable memtable对应。所述文件用于接收由所述immutable memtable倾倒而来的数据。本实施例中的第一层级的文件包括直接由immutable memtable倾倒而来的数据,所述第一层级的文件也是未经过合并的文件。
[0038] 下面以一个immutable memtable中的数据被倾倒在一个文件中为例说明其具体过程。首先,控制器11为待倾倒的文件分配文件标识(文件标识是文件的标识的简称),所述文件标识用于唯一指示所述待倾倒的文件。然后,控制器11为所述待倾倒的文件中的数据分配一段逻辑地址,并且保存所述文件标识与保存的逻辑地址之间的对应关系。控制器11将这些数据以及分配的逻辑地址发送给固态硬盘44,固态硬盘44将这些数据写入擦除块中,数据保存在擦除块中的实际地址为数据的物理地址。固态硬盘44记录所述逻辑地址与物理地址之间的对应关系,并且将所述逻辑地址与物理地址之间的对应关系发送给控制器11。控制器11将所述逻辑地址与物理地址之间的对应关系保存在存储器111中。
[0039] 本实施例中,控制器11包含文件系统,因此可以通过文件的形式组织数据。具体的,请参见图4,图4为本发明实施例提供的控制器11组织数据的结构图。控制器11组织数据的结构如图4所示。如图4所示,在固态硬盘的44的擦除块(英文:block)中保存数据和数据的关键字,该数据保存在擦除块中的实际地址为该数据的物理地址。控制器11将一个或多个擦除块映射为一个逻辑空间,举例来说,所述逻辑空间可以是逻辑单元(logical unit,LU)。控制器11和固态硬盘44都保存有该数据的逻辑地址,以及所述逻辑地址与物理地址之间的对应关系。该数据的逻辑地址是指该数据所在的逻辑单元的标识(例如,LU ID)、该数据位于该逻辑单元内的起始位置(例如,Logical block Address)和长度。另外,由于控制器11在逻辑空间的上层还具有文件系统,因此用户可以通过文件的形式访问数据。在存储器111中保存的memtable,其包括数据和数据的关键字,数据的关键字标识数据,存储器111还保存有数据的所述逻辑地址与文件的标识之间的对应关系。可选的,还可以保存所述物理地址与文件的标识之间的对应关系。由于控制器11还用于保存所述关键字与所述分配的逻辑地址之间的对应关系,因此根据文件的标识与逻辑地址的对应关系,控制器11可以通过文件的标识快速的查找文件中的每个数据,以及根据数据的所述物理地址与文件的标识之间的对应关系,快速的读取固态硬盘44中保存的数据。
[0040] 由上面的描述可知,每个immutable memtable中包含不同关键字的数据,那么,相应地,与immutable memtable对应的文件中保存的也是不同关键字的数据。也就是说,同样的关键字所对应的数据会分布在不同的文件中。因此,当接收读取指令要求读取数据时,固态硬盘44需要根据读取指令携带的关键字从不同的文件中获取所述关键字对应的各个数据,并根据版本信息确认出最新的数据返回给用户。这样的过程会影响读取数据的效率,因此有必要对文件进行合并。合并的目的是对不同文件中,关键字相同的数据进行合并,合并后同一个关键字只对应一个数据或少量的几个数据(根据系统设置或者用户需求设定)。
[0041] 具体的,当第一层级的文件的总量达到一定阈值时,需要将第一层级中的文件进行合并。其合并方式可以是,对于第一层级中的所有文件进行合并,也可以是第一层级中的部分文件进行合并,还可以是由用户指定第一层级中待合并的文件。合并后生成的新的文件,就是第二层级的文件。依此类推,当第二层级的文件的总量达到一定阈值时,可以对其进行再次合并,建立第三层级的文件。
[0042] 另外,在SST文件中保存有多个数据以及每个数据的关键字。每个文件保存的所有关键字是有序排列的,通过起始关键字与终止关键字的组合标识每个文件的关键字范围,由于控制器11通过对关键字进行大小排序,将新写的数据写入memtable中的合适的位置上,以保持memtable中存储的数据的关键字的有序排列,在将memtable转换成immutable memtable后,immutable memtable中的数据的关键字也是有序排列的。所以将immutable memtable中的数据倾倒转存到固态硬盘44中保存为一个SST文件,其中的数据的关键字也是有序排列的。
[0043] 下面对固态硬盘的物理结构以及写数据的方式进行介绍。
[0044] 固态硬盘44包括固态硬盘控制器和存储介质。其中,固态硬盘控制器用于执行控制器11发送的写数据指令或者读数据指令等。
[0045] 存储介质通常包括一个或多个闪存芯片。每个闪存芯片包括若干个块。闪存芯片在读取或写入时是以一个页(英文:page)为基础的,但擦除写入只能以一个块为基础,擦除写入是指将这个块的所有位都设置为“1”。在擦除之前,固态硬盘控制器需要先将这个块中的有效数据复制到另一个块的空白页中去。
[0046] 每个块包含多个页(英文:page)。固态硬盘44在执行写数据指令时,是以页为单位来写数据的。举例来说,控制器11向固态硬盘控制器发送一个写数据指令。所述写数据指令包括数据的逻辑地址。固态硬盘44建立并保存所述逻辑地址与写入所述数据的页的实际地址之间的对应关系。当控制器11向固态硬盘控制器发送读数据指令,要求读取所述数据时,所述读数据指令中包括所述逻辑地址。固态硬盘控制器根据所述逻辑地址、以及所述逻辑地址与实际地址之间的对应关系读取所述数据,并将该数据发送给控制器11。
[0047] 另外,如图4所示,固态硬盘44中还保存有日志文件,控制器11在接收写入指令之后,首先将写入指令携带的信息写入所述日志文件,再将所述写入指令写入memtable。首先写入日志文件的目的是当存储系统发生故障从而导致存储器111中的数据发生丢失时,可以用日志文件中的数据进行恢复。由于写入的数据刚开始是保存在存储器111中的,如果固态硬盘44中没有日志文件,此时如果存储系统发生异常,存储器111中的数据还没有来得及存储到固态硬盘44,所以存储系统会丢失数据。为了避免这种情况,在写入数据至存储器111前,控制器11先将数据的写入记录保存在固态硬盘44的日志文件中,然后再保存数据至存储器111中,这样即使系统发生异常,也可以从日志文件中恢复数据,不会造成数据的丢失。
[0048] 另外,固态硬盘44中还保存有一个或多个管理文件(图3中未示出),用于记录各个文件所在的层级,单个文件中最大的关键字以及最小的关键字,每个文件的标识,每个文件所包含的关键字的区间以及其他元数据信息。其他元数据信息包括但不限于:数据存储在固态硬盘44中的物理地址,逻辑地址和对数据进行写入的写入记录,以及物理地址与所属文件的标识的对应关系等。。写入记录包括用户对数据进行写入的方式和版本。
[0049] 下面结合图5,对本实施例所描述的,将LSM-Tree应用于包含固态硬盘的另一种存储系统进行介绍。
[0050] 本发明实施例还可以将LSM-Tree应用于包含服务器的存储系统中。请参见图5,图5为本发明实施例提供的另一种存储系统的组成图。如图5所示的存储系统包括主机51和至少一个服务器52,主机51和服务器52之间通信。服务器52包括处理器、内存和固态硬盘,服务器52的处理器是CPU(英文:central processing unit,CPU),用于接收主机51发送的写入指令后,将写入指令中的Key-Value型数据先写入内存中的memtable中,当memtable中的数据量达到预设阈值后,服务器52的处理器将memtable转换为immutable memtable,然后将immutable memtable中的数据倾倒保存为固态硬盘中的一个SST文件。本存储系统中的LevelDB数据存储的功能由服务器52的处理器执行,以及数据的合并操作由服务器52的处理器执行。
[0051] 服务器52可以是任何计算设备,如应用服务器、台式计算机、笔记本电脑等等。服务器52的功能包括上述固态硬盘44的功能,具体实现细节可参照上述固态硬盘44的功能描述,在这里不再赘述。
[0052] 下面结合图1所示的存储系统,以及图2所示的控制器11的结构,对本发明实施例公开的文件合并方法进行具体的描述。请参见图6,图6为本发明实施例提供的一种文件合并方法的流程图。所述方法既可以应用在图1所示的存储系统中,也可以应用在图5所示的存储系统中。如图6所示,所述数据的存储方法由控制器11中的处理器112执行,具体包括如下步骤。
[0053] S600、控制器11监控固态硬盘保存的第一层级的文件的数量。
[0054] 由前面对于图3的描述,第一层级的各个文件中的数据是直接由immutable memtable倾倒而来的。每个immutable memtable对应一个文件。当存储器111中的数据的大小达到一定水位线时,控制器11将其存储器111中各个immutable memtable中的数据倾倒至分配的文件中。随着固态硬盘中保存的文件越来越多,读数据的效率也会随之下降。这是因为各个文件中可能都分布有同一个关键字的数据,那么在读取的时候,需要遍历各个文件从而获得最新版本的数据。因此,控制器11监控第一层级的文件的数量,当第一层级的文件的数量达到预设阈值时,执行步骤S610。
[0055] 控制器11监控的一种方式可以是,控制器11在其存储器111中维护一个文件数量值,并设置所述文件数量值的初始值为0。控制器11第一次将一个immutable memtable中的数据发送给固态硬盘之后,固态硬盘将这些数据写入文件,写入成功后,固态硬盘会向控制器11发送一个响应消息。控制器11接收所述响应消息之后,对所述初始值执行加1的操作,依此类推。当第一层级的文件经过合并,再将当前的文件数量值减去经过合并的文件的数量。控制器11监控的另一种方式可以是,控制器11在其存储器111中维护一个计数值,计数值用于指示第一层级待存储的文件个数的最大限制。控制器11设置所述计数值的初始值为预设阈值,控制器11第一次将一个immutable memtable中的数据发送给固态硬盘44之后,固态硬盘44将这些数据写入文件,写入成功后,固态硬盘会向控制器11发送一个响应消息。控制器11接收所述响应消息之后,对所述初始值执行减1的操作,依此类推。当第一层级的文件经过合并,再将当前的计数值加上经过合并的文件的数量。当所述计数值的值为0时,表明第一层级不能再增加新的文件了,即固态硬盘44保存的第一层级的文件的数量达到所述预设阈值。
[0056] S610、当监控到固态硬盘44保存的第一层级的文件的数量达到所述预设阈值时,确定第一层级中待合并的文件。
[0057] 控制器11可以选择对第一层级的所有文件进行合并,也可以随机地对第一层级中的部分文件进行合并,还可以根据用户指定对第一层级中的部分文件进行合并。
[0058] S620、控制器11发送读数据指令至固态硬盘44,读数据指令包括待合并文件的数据的逻辑地址。
[0059] 由于存储器111中保存有待合并文件的文件标识与逻辑地址之间对应关系,因此控制器11可以根据所述对应关系获取待合并文件所包含的数据的逻辑地址。
[0060] 为了描述方便,下面以待合并文件是第一文件和第二文件为例进行说明。S630、固态硬盘44读取第一文件和第二文件中的数据。固态硬盘44建立并保存所述逻辑地址与写入所述数据的页的实际地址(即物理地址)之间的对应关系。当控制器11向固态硬盘控制器11发送读数据指令,要求读取所述数据时,所述读数据指令中包括所述逻辑地址。固态硬盘44接收到读数据指令后,固态硬盘根据所述逻辑地址、以及所述逻辑地址与实际地址之间的对应关系读取所述数据,并将该数据发送给控制器11。
[0061] 可选的,控制器11向固态硬盘44发送的读数据指令中可以包含数据的物理地址,而不包含数据的逻辑地址。固态硬盘直接根据所述数据的物理地址读取所述数据,发送给控制器11。
[0062] 以下表1-1和下表1-2所示的两个文件为例,如下表1-1所示的第一文件FILE1的关键字范围为[1,10],表1-2所示的第二文件FILE2的关键字范围为[2,10],第一文件FILE1和第二文件FILE2重叠的关键字范围为[2,10]。如表1-1和表1-2所示,第一文件FILE1和第二文件FILE2中的写入方式表明了对数据的写入类型包括写入数据、删除和修改数据,其中“写入数据”表示对数据进行数据赋值操作,“删除”表示将数据删除,“修改数据”表示对数据进行运算操作,运算操作包括对数据进行运算的类型和运算的粒度,运算的类型可以是对数据进行加操作或者减操作等运算类型,运算的粒度可以按照主机的应用程序来定义。例如,第一文件FILE1中,关键字1的写入方式表明了将关键字1的数据以赋值为1的写入方式保存至固态硬盘44;关键字3的写入方式表明了将第一文件FILE1中的关键字3的数据删除;关键字5的写入方式表明了将第一文件FILE1中的关键字5的数据进行加1运算。本实施方式中,对于写入方式为写入数据的数据,其为有效数据,对于写入方式为删除或者修改数据的数据,其为无效数据,在存储器111中的memtable和immutable memtable中保存的数据为有效数据和无效数据的写入记录,但是不会保存无效数据的最终的值。另外,如表1-1和表1-2所示,根据其中表示的版本可以确定出该文件中的数据是否是最新版本的数据,通过版本号标识关键字标识的数据的版本,版本号越大的,表明该关键字标识的数据的版本越新。比如表1-1和表1-2中都有关键字7标识的数据,表1-1中的关键字7标识的数据的版本号为版本2,表1-2中的关键字7标识的数据的版本号为版本3,表1-2中的关键字7标识的数据的版本号大于表1-1中的关键字7标识的数据的版本号,因此,表1-2中的关键字7标识的数据是最新版本的数据。
[0063]
[0064]
[0065] 表1-1
[0066]
[0067] 表1-2
[0068] S631、固态硬盘44发送第一文件和第二文件中的数据至控制器11。
[0069] S640、控制器11根据第一文件中的数据的关键字和第二文件中的数据的关键字,对所述第一文件和所述第二文件执行合并操作。
[0070] 这里的合并操作主要是指对于关键字相同但版本不同的数据进行合并。具体的,控制器11通过读取写入固态硬盘44的数据的写入记录,比较关键字相同的数据的版本,识别出关键字相同的最新版本的数据。
[0071] 如果最新版本的数据为有效数据,那么合并的结果是保留关键字相同的最新版本的数据,删除那些关键字相同但早于最新版本的数据。这里的有效数据包括写入方式为“写入数据”的数据。例如,基于表1-1和表1-2所示的两个待合并文件中的数据,比较表1-1和表1-2中的数据的关键字,识别出表1-1所示的关键字7与表1-2所示的关键字7为相同的关键字。其中,表1-1所示的关键字7标识的数据的版本早于表1-2所示的关键字7标识的数据的版本,并且表1-2所示的关键字7标识的数据是有效数据,那么保留表1-2所示的关键字7标识的数据,删除表1-1所示的关键字7标识的数据。
[0072] 如果最新版本的数据是写入方式为“修改数据”的数据,则所述最新版本的数据不是合并后的数据,而是对各版本的数据进行运算之后的数据。所述写入方式为“修改数据”的数据是指将要对所述数据进行的运算操作。例如,表1-1所示的关键字10标识的数据为版本3,而表1-2所示的关键字10标识的数据为版本6。在对所述关键字10标识的两个数据进行合并时,不能直接将版本6对应的数据作为合并后的数据,而是合并这两个修改数据的操作,合并后的结果是:“修改数据:加2”。
[0073] 如果最新版本的数据的写入方式为“删除”(例如,表1-2中关键字9所标识的数据),那么合并的结果是删除该关键字对应的各个版本的数据。
[0074] 下面的步骤将介绍将合并后的数据写入一个新文件的过程。根据前面的描述可知,所述新文件是位于第二层级。为了描述方便,将新文件称为第三文件。
[0075] S650、控制器11创建第三文件,为所述第三文件分配标识。
[0076] 合并的目的是将第一文件和第二文件合并为第三文件,所以合并后的数据都需要写入所述第三文件。因此,控制器11创建第三文件,并且为所述第三文件分配文件标识。可选的,控制器11还可以为第三文件中的数据分配一段逻辑地址,保存所述第三文件的标识与所述分配的逻辑地址之间的对应关系。
[0077] 由前面的描述可知,合并后的数据包括:(1)合并前的关键字不同的数据;(2)合并前的关键字相同的最新版本的数据;(3)对于合并前的关键字相同的数据进行运算后新生成的数据。对于(1)执行步骤S661、S662;对于(2)执行步骤S671和S672;对于(3)步骤S681至步骤S683。
[0078] S661、控制器11保存关键字不同的数据的物理地址和第三文件的标识之间的对应关系。
[0079] S662、控制器11删除合并前的关键字不同的数据的物理地址和待合并的文件的标识之间的对应关系。
[0080] 例如,控制器11删除关键字1的数据的物理地址与文件1的标识之间的对应关系。这意味着,当读取关键字1的数据时,将从文件3,而非文件1中读取。
[0081] S671、控制器11保存关键字相同的最新版本的数据的物理地址和第三文件的标识之间的对应关系。
[0082] S672、控制器11删除关键字相同的最新版本的数据的物理地址和待合并的文件的标识之间的对应关系。
[0083] S681、控制器11将新生成的数据发送至固态硬盘44进行保存。
[0084] 可选的,控制器11可以为新生成的数据分配一段逻辑地址,保存所述分配的逻辑地址与第三文件的标识之间的对应关系。将所述新生成的数据以及数据的逻辑地址发送给固态硬盘44。固态硬盘44内部的控制器接收这些新生成的数据后,分配一个或多个擦除块存储所述新生成的数据。处于负载均衡的目的,当需要分配多个擦除块时,固态硬盘44的控制器可以从不同的通道中各自分配一个或多个擦除块。再将这些新生成的数据写入分配的擦除块中。新生成的数据写入擦除块的实际地址为这些数据的物理地址,固态硬盘44保存所述物理地址和接收的逻辑地址之间的对应关系。并且,固态硬盘44还可以将所述物理地址和接收的逻辑地址之间的对应关系发送给控制器11进行存储,以用于下一次文件合并。
[0085] S682、控制器11保存新生成的数据的物理地址与第三文件的标识之间的对应关系。
[0086] 当控制器11接收所述物理地址和接收的逻辑地址之间的对应关系,可以根据所述逻辑地址与第三文件的标识之间的对应关系,建立所述物理地址与所述第三文件的标识之间的对应关系。
[0087] S683、控制器11删除与所述新生成的数据的关键字相同的所有旧版本的数据,及其这些旧版本的数据的物理地址和待合并的文件的标识之间的对应关系。在本实施方式中,步骤S682与步骤S683的执行顺序不分先后。
[0088] 按照图6所示的实施例,在执行文件的合并操作时,对于关键字不同的数据只需要改变这些数据的物理地址与文件标识之间的对应关系,而不需要将这些再次写入固态硬盘,消除了固态硬盘的写放大。
[0089] 在上述实施例中,需要对第一文件和第二文件中的所有数据按照上面描述的方式执行合并操作。然而,本实施例还提供了另一种实施方式,在这种实施方式只对第一文件中的部分数据,以及第二文件中的部分数据按照上面描述的方式执行合并操作。
[0090] 例如,以第一文件为例,所述第一文件位于固态硬盘44的一个或多个擦除块中,控制器11监控每个擦除块所包含的有效数据的数据量,当某一个擦除块所包含的有效数据的数据量高于设定阈值时,将所述擦除块确定为可以按照图6所示的合并方式进行数据合并的擦除块,而对于那些包含的有效数据的数据量不高于所述设定阈值的擦除块,其合并方式与图6所示的合并方式的不同之处在于,即使是关键字不相同的数据,也仍然需要写入第三文件中。具体的,控制器11为重新为这些关键字不相同的数据分配逻辑地址,将分配的逻辑地址以及这些关键字不同的数据发送给固态硬盘44,由固态硬盘控制器将其写入新的擦除块中。这些关键字不相同的数据位于所述新的擦除块的实际地址为它们的物理地址,固态硬盘44保存所述逻辑地址与所述物理地址之间的对应关系,并且将所述对应关系发送给控制器11。同理,第二文件也可以按照这样的方式区分出进行不同合并处理的擦除块。按照这种实施方式,仅仅对包含有效数据较多的擦除块中的数据进行文件重定向的操作,而将包含有效数据较少的擦除块中的数据重新写入新的擦除块,可以减少擦除块的碎片。
[0091] 请参考图7,图7是本实施例提供的文件合并装置,该装置位于控制器11中。具体的,所述文件合并装置包括读取模块701、存储模块702、判断模块703、创建模块704和删除模块705。
[0092] 读取模块701,用于读取固态硬盘44中的第一文件和第二文件,其中,所述第一文件包括第一数据以及所述第一数据的关键字,所述第二文件包括第二数据以及所述第二数据的关键字,所述第一数据存储于所述固态硬盘中的实际地址为所述第一数据的物理地址,所述第二数据存储于所述固态硬盘中的实际地址为所述第二数据的物理地址。示例性的,读取模块701的功能可以由处理器112调用存储器111中的程序指令实现,其实现方式可参见图6所述的S620以及S631,这里不再赘述。
[0093] 存储模块702,用于保存所述第一数据的物理地址与第一文件的标识之间的对应关系,以及所述第二数据的物理地址与第二文件的标识之间的对应关系。示例性的,存储模块702可以是图2所示的存储器111。
[0094] 判断模块703,用于判断所述第一数据的关键字与所述第二数据的关键字是否相同。示例性的,判断模块703的功能可以由处理器112调用存储器111中的程序指令实现,其实现方式可参见图6所述的S640,这里不再赘述。
[0095] 创建模块704,用于当所述第一数据的关键字与所述第二数据的关键字不相同时,创建第三文件,为所述第三文件分配标识;创建所述第一数据的物理地址与所述第三文件的标识之间的对应关系,并且创建所述第二数据的物理地址与所述第三文件的标识之间的对应关系。示例性的,创建模块704的功能可以由处理器112调用存储器111中的程序指令实现,其实现方式可参见图6所述的S650以及S661,这里不再赘述。
[0096] 删除模块705,用于删除所述第一数据的物理地址与所述第一文件的标识之间的对应关系,以及删除所述第二数据的物理地址与所述第二文件的标识之间的对应关系。示例性的,删除模块705的功能可以由处理器112调用存储器111中的程序指令实现,其实现方式可参见图6所述的S662,这里不再赘述。
[0097] 可选的,所述文件合并装置所位于的存储系统,采用日志结构合并树的结构存储数据,所述日志结构合并树包括至少两个层级,其中至少两个层级中的第一层级中的多个文件均是没有经过合并的文件,所述至少两个层级中的第二层级中的文件是由所述第一层级中的多个文件合并而来的文件,第一层级包括所述第一文件和所述第二文件,所述第二层级包括所述第三文件。
[0098] 可选的,所述文件合并装置还可以包含选择模块706,所述选择模块706用于从所述第一文件所位于的所述固态硬盘的一个或多个擦除块中选择第一擦除块,所述第一擦除块存储的有效数据的数据量高于设定阈值,所述第一数据是所述第一擦除块存储的有效数据的一部分或者全部;以及从所述第二文件所位于的所述固态硬盘的一个或多个擦除块中选择第二擦除块,所述第一擦除块存储的有效数据的数据量高于所述设定阈值,所述第二数据是所述第二擦除块存储的有效数据的一部分或者全部。
[0099] 另外,选择模块706还用于监控所述第一层级所包含的文件的数量;确定所述第一层级所包含的文件的数量达到预设阈值时,从所述第一层级所包含的文件中选择所述第一文件和所述第二文件。
[0100] 示例性的,选择模块706的功能可以由处理器112调用存储器111中的程序指令实现,其实现方式可参见图6所述的S600等,这里不再赘述。
[0101] 另外,所述第一层级还包括第四文件,所述读取模块701,还用于读取所述固态硬盘中的第四文件,所述第四文件包括第三数据以及所述第三数据的关键字,所述第三数据存储于所述固态硬盘中的实际地址为所述第三数据的物理地址;存储模块702,还用于保存所述第三数据的物理地址与所述第四文件的标识之间的对应关系;判断模块703,还用于703还用于判断所述第一数据的关键字和所述第三数据的关键字是否相同;当所述第一数据的关键字与所述第三数据的关键字相同时,确定所述第三数据写入所述固态硬盘的时间点是否早于与所述第一数据写入所述固态硬盘的时间点;删除模块705,还用于当所述第三数据写入所述固态硬盘的时间点早于与所述第一数据写入所述固态硬盘的时间点时,删除所述第三数据。
[0102] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统,设备和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0103] 所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
[0104] 另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用硬件加软件功能模块的形式实现。
[0105] 上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。
[0106] 最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的保护范围。