文件存储方法及装置
技术领域
本发明涉及计算机数据存储技术领域,尤其涉及一种文件存储方法及装置。
背景技术
传统的PC系统通常采用目录树文件夹+文件的存储模式来对文件进行存储,其数据存储结构如图1所示。其中,最顶层的文件夹称为根目录,根目录下的文件夹列表称为子目录。每个文件夹都可以保存子文件夹和文件列表,各文件夹、子文件夹和文件列表构成一种递归的数据结构。
在上述树形结构存储模式中,采用key-value数据库来保存数据,即,每个文件夹作为一个key保存,value则作为当前文件夹的子目录列表和文件名。其存储记录关系如图2所示。在图2中,椭圆圈内表示以其左边的folderkey保存一条记录的value。
现有的这种树形结构中,在每次读取目录树时,需要逐层拉取数据。即首先必须拉取根目录,然后再拉取下一层的目录,不能越级拉取目录信息。而且,对于一般的key-value数据库来说,每层文件夹和文件列表的数据不能太大,数据过大则会影响系统性能。
因此,当某个用户的文件夹或者文件增多时,则可能遇到来自底层的数据访问性能瓶颈,尤其是在现有的网络文件系统中,比如QQ相册、网盘,云存储等应用,采用现有的数据存储结构,则会遭遇存储与访问上的性能瓶颈,因为大数据将导致存储和访问上的困难,当数据大到系统支撑的阀值时,则需要采用更为复杂的系统来解决大数据问题;此外,现有的数据存储结构中,数据的分布无法控制,对于key-value数据库,则是依据key来路由,因此,不同的Folderkey需要写到不同的网络存储块,而网络存储块采用固定的规则分配,无法考虑到数据存储的扩容以及特定的需求等问题。
发明内容
本发明的主要目的在于提供一种文件存储方法及装置,旨在提高数据存储稳定性及可扩展性,达到无限制文件夹系统目录树的存储目的。
为了达到上述目的,本发明提出一种文件存储方法,包括以下步骤:
记录父文件夹的元信息,保存在主key中;
当所述父文件夹下包括至少一子文件夹列表和/或文件列表时,将所述父文件夹下的所述至少一子文件夹列表和/或文件列表的内容保存至基于所述主key的副key中。
优选地,所述副key为多个,每个所述副key分别独立保存相应的子文件夹列表和/或文件列表的内容。
优选地,该方法还包括:
在相应的副key中添加、删除或重命名所述父文件夹下的子文件夹列表和/或文件列表。
优选地,所述在相应的副key中添加、删除或重命名所述父文件夹下的子文件夹列表和/或文件列表的步骤之后还包括:
更新所述主key中的元信息。
优选地,所述记录父目录下文件夹的元信息,保存在主key中的步骤之前还包括:
基于所述主key生成所述副key。
优选地,所述主key保存的元信息至少包括:当前最大文件标识、当前数据所在set、文件删除信息和/或文件夹及文件的写入时间。
本发明还提出一种文件存储装置,包括:
主存储模块,用于记录父文件夹的元信息,保存在主key中;
副存储模块,用于当所述父文件夹下包括至少一子文件夹列表和/或文件列表时,将所述父文件夹下的所述至少一子文件夹列表和/或文件列表的内容保存至基于所述主key的副key中。
优选地,所述副key为多个,每个所述副key分别独立保存相应的子文件夹列表和/或文件列表的内容。
优选地,该装置还包括:
处理模块,用于在相应的副key中添加、删除或重命名所述父文件夹下的子文件夹列表和/或文件列表;
更新模块,用于更新所述主key中的元信息。
优选地,该装置还包括:
生成模块,用于基于所述主key生成所述副key。
本发明提出的一种文件存储方法及装置,改变现有的目录树数据的存储模式,采用父文件夹以主key写一条元信息,其文件夹列表和文件列表以多个副key的方式写入数据,从而实现了数据的无限扩展,且在数据累积变大的情况下,可避免来自底层数据存储的瓶颈,达到无限制文件夹系统目录树存储的目的。相比现有技术,本发明将大数据分拆成多个key来保存,使得数据均匀,提高了系统数据库的数据存储稳定性,更利于数据的扩容以及系统业务运营。
附图说明
图1是现有技术中目录树式的数据存储结构示意图;
图2是图1所示的数据存储结构中的存储记录关系示意图;
图3是本发明文件存储方法第一实施例的流程示意图;
图4是本发明中父文件夹的主key保存的元信息结构示意图;
图5是本发明中以主key以及其副key构成的数据存储结构示意图;
图6是本发明文件存储方法第二实施例的流程示意图;
图7是本发明文件存储方法第三实施例的流程示意图;
图8是本发明文件存储装置第一实施例的结构示意图;
图9是本发明文件存储装置第二实施例的结构示意图;
图10是本发明文件存储装置第三实施例的结构示意图。
为了使本发明的技术方案更加清楚、明了,下面将结合附图作进一步详述。
具体实施方式
本发明实施例解决方案主要是:不使用唯一的一个key保存某个文件夹的文件夹列表和文件列表,而是采用以主key保存父文件夹的元信息,以多个副key的形式保存父文件夹下的多个子文件夹列表和文件列表,以实现数据的无限扩展,避免数据累积变大时遭遇来自底层存储的瓶颈。
如图3所示,本发明第一实施例提出一种文件存储方法,包括:
步骤S101,记录父文件夹的元信息,保存在主key中;
步骤S102,当所述父文件夹下包括至少一子文件夹列表和/或文件列表时,将所述父文件夹下的所述至少一子文件夹列表和/或文件列表的内容保存至基于所述主key的副key中。
本实施例针对现有的目录树数据存储结构,将原来的某个父目录的数据(包括文件夹列表和文件列表)采用一个parentkey保存一条数据的方式,改变为以父目录的parentkey作为主key写入一条元信息,该父目录的文件夹列表和文件夹列表则采用多个副key的方式,写入多条数据,达到无限制文件夹系统目录树存储的目的。
上述父目录可以为目录树结构中的根目录。
本实施例设定父目录所在文件夹为父文件夹,父目录下的各文件夹列表和文件列表为子文件夹列表和文件列表,其中,每个父文件夹作为一条主数据,具有独立性,每个父文件夹有一个主key对应,其子文件夹和文件列表保存在基于上述主key的副key中。
所述父文件夹下可以有数据,也可以没有数据,即父文件夹下可以包括至少一子文件夹列表和/或文件列表;也可以为空文件夹,没有文件夹列表和文件列表。当父文件夹为空文件夹时,则仅将父文件夹的元信息写入主key中。
如图4所示,图4为本实施例中父文件夹的主key保存的元信息结构示意图,该元信息包括:Key、Parentkey、FolderNum、MaxFileID、Setid、Delinfo、TimeStamp1以及TimeStamp2,其中:
Key即为父文件夹的主key,该主key为整个文件系统的核心数据结构,用于标识父文件夹的关键字;在整个系统中,主key是唯一的,其所有的副key均与主key关联,而各副key之间又相互独立,因此,整个系统的主key和副key不会重复。
Parentkey为当前父文件夹的上一级的父文件夹的主key;FolderNum表示目前总的子文件夹的数量,用于记录每个父文件夹的子文件夹的个数,这样当子文件夹数量增多时,用于处理子文件夹列表存储的逻辑,如果子文件夹列表多到无法在一档数据中存储时,则可以根据次FolderNum计算其所在副key,即对文件夹列表数据也进行分档,达到无限制存储子文件夹内容的目的。
当增加子文件夹时,FolderNum+1,当删除子文件夹时,FolderNum的值不改变,其作用是根据一定的逻辑,计算子文件夹数据由哪些副key来存储,由此,再根据这些副key拉取子文件夹列表。
MaxFileID用于标识当前的最大的文件id(标识);
Setid表示当前数据所在的set。根据Setid将子文件夹列表和文件的数据写在不同的set。在网络文件系统中,通常由很多机器组成一个集群,这样的一个集群可以称为一个set。在大型的存储架构中,一个set通常是一个管理单元,包括扩容、迁移、上架以及下架等。简单的说,一个set是一组机器(通常为10-30台,或者更多),在这组机器上部署了一个存储系统完成工作所必须的模块,比如,接入模块、逻辑处理模块、数据库模块等。因此,一个set可以独立运营,是一个逻辑完备的存储系统。
DelInfo用于保存删除的文件信息,文件夹删除则不需要记录删除信息;
TimeStamp1,TimeStamp2表示最近所写子文件夹和文件的时间。
上述副key可以设置为多个,每个所述副key分别独立保存相应的子文件夹列表和/或文件列表的内容。该副key基于主key而生成,比如可以采用主key+数字的方式生成副key,当然也可以采用其他方式生成副key。
本实施例以主key以及其副key构成的数据存储结构如图5所示。
其中,主key记录并保存父文件夹的元信息,主key下包含多个副key,用于分别记录父文件夹下各个子文件夹列表和文件列表;每个副key可以保存多个子文件夹列表和/或文件列表。
多个副key可以按照0-N档的顺序依次编号,若文件夹列表太大,则可以从-1档开始存储,此时元信息中所述的Foldernum在拉取文件夹列表时则起着很重要的作用。如前所述,FolderNum表示目前总的子文件夹的数量,当子文件夹数量增多时,用于处理子文件夹列表存储的逻辑,如果子文件夹列表多到无法在一档数据中存储时,则可以根据次FolderNum计算其所在副key;当增加子文件夹时,FolderNum+1,当删除子文件夹时,FolderNum的值不改变,其作用是根据一定的逻辑,计算子文件夹数据由哪些副key来存储,由此,再根据这些副key拉取子文件夹列表。其中,每个档的数据条数一定,在系统初始化时配置,后续不再改变。
由上述数据存储结构可以看出,由于每个父文件夹具有一个主key对应,其子文件夹列表和文件列表通过副key保存,每个文件夹和文件数据存储相对独立,由此,使得文件夹具有递归性,数据存储可以无限扩展,且在数据累积变大的情况下,可避免来自底层数据存储的瓶颈,达到无限制文件夹系统目录树存储的目的。尤其是针对网络文件系统中,比如若将上述数据存储方案应用到QQ空间相册的图片存储,用户创建了很多相册,相册中有很多相片。这里相册对应文件夹,相片则对应文件。采用上述无限制的文件目录存储方案,则可以使存储用户存储上万张图片和多个相册的需求得到了满足。因为相对于用户的数据增长来说,不会遇到数据存储和访问上的瓶颈。此外,本实施例方案还可以应用其他方面,比如网盘,云存储等。
此外,本实施例改进了数据的扩展属性,能够平衡数据的大小,将大数据分拆成多个key来保存,使得数据分布均匀,数据库保存数据的性能更好,进而提高了系统数据服务的稳定性;由于数据存储结构得到扩充,同时引进了setid概念,从而改进了数据的扩容性,更利于系统长期稳定运营。当然,本实施例上述数据存储结构,为数据的读写操作提供了更大的方便。
需要说明的是,作为本实施例的扩展,对于每一个子文件夹之下还可以设置多个子文件夹列表和/或文件列表,并对应设置相应的副key来进行数据保存。
如图6所示,本发明第二实施例提出一种文件存储方法,在上述第一实施例的基础上,在上述步骤S102之后还包括:
步骤S103,在相应的副key中添加、删除或重命名所述父文件夹下的子文件夹列表和/或文件列表。
步骤S104,更新所述主key中的元信息。
本实施例与上述第一实施例的区别在于,本实施例还包括对后续文件夹内容的添加、删除或重命名等操作。
具体地,在后续文件处理过程中,若有需要添加、删除或重命名文件夹或文件,则采用以下操作方式:
对于文件夹的处理
若需要新建一子文件夹,则在父文件夹中相应的副key中保存该子文件夹的内容,同时更新父文件夹主key的元信息;或者根据实际需要,在父文件夹中添加一副key,在该副key中保存该子文件夹的内容,同时更新父文件夹主key的元信息。
若需要删除某一子文件夹keyfolder,则修改父文件夹的相关信息,删除该子文件夹的所有信息,同时更新父文件夹主key的元信息。
若需要重命名某子文件夹,则将原来的子文件夹的所有内容读出,被采用新的子文件夹来写一份数据,以新的子文件夹的副key写入数据,并把原来的子文件夹的副key中保存的数据删除。
对于文件的处理:
若需要添加一个文件,则修改其父文件夹的属性,并且在父文件夹parentkey的副key中写一条数据,并保存文件名;同时更新父文件夹主key的元信息。
若需要删除文件,则直接删除其父文件夹parentkey的副key中的某个数据,并且修改该父文件夹的元信息。
若需要重命名文件,直接修改其父文件夹parentkey的副key中的某个数据,并且修改该父文件夹的元信息。
本实施例不仅实现了数据的无限扩展,在数据累积变大的情况下,可避免来自底层数据存储的瓶颈,达到无限制文件夹系统目录树存储的目的。而且将大数据分拆成多个key来保存,使得数据均匀,对数据的读写操作更加方便,提高了系统数据库的数据存储稳定性,更利于数据的扩容以及系统业务运营。
图7所示,本发明第三实施例提出一种文件存储方法,在上述第一实施例的基础上,在上述步骤S101记录父目录下文件夹的元信息,保存在主key中的步骤之前还包括:
步骤S100,基于所述主key生成所述副key。
本实施例与上述第一实施例的区别在于,本实施例还包括生成副key的过程。具体地,该副key采用主key+数字的方式生成,由此,使得副key与主key相关联,达到无限制文件夹系统目录树存储的目的,提高数据存储的可扩展性。
需要说明的是,上述第二实施例与第三实施例还可以组合实施。
如图8所示,本发明第一实施例提出一种文件存储装置,包括:主存储模块801以及副存储模块802,其中:
主存储模块801,用于记录父文件夹的元信息,保存在主key中;
副存储模块802,用于当所述父文件夹下包括至少一子文件夹列表和/或文件列表时,将所述父文件夹下的所述至少一子文件夹列表和/或文件列表的内容保存至基于所述主key的副key中。
本实施例针对现有的目录树数据存储结构,将原来的某个父目录的数据(包括文件夹列表和文件列表)采用一个parentkey保存一条数据的方式,改变为以父目录的parentkey作为主key写入一条元信息,该父目录的文件夹列表和文件夹列表则采用多个副key的方式,写入多条数据,达到无限制文件夹系统目录树存储的目的。
上述父目录可以为目录树结构中的根目录。
具体地,通过主存储模块801记录父文件夹的元信息并保存在主key中;通过副存储模块802将父文件夹下的子文件夹列表和文件列表的内容保存至基于主key的副key中。
本实施例设定父目录所在文件夹为父文件夹,父目录下的各文件夹列表和文件列表为子文件夹列表和文件列表,其中,每个父文件夹作为一条主数据,具有独立性,每个父文件夹有一个主key对应,其子文件夹和文件列表保存在基于上述主key的副key中。
所述父文件夹下可以有数据,也可以没有数据,即父文件夹下可以包括至少一子文件夹列表和/或文件列表;也可以为空文件夹,没有文件夹列表和文件列表。当父文件夹为空文件夹时,则仅将父文件夹的元信息写入主key中。
如图4所示,图4为本实施例中父文件夹的主key保存的元信息结构示意图,该元信息包括:Key、Parentkey、FolderNum、MaxFileID、Setid、Delinfo、TimeStamp1以及TimeStamp2,其中:
Key即为父文件夹的主key,该主key为整个文件系统的核心数据结构,用于标识父文件夹的关键字;在整个系统中,主key是唯一的,其所有的副key均与主key关联,而各副key之间又相互独立,因此,整个系统的主key和副key不会重复。
Parentkey为当前父文件夹的上一级的父文件夹的主key;FolderNum表示目前总的子文件夹的数量,用于记录每个父文件夹的子文件夹的个数,这样当子文件夹数量增多时,用于处理子文件夹列表存储的逻辑,如果子文件夹列表多到无法在一档数据中存储时,则可以根据次FolderNum计算其所在副key,即对文件夹列表数据也进行分档,达到无限制存储子文件夹内容的目的。
当增加子文件夹时,FolderNum+1,当删除子文件夹时,FolderNum的值不改变,其作用是根据一定的逻辑,计算子文件夹数据由哪些副key来存储,由此,再根据这些副key拉取子文件夹列表。
MaxFileID标识当前的最大的文件id(标识);
Setid表示当前数据所在的set。根据Setid将子文件夹列表和文件的数据写在不同的set。在网络文件系统中,通常由很多机器组成一个集群,这样的一个集群可以称为一个set。在大型的存储架构中,一个set通常是一个管理单元,包括扩容、迁移、上架以及下架等。简单的说,一个set是一组机器(通常为10-30台,或者更多),在这组机器上部署了一个存储系统完成工作所必须的模块,比如,接入模块、逻辑处理模块、数据库模块等。因此,一个set可以独立运营,是一个逻辑完备的存储系统。
DelInfo用于保存删除的文件信息,文件夹删除则不需要记录删除信息;
TimeStamp1,TimeStamp2表示最近所写子文件夹和文件的时间。
上述副key可以设置为多个,每个所述副key分别独立保存相应的子文件夹列表和/或文件列表的内容。该副key基于主key而生成,比如可以采用主key+数字的方式生成副key,当然也可以采用其他方式生成副key。
本实施例以主key以及其副key构成的数据存储结构如图5所示。
其中,主key记录并保存父文件夹的元信息,主key下包含多个副key,用于分别记录父文件夹下各个子文件夹列表和文件列表;每个副key可以保存多个子文件夹列表和/或文件列表。
多个副key可以按照0-N档的顺序依次编号,若文件夹列表太大,则可以从-1档开始存储。此时元信息中所述的Foldernum在拉取文件夹列表时则起着很重要的作用。如前所述,FolderNum表示目前总的子文件夹的数量,当子文件夹数量增多时,用于处理子文件夹列表存储的逻辑,如果子文件夹列表多到无法在一档数据中存储时,则可以根据次FolderNum计算其所在副key;当增加子文件夹时,FolderNum+1,当删除子文件夹时,FolderNum的值不改变,其作用是根据一定的逻辑,计算子文件夹数据由哪些副key来存储,由此,再根据这些副key拉取子文件夹列表。其中,每个档的数据条数一定,在系统初始化时配置,后续不再改变。
由上述数据存储结构可以看出,由于每个父文件夹具有一个主key对应,其子文件夹列表和文件列表通过副key保存,每个文件夹和文件数据存储相对独立,由此,使得文件夹具有递归性,数据存储可以无限扩展,且在数据累积变大的情况下,可避免来自底层数据存储的瓶颈,达到无限制文件夹系统目录树存储的目的。尤其是针对网络文件系统中,比如若将上述数据存储方案应用到QQ空间相册的图片存储,用户创建了很多相册,相册中有很多相片。这里相册对应文件夹,相片则对应文件。采用上述无限制的文件目录存储方案,则可以使存储用户存储上万张图片和多个相册的需求得到了满足。因为相对于用户的数据增长来说,不会遇到数据存储和访问上的瓶颈。此外,本实施例方案还可以应用其他方面,比如网盘,云存储等。
此外,本实施例改进了数据的扩展属性,能够平衡数据的大小,将大数据分拆成多个key来保存,使得数据分布均匀,数据库保存数据的性能更好,进而提高了系统数据服务的稳定性;由于数据存储结构得到扩充,同时引进了setid概念,从而改进了数据的扩容性,更利于系统长期稳定运营。当然,本实施例上述数据存储结构,为数据的读写操作提供了更大的方便。
如图9所示,本发明第二实施例提出一种文件存储装置,在上述第一实施例的基础上,还包括:
处理模块803,用于在相应的副key中添加、删除或重命名所述父文件夹下的子文件夹列表和/或文件列表;
更新模块804,用于更新所述主key中的元信息。
本实施例与上述第一实施例的区别在于,本实施例还包括对后续文件夹内容的添加、删除或重命名等操作。
具体地,在后续文件处理过程中,若有需要添加、删除或重命名文件夹或文件,则采用以下操作方式:
对于文件夹的处理
若需要新建一子文件夹,处理模块803则在父文件夹中相应的副key中保存该子文件夹的内容,同时更新父文件夹主key的元信息;或者根据实际需要,在父文件夹中添加一副key,在该副key中保存该子文件夹的内容,同时通过更新模块804更新父文件夹主key的元信息。
若需要删除某一子文件夹keyfolder,处理模块803则修改父文件夹的相关信息,删除该子文件夹的所有信息,同时通过更新模块804更新父文件夹主key的元信息。
若需要重命名某子文件夹,处理模块803则将原来的子文件夹的所有内容读出,被采用新的子文件夹来写一份数据,以新的子文件夹的副key写入数据,并把原来的子文件夹的副key中保存的数据删除。同时通过更新模块804更新父文件夹主key的元信息。
对于文件的处理:
若需要添加一个文件,处理模块803则修改其父文件夹的属性,并且在父文件夹parentkey的副key中写一条数据,并保存文件名;同时通过更新模块804更新父文件夹主key的元信息。
若需要删除文件,处理模块803则直接删除其父文件夹parentkey的副key中的某个数据,并通过更新模块804修改该父文件夹的元信息。
若需要重命名文件,则处理模块803直接修改其父文件夹parentkey的副key中的某个数据,并通过更新模块804修改该父文件夹的元信息。
本实施例不仅实现了数据的无限扩展,在数据累积变大的情况下,可避免来自底层数据存储的瓶颈,达到无限制文件夹系统目录树存储的目的。而且将大数据分拆成多个key来保存,使得数据均匀,对数据的读写操作更加方便,提高了系统数据库的数据存储稳定性,更利于数据的扩容以及系统业务运营。
如图10所示,本发明第三实施例提出一种文件存储装置,在上述第一实施例的基础上,还包括:
生成模块800,用于基于所述主key生成所述副key。
本实施例与上述第一实施例的区别在于,本实施例还包括生成副key的过程。具体地,生成模块800采用主key+数字的方式生成该副key,由此,使得副key与主key相关联,达到无限制文件夹系统目录树存储的目的,提高数据存储的可扩展性。
需要说明的是,上述第二实施例与第三实施例还可以组合实施。
本实施例文件存储方法及装置,改变现有的目录树数据的存储模式,采用父文件夹以主key写一条元信息,其文件夹列表和文件列表以多个副key的方式写入数据,从而实现了数据的无限扩展,且在数据累积变大的情况下,可避免来自底层数据存储的瓶颈,达到无限制文件夹系统目录树存储的目的。相比现有技术,本发明将大数据分拆成多个key来保存,使得数据均匀,提高了系统数据库的数据存储稳定性,更利于数据的扩容以及系统业务运营。
以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。