CN102298641B - 一种基于键值库的文件与结构化数据统一存储方法 - Google Patents

一种基于键值库的文件与结构化数据统一存储方法 Download PDF

Info

Publication number
CN102298641B
CN102298641B CN 201110272333 CN201110272333A CN102298641B CN 102298641 B CN102298641 B CN 102298641B CN 201110272333 CN201110272333 CN 201110272333 CN 201110272333 A CN201110272333 A CN 201110272333A CN 102298641 B CN102298641 B CN 102298641B
Authority
CN
China
Prior art keywords
row
data block
file
data
location identifier
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN 201110272333
Other languages
English (en)
Other versions
CN102298641A (zh
Inventor
王建民
朱妤晴
李旭嘉
杨义繁
丁贵广
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Original Assignee
Tsinghua University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University filed Critical Tsinghua University
Priority to CN 201110272333 priority Critical patent/CN102298641B/zh
Publication of CN102298641A publication Critical patent/CN102298641A/zh
Application granted granted Critical
Publication of CN102298641B publication Critical patent/CN102298641B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种基于键值库的文件与结构化数据统一存储方法,属于计算机数据管理技术领域。本方法通过将文件切分成多个数据块,在键值库符合特定模式的表格中存储文件及文件夹元数据和文件数据块,支持对文件及结构化数据进行统一存储,并支持使用可统一标识文件和结构化数据资源的存储标识符创建、删除、访问文件及结构化数据,通过对存储标识符及用户请求的访问模式进行判断,自动向用户提供对文件及结构化数据的字节数组、流、本地路径等三种上传下载方式。本方法由于基于键值库,保持了键值库提供的高可扩展性、高可伸缩性等海量存储合优越特性,且在形成的用户访问接口及管理模式方面具有简单易用、高可扩充、上传下载速度性能高等优点。

Description

一种基于键值库的文件与结构化数据统一存储方法
技术领域
本发明涉及一种基于键值库的文件与结构化数据统一存储方法,属于计算机数据管理技术领域。
背景技术
键值库是针对关系数据库而产生的一种新型数据管理系统。关系数据库早在多年前就已经成为网站不可或缺的后台数据持久化系统。然而,随着Web 2.0的产生,搭建网站变得简易,许多企业实体都搭建起了网站。然而,与Web 2.0伴随而来的是更多的用户交互,以及更多的UGC(User Generated Content,用户生成内容),这使得网站需要处理的请求和数据倍增。键值库主要是针对关系数据库要解决其可扩展性、弹性和容错性这些方面的问题,同时要保证的易于部署和管理。网站服务容量的非平稳决定了后台存储系统必须具备可扩展性和弹性的特点。可扩展性指的是,系统可以在更高的服务容量需求下,进行横向扩容,且扩容的方面既包括存储能力,也包括计算能力,总的评价就是服务能力。弹性指的是,系统既可以进行扩容,也可以在低服务容量需求下进行缩容,且这种扩容、缩容的变化需在系统运行过程中实现。容错性是由系统所部署的条件所决定的,由于这些系统一般要求部署在由网络联接的低端PC机上,PC机极容易失效宕机,网络也会出现分割的情况,因此,要求系统具有容错性,能处理节点失效和网络分割的情况。网络应用的一个重要需求就是保证系统随时可用,容错性是系统可用的重要保证。除键值库外,可同样提供高可扩展性、弹性和容错性的存储系统还有云文件系统,如谷歌文件系统GFS及其开源项目Hadoop。
键值库和云文件系统分别支持不同的数据类型,前者支持小数据量的列数据单元,而后者则支持大数据量的文件数据单元。然而,现实中对于数据的管理,尤其是非结构化数据的管理,不仅需要存储海量结构化小单元的元数据,也需要存储海量大单元的非结构化源数据。目前对于结构化和非结构化数据的存储仅能通过使用两套甚至更多的存储系统的实现,从而使用得构造出来的系统非常复杂。为简化数据存储的使用,需要对结构化小单元数据与非结构化大单元数据进行统一存取,然而这样的系统技术并不存在。擅长于存储大单元数据的云文件系统在存储小单元数据时存取性能较低,更无法灵活支持小单元数据的各种访问操作,存储小单元数据的键值库则无法直接存储大单元数据,且当单元数据较大时容易性能下降。
键值库的各种数据模式中以谷歌宽表(BigTable)和卡珊多拉(Cassandra)的数据模式最为著名。此模式采用了表格、列簇、列这三级的标识来实现存储。表格和列簇类似于关系数据库中模式的表和列,一经定义不可改动,尽管列簇的实质与关系表的列有大的差别。列簇并不存储原子的属性和值,列簇中的列名及列值(键值对)才是原子的。列簇下可以存储任意多的键值对。行由类似于主键作用的行键来唯一标识,同一表内的行键是唯一的。
发明内容
本发明的目的是提出一种基于键值库的文件及结构化数据统一存储方法,以数据块的方式支持对大小不一的文件及结构化数据进行存储,并提供统一对文件及结构化数据进行高效访问的存储接口,满足用户存储海量数据时的多样化需求。
本发明提出的基于键值库的文件及结构化数据统一存储方法,包括以下步骤:
(1)用户初始化键值库,键值库中具有表格、列簇和列三种单元的结构化存储模式,其中,表格包含多个列簇,每个列簇包含一个或多个列,数据按行存入表格中,每行数据在同一表格中用行键识别,数据存储在列中,一行列数据存储在一个或多个列簇中;
(2)建成对文件与结构化数据统一进行高效访问的存储接口模块,在键值库中为文件建立元数据表格,在元数据表格中存储文件的属性数据,所述的元数据表格包含元数据和内容数据两个列簇,分别用以表示文件或文件所在的文件夹的属性数据和文件的内容数据;
(3)存储接口模块通过将文件拆分成多个数据块存储在键值库中,使用一行元数据和多行内容数据存储一个文件,存储形式如下:文件在所在文件系统中的路径所形成的行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件的属性数据,该属性数据包括一列文件名、一列文件所在的父文件夹路径和一列文件内容数据的第一个数据块的行键;文件内容数据被切分成数据块后存储在内容数据列簇中,每个数据块为一行,数据块的行键为即时生成的通用唯一识别码(UUID),所述的内容数据列簇包括一列下一个数据块的行键、一列本数据块的内容,若该数据块为最后一个数据块,则将下一个数据块行键列的内容记为“文件结尾”;
(4)存储接口模块用一行元数据存储一个文件夹,存储形式如下:文件夹在所在文件系统中的路径形成行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件夹的属性数据,该属性数据包括一列文件夹的名称和一列文件夹所在的父文件夹路径,若该文件夹存在子文件,则属性数据还包括子文件路径,若该文件夹存在子文件夹,则属性数据还包括子文件夹路径;
(5)当存储接口模块接到用户的构造命令及相应构造参数时,存储接口模块返回用户所访问资源的存储标识符,该存储标识符标识文件夹、文件、表格、行、列簇和列6种资源,若用户访问的是文件夹或文件,则构造参数为路径,若用户访问的是表格,则构造参数为表格名称或表格名称与一个或多个列簇名称,若用户访问的是行,则构造参数为表格名称和行键,若用户访问的是列簇,则构造参数为表格名称、行键和列簇名称,若用户访问的是列,则构造参数为表格名称、行键、列簇名称和列名称;
(6)当存储接口模块接到用户的创建命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(6-1)若为文件、行、列簇或列中的任何一种资源,则向用户返回“不支持此资源”信息;
(6-2)若为表格资源,则存储接口模块对键值库进行检查,若键值库中已存在同名的表格,则向用户返回“已存在同名表格”信息,若键值库中不存在同名的表格,则在键值库中创建含指定表格名称的表格,并向用户返回“创建成功”信息;
(6-3)若为文件夹资源,则存储接口模块对指定路径进行判断,若指定路径下已存储同名的文件或文件夹,则向用户返回“已经存在同名资源”信息,若指定路径下未存储同名的文件或文件夹,则对父文件夹进行判断,若不存在父文件夹,则重复步骤(6-3),创建父文件夹,使得父文件夹存在,若存在父文件夹,则在父文件夹所在行的元数据列簇下插入一个列,列的名称为指定路径名称,并添加特殊前缀,列的数据为指定路径,同时创建本文件夹路径的所在行,行的数据分布在元数据列簇下,在该行元数据列簇下增加两列,其中一列记录本文件夹名称,另一列记录父文件夹路径,向返回用户“成功”信息;若创建父文件夹过程中出现“已存在同名资源”信息,则向用户返回“失败”信息;
(7)当存储接口模块接到用户的删除命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(7-1)当存储标识符标识的是表格资源时,存储接口模块对表格资源进行判断:
(7-1-1)若键值库中存在与该表格资源相对应的表格,则从键值库中删除与该表格资源相对应的表格,并向用户返回“成功”信息;
(7-1-2)若键值库中不存在与该表格资源相对应的表格,则向用户返回“成功”信息;
(7-2)当存储标识符标识的是列资源时,存储接口模块对列资源进行判断:
(7-2-1)若键值库中存在与该列资源相对应的列,则从键值库中删除与该列资源相对应的列,并向用户返回“成功”信息;
(7-2-2)若键值库中不存在与该列资源相对应的列,则向用户返回“成功”信息;
(7-3)当存储标识符标识的是列簇资源时,存储接口模块对列簇资源进行判断:
(7-3-1)若键值库中存在与该列簇资源相对应的列簇,则从键值库中删除与该列簇资源相对应的列簇,并向用户返回“成功”信息;
(7-3-2)若键值库中不存在与该列簇资源相对应的列簇,则向用户返回“成功”信息;
(7-4)当存储标识符标识的是行资源时,存储接口模块对行资源进行判断:
(7-4-1)若键值库存在与该行资源相对应的行时,存储接口模块对行中存储了数据的各列簇使用步骤(7-3)逐一进行删除,并向用户返回“成功”信息;
(7-4-2)若键值库不存在与该行资源相对应的行时,则向用户返回“成功”信息;
(7-5)当存储标识符标识的是文件资源时,存储接口模块从键值库中的该文件的父文件夹所在元数据行中删除记录该文件路径的列,同时从该文件所在元数据行中获取该文件的首个数据块所在行键,将首个数据块作为当前数据块,从当前数据块所在行中读出下一数据块的行键后,删除当前数据块,再将下一数据块置为当前数据块,重复上述读取和删除的操作,直到读出下一数据块行键为“文件结尾”的数据块,将下一数据块的行键为“文件结尾”的数据块置为当前数据块后,删除当前数据块,同时删除该文件的元数据行,并向用户返回“成功”信息;
(7-6)当存储标识符标识的是文件夹资源时,存储接口模块先从键值库中的该文件夹的父文件夹所在元数据行中删除记录该文件夹路径的列,从该文件夹所在元数据行中获取存储各子文件或子文件夹的路径,并重复步骤(7-5)或(7-6),删除各子文件或子文件夹,直到该文件夹不存在子文件或子文件夹,当该文件夹不存在子文件或子文件夹时,删除该文件夹所在的元数据行,并向用户返回“成功”信息;
(8)当存储接口模块接到用户的字节上传命令及相应的存储标识符、字节数据、追加选项时,存储接口模块对存储标识符进行识别:
(8-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;
(8-2)若存储标识符标识的是列,对追加选项进行识别:
(8-2-1)当追加选项为假时,存储接口模块对与存储标识符标识的列相关的表格和列簇进行判断,若与存储标识符标识的列相关的表格或列簇存在,则在键值库中将字节数据存储到存储标识符标识的列,并向用户返回“成功”信息,若与存储标识符标识的列相关的表格或列簇不存在,则向用户返回“失败”信息,
(8-2-2)当追加选项为真时,存储接口模块对存储标识符标识的列进行判断,若存储标识符标识的列存在,则从键值库中读取存储标识符标识的列的数据,并将字节数据追加到存储标识符标识的列的数据,存入存储标识符标识的列中,若存储标识符标识的列不存在,则向用户返回“失败”信息;
(8-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:
(8-3-1)若键值库中不存在存储标识符标识的文件,则对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得键值库中存在该文件的文件夹,则进行步骤(8-3-1-1);若键值库中存在该文件的父文件夹,则进行步骤(8-3-1-1);
(8-3-1-1)在该文件的父文件夹的元数据行中增加一列记录该文件的路径,创建该文件的元数据行,确定该文件内容的第一个数据块的行键,使用第一个数据块的行键创建内容数据行,再将字节数据写入第一个内容数据行的数据列,最后置下一数据块行键列为“文件结尾”,并向用户返回“成功”信息;
(8-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;
(8-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:
(8-3-3-1)若追加选项为假,则读取该文件的元数据行,获得文件内容第一个数据块的行键,并将字节数据写入第一个数据块的行键所指示的内容数据行的数据列中,读取第一数据块内容数据行,获得下一数据块的行键,并将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块的下一数据块行键的列,获得下一数据块的行键,并删除该当前数据块的内容数据行,置下一数据块为当前数据块,重复上述读取删除操作,直到当前数据块的下一数据块行键列的值为“文件结尾”,删除当前数据块的内容数据行,向用户返回“成功”信息;
(8-3-3-2)若追加选项为真,则读取该文件元数据行,获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键,重复“置数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键”的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,读出当前数据块的内容数据,并将字节数据追加到当前数据块的内容数据后,得到新的当前数据块内容数据,进行步骤(8-3-3-2-1);
(8-3-3-2-1)根据用户设定的数据块大小域值判断当前数据块内容数据大小,若当前数据块内容数据大小超过数据块大小域值,则将当前数据块拆分出一块等于数据块大小域值的数据块和最后一块剩余内容数据块,将当前数据块设为大小等于数据块大小域值的数据块后,将当前数据块内容数据写入当前数据块的内容数据行的数据中,构建下一数据块的行键,并在当前数据块的内容数据行中写入下一数据块的行键,并将最后一块剩余内容数据块设为当前数据块,重复步骤(8-3-3-2-1),直到最后一块剩余内容数据块不超过数据块大小域值,并将最后一块内容数据块写入该数据块行键指定的内容数据行的数据列中,并置下一数据块行键列内容为“文件结尾”,向用户返回“成功”信息;
(9)当存储接口模块接到用户的本地路径上传命令及相应的存储标识符、本地文件或本地文件夹路径时,存储接口模块对存储标识符进行识别:
(9-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;
(9-2)若存储标识符标识的是文件且本地路径是文件夹,则向用户返回“错误”信息;
(9-3)若存储标识符标识的是文件夹且本地路径是文件,则向用户返回“错误”信息;
(9-4)若存储标识符标识的是文件且本地路径是文件,则存储接口模块使用步骤(6-3)创建该文件的父文件夹,若步骤(6-3)返回“失败”信息,则向用户返回“失败”信息,若步骤(6-3)返回“已经存在同名资源”或“成功”信息,则在该文件所在父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,置第一个数据块为当前数据块,并置当前文件读取位置为0,从本地路径所指示的文件内容的当前文件读取位置向后读取数据,使读取的数据大小等于数据块大小域值,形成第一个数据块,将该第一个数据块内容写入当前数据块行键所指示的内容数据行的数据列中,同时存储接口模块确定下一个数据块的行键,并将下一个数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,置下一个数据块为当前数据块,将当前文件读取位置加上数据块大小域值,重复上述读取数据块、写入数据块、确定行键、置当前数据块的操作,直至读到本地文件内容的最后一个数据块,将最后一个数据块内容写入该数据块内容数据行的数据列后,在该数据块内容数据行的下一数据块行键列中写入“文件结尾”,向用户返回“成功”信息;
(9-5)若存储标识符标识的是文件夹且本地路径是文件夹,使用步骤(6-3)创建该文件夹,若步骤(6-3)返回“已经存在同名资源”或“失败”信息,则向用户返回“已经存在同名资源”或“失败”信息,若步骤(6-3)返回“成功”信息,则读取本地路径所指示文件夹的一个子文件或子文件夹i(i=1,2,..,n),并使用步骤(9-3)或(9-4)对子文件或子文件夹i进行上传后,在存储标识符标识的文件夹的元数据行中添加“子文件路径”或“子文件夹路径”列以及内容为子文件或子文件夹i的元数据行行键的列数据,重复上述上传子文件或子文件夹的步骤,直到将n个子文件或子文件夹上传完成后,向用户返回“成功”信息,当重复过程中出现子文件或子文件夹上传失败,则向用户返回“失败”信息;
(10)当存储接口模块接到用户的流上传命令及相应的存储标识符、追加选项时,存储接口模块初始化一个大小等于用户设定的数据块大小域值的本地内存缓存区,并将本地内存缓存区内容置为空,对存储标识符进行识别:
(10-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;
(10-2)若存储标识符标识的是列,则对追加选项进行判断:
(10-2-1)若追加选项为假,则存储接口模块对存储标识符中标识的列所在的表格和列簇进行判断,若存储标识符标识的列所在的表格和列簇不存在,则向用户返回“失败”信息,若存储标识符标识的列所在的表格和列簇存在,则将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;
(10-2-2)若追加选项为真,则存储接口模块对存储标识符中标识的列进行判断,若存储标识符标识的列不存在,则向用户返回“失败”信息,若存储标识符标识的列存在,则将存储标识符标识的键值库中的列数据读到本地内存缓存区中,将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;
(10-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:
(10-3-1)若键值库中不存在存储标识符标识的文件,则存储接口模块对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得该文件的父文件夹存在,该文件的父文件夹存在后,在该文件的父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,使用第一个数据块的行键创建内容数据行,将该内容数据行的下一数据块行键列置为“文件结尾”,并打开一个输出流,向用户返回该输出流操作对象;
(10-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;
(10-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:
(10-3-3-1)若追加选项为假,则存储接口模块读取该文件元数据行,获得文件内容第一个数据块的行键,读取第一数据块的行键所指示的内容数据行,以获得下一数据块的行键,将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块内容数据行,以获得下一数据块的行键,删除当前数据块的内容数据行后置下一数据块为当前数据块,重复上述置当前数据块、获取下一数据块行键、删除当前数据行的操作直到获取当前数据块的下一数据块行键列数据为“文件结尾”,删除当前数据块的内容数据行,打开一个输出流,向用户返回该输出流操作对象;
(10-3-3-2)若追加选项为真,则存储接口模块读取该文件元数据行,以获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,读取该当前数据块的行键所指示的内容数据行,以获得下一数据块的行键,重复读取下一数据块行键列查找下一数据块内容数据行的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,将当前数据块内容数据读到本地内存缓存区中,打开一个输出流,向用户返回该输出流操作对象;
(10-4)用户使用上述输出流操作对象,以字节或字节数组的方式向本地内存缓存区写入数据,同时存储接口模块启动一个计时器,若计时器计时超过用户设定的未写超时时间或用户关闭了该输出流操作对象,则存储接口模块关闭计时器,关闭输出流,存储接口模块根据存储标识符进行识别,根据识别结果分别进行步骤(10-4-1)或(10-4-2),若计时器计时在用户设定的未写超时时间内,且用户写入的数据将本地内存缓存区填满时,存储接口模块对存储标识符进行识别:
(10-4-1)若存储标识符标识的是列,则存储接口模块从键值库中读取存储标识符标识的列的数据,将本地内存缓存区数据追加到原列数据,形成新的列数据,将该新的列数据写入存储标识符标识的列中,置本地内存缓存区数据为空,重复步骤(10-4);
(10-4-2)若存储标识符标识的是文件,则存储接口模块将本地内存缓存区数据写入当前数据块的内容数据行的数据列中,确定下一数据块的行键,将下一数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,将下一数据块置为当前数据块,创建当前数据块行键所指示的内容数据行,将当前数据块的内容数据行的下一数据块行键列置为“文件结尾”,将本地内存缓存区数据置为空,重复步骤(10-4),
(11)当存储接口模块接到用户字节下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别,若存储标识符标识的是文件、文件夹、表格、行或列簇,则向用户返回“不支持”信息;若存储标识符标识的是列,则存储接口模块对键值库进行查询,若键值库中不存在存储标识符标识的列,则向用户返回一个空字节数组;若键值库中存在存储标识符标识的列,则从键值库中读取存储标识符标识的列数据,并将该列数据存入字节数组中,向用户返回该字节数组;
(12)当存储接口模块接到用户本地路径下载命令及相应的存储标识符、本地路径时,存储接口模块对存储标识符进行识别:
(12-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;
(12-2)若存储标识符标识的是文件或文件夹,则存储接口模块对存储标识符和本地路径进行识别:
(12-2-1)若存储标识符标识的是文件,且本地路径指示的是已经存在的文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;
(12-2-2)若存储标识符标识的是文件,且本地路径指示的文件不存在,则根据本地路径创建本地文件,存储接口模块从键值库中读出存储标识符标识的文件元数据行中的第一个数据块的行键,将第一个数据块设为当前数据块,通过当前数据块的行键读取当前数据块的内容数据,并将当前数据块的内容数据追加到本地文件内容中,再读取当前数据块的内容数据行,获得下一个数据块的行键,再将下一个数据块置为当前数据块,重复上述读取数据块内容、追加本地文件内容、读取下一数据块行键、设置当前数据块的操作直到当前数据块的下一数据块行键列数据为“文件结尾”时,向用户返回“成功”信息;
(12-2-3)若存储标识符标识的是文件夹,且本地路径指示的是已经存在的文件,或存储标识符标识的是文件夹,且本地路径加标识符标识的文件夹名称形成的新路径指示的是已存在的本地文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;
(12-2-4)若存储标识符标识的是文件夹,且不存在本地路径指示的文件或文件夹,则存储接口模块在本地创建本地路径指示的文件夹,并在本地路径指示的文件夹下创建以标识符标识的文件夹名称命名的文件夹,存储接口模块从键值库中读取存储标识符标识的文件夹元数据行的“子文件路径i”或“子文件夹路径i”(i=1,2,..,n)各列数据,并重复步骤(12-2),下载该文件夹的所有子文件和子文件夹,并向用户返回“成功”信息;
(13)当存储接口模块接到流下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(13-1)若存储标识符标识的是表格,则存储接口模块向用户返回“不支持”信息;
(13-2)若存储标识符标识的是列,则存储接口模块对存储标识符标识的列进行判断,若键值库中不存在存储标识符标识的列,则向用户返回“列不存在”信息,若键值库中存在存储标识符标识的列,则从键值库中将存储标识符标识的列数据下载到本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;
(13-3)若存储标识符标识的是文件,存储接口模块对存储标识符标识的文件进行判断,若键值库中不存在存储标识符标识的文件,则向用户返回“文件不存在”信息,若键值库中存在存储标识符标识的文件,则存储接口模块从键值库中读取该文件元数据行,以获得第一个数据块的内容数据行的行键,将第一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;
(13-4)若存储标识符标识的是文件夹,存储接口模块对存储标识符标识的文件夹进行判断,若键值库中不存在存储标识符标识的文件夹,则向用户返回“文件夹不存在”信息,若键值库中存在存储标识符标识的文件夹,则存储接口模块从键值库中读取该文件夹元数据行的“子文件路径i”或子文件夹路径i”(i=1,2,..,n)各列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;
(13-5)若存储标识符标识的是列簇,存储接口模块对存储标识符标识的列簇进行判断,若键值库中不存在存储标识符标识的列簇,则向用户返回“列簇不存在”信息,若键值库中存在存储标识符标识的列簇,则存储接口模块从键值库中读取列簇的所有列及列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;
(13-6)若存储标识符标识的是行,存储接口模块对存储标识符标识的行进行判断,若键值库中不存在存储标识符标识的行,则向用户返回“行不存在”信息,若键值库中存在存储标识符标识的行,则存储接口模块从键值中读取表格定义的列簇列表,并存入本地内存的缓存区中,依次对上述列簇列表中的每一列簇,重复步骤(13-5),但在用户使用输入流操作对象时不向用户返回“读取完毕”信息,直到遍历列簇列表中的所有列簇,向用户返回“读取完毕”信息;
(13-7)用户使用输入流操作对象进行读取时,输入流操作对象对存储标识符进行识别:
(13-7-1)若存储标识符标识的是列,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,则向用户返回“读取完毕”信息;
(13-7-2)若存储标识符标识的是文件,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,读取当前数据块的内容数据行,以获得下一个数据块的行键,将下一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,重复上述步骤,直到读取当前数据块的内容数据行的下一数据块行键列为“文件结尾”时,向用户返回“读取完毕”信息;
(13-7-3)若存储标识符标识的是文件夹,则输入流操作对象从本地内存缓存区中读取下一子文件或子文件夹路径,并向用户返回下一子文件或子文件夹路径,当所有子文件或子文件夹路径已经读取完成时,向用户返回“读取完毕”信息;
(13-7-4)若存储标识符标识的是列簇,则输入流操作对象从本地内存缓存区中读取下一列,并向用户返回下一列的名称及数据,当所有列已经读取完成时,向用户返回“读取完毕”信息。
本方法提出的一种基于键值库的文件与结构化数据统一存储方法,支持基于键值库对文件及结构化数据进行统一存储,支持使用统一的存储标识符创建、删除、访问文件及结构化数据,并提供了字节数组、输入/输出流、本地路径等三种方式统一支持文件及结构化数据的上传下载。本方法由于基于键值库,保持了键值库提供的高可扩展性、高可伸缩性等海量存储特性,且在形成的用户访问接口及管理模式方面具有简单易用、高可扩充、上传下载速度性能高等优点。
附图说明
图1是本发明方法的流程示意图。
图2是本发明方法的元数据表格模式图。
具体实施方式
本发明提出的基于键值库的文件及结构化数据统一存储方法,其流程示意图如图1所示,包括以下步骤:
(1)用户初始化键值库,键值库中具有表格、列簇和列三种单元的结构化存储模式,其中,表格包含多个列簇,每个列簇包含一个或多个列,数据按行存入表格中,每行数据在同一表格中用行键识别,数据存储在列中,一行列数据存储在一个或多个列簇中;
(2)建成对文件与结构化数据统一进行高效访问的存储接口模块,在键值库中为文件建立元数据表格,在元数据表格中存储文件的属性数据(元数据表格模式如图2所示),所述的元数据表格包含元数据和内容数据两个列簇,分别用以表示文件或文件所在的文件夹的属性数据和文件的内容数据;
(3)存储接口模块通过将文件拆分成多个数据块存储在键值库中,使用一行元数据和多行内容数据存储一个文件,存储形式如下:文件在所在文件系统中的路径所形成的行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件的属性数据,该属性数据包括一列文件名、一列文件所在的父文件夹路径和一列文件内容数据的第一个数据块的行键;文件内容数据被切分成数据块后存储在内容数据列簇中,每个数据块为一行,数据块的行键为即时生成的通用唯一识别码(UUID),所述的内容数据列簇包括一列下一个数据块的行键、一列本数据块的内容,若该数据块为最后一个数据块,则将下一个数据块行键列的内容记为“文件结尾”;
(4)存储接口模块用一行元数据存储一个文件夹,存储形式如下:文件夹在所在文件系统中的路径形成行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件夹的属性数据,该属性数据包括一列文件夹的名称和一列文件夹所在的父文件夹路径,若该文件夹存在子文件,则属性数据还包括子文件路径,若该文件夹存在子文件夹,则属性数据还包括子文件夹路径;
(5)当存储接口模块接到用户的构造命令及相应构造参数时,存储接口模块返回用户所访问资源的存储标识符,该存储标识符标识文件夹、文件、表格、行、列簇和列6种资源,若用户访问的是文件夹或文件,则构造参数为路径,若用户访问的是表格,则构造参数为表格名称或表格名称与一个或多个列簇名称,若用户访问的是行,则构造参数为表格名称和行键,若用户访问的是列簇,则构造参数为表格名称、行键和列簇名称,若用户访问的是列,则构造参数为表格名称、行键、列簇名称和列名称;
(6)当存储接口模块接到用户的创建命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(6-1)若为文件、行、列簇或列中的任何一种资源,则向用户返回“不支持此资源”信息;
(6-2)若为表格资源,则存储接口模块对键值库进行检查,若键值库中已存在同名的表格,则向用户返回“已存在同名表格”信息,若键值库中不存在同名的表格,则在键值库中创建含指定表格名称的表格,并向用户返回“创建成功”信息;
(6-3)若为文件夹资源,则存储接口模块对指定路径进行判断,若指定路径下已存储同名的文件或文件夹,则向用户返回“已经存在同名资源”信息,若指定路径下未存储同名的文件或文件夹,则对父文件夹进行判断,若不存在父文件夹,则重复步骤(6-3),创建父文件夹,使得父文件夹存在,若存在父文件夹,则在父文件夹所在行的元数据列簇下插入一个列,列的名称为指定路径名称,并添加特殊前缀,列的数据为指定路径,同时创建本文件夹路径的所在行,行的数据分布在元数据列簇下,在该行元数据列簇下增加两列,其中一列记录本文件夹名称,另一列记录父文件夹路径,向返回用户“成功”信息;若创建父文件夹过程中出现“已存在同名资源”信息,则向用户返回“失败”信息;
(7)当存储接口模块接到用户的删除命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(7-1)当存储标识符标识的是表格资源时,存储接口模块对表格资源进行判断:
(7-1-1)若键值库中存在与该表格资源相对应的表格,则从键值库中删除与该表格资源相对应的表格,并向用户返回“成功”信息;
(7-1-2)若键值库中不存在与该表格资源相对应的表格,则向用户返回“成功”信息;
(7-2)当存储标识符标识的是列资源时,存储接口模块对列资源进行判断:
(7-2-1)若键值库中存在与该列资源相对应的列,则从键值库中删除与该列资源相对应的列,并向用户返回“成功”信息;
(7-2-2)若键值库中不存在与该列资源相对应的列,则向用户返回“成功”信息;
(7-3)当存储标识符标识的是列簇资源时,存储接口模块对列簇资源进行判断:
(7-3-1)若键值库中存在与该列簇资源相对应的列簇,则从键值库中删除与该列簇资源相对应的列簇,并向用户返回“成功”信息;
(7-3-2)若键值库中不存在与该列簇资源相对应的列簇,则向用户返回“成功”信息;
(7-4)当存储标识符标识的是行资源时,存储接口模块对行资源进行判断:
(7-4-1)若键值库存在与该行资源相对应的行时,存储接口模块对行中存储了数据的各列簇使用步骤(7-3)逐一进行删除,并向用户返回“成功”信息;
(7-4-2)若键值库不存在与该行资源相对应的行时,则向用户返回“成功”信息;
(7-5)当存储标识符标识的是文件资源时,存储接口模块从键值库中的该文件的父文件夹所在元数据行中删除记录该文件路径的列,同时从该文件所在元数据行中获取该文件的首个数据块所在行键,将首个数据块作为当前数据块,从当前数据块所在行中读出下一数据块的行键后,删除当前数据块,再将下一数据块置为当前数据块,重复上述读取和删除的操作,直到读出下一数据块行键为“文件结尾”的数据块,将下一数据块的行键为“文件结尾”的数据块置为当前数据块后,删除当前数据块,同时删除该文件的元数据行,并向用户返回“成功”信息;
(7-6)当存储标识符标识的是文件夹资源时,存储接口模块先从键值库中的该文件夹的父文件夹所在元数据行中删除记录该文件夹路径的列,从该文件夹所在元数据行中获取存储各子文件或子文件夹的路径,并重复步骤(7-5)或(7-6),删除各子文件或子文件夹,直到该文件夹不存在子文件或子文件夹,当该文件夹不存在子文件或子文件夹时,删除该文件夹所在的元数据行,并向用户返回“成功”信息;
(8)当存储接口模块接到用户的字节上传命令及相应的存储标识符、字节数据、追加选项时,存储接口模块对存储标识符进行识别:
(8-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;
(8-2)若存储标识符标识的是列,对追加选项进行识别:
(8-2-1)当追加选项为假时,存储接口模块对与存储标识符标识的列相关的表格和列簇进行判断,若与存储标识符标识的列相关的表格或列簇存在,则在键值库中将字节数据存储到存储标识符标识的列,并向用户返回“成功”信息,若与存储标识符标识的列相关的表格或列簇不存在,则向用户返回“失败”信息,
(8-2-2)当追加选项为真时,存储接口模块对存储标识符标识的列进行判断,若存储标识符标识的列存在,则从键值库中读取存储标识符标识的列的数据,并将字节数据追加到存储标识符标识的列的数据,存入存储标识符标识的列中,若存储标识符标识的列不存在,则向用户返回“失败”信息;
(8-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:
(8-3-1)若键值库中不存在存储标识符标识的文件,则对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得键值库中存在该文件的文件夹,则进行步骤(8-3-1-1);若键值库中存在该文件的父文件夹,则进行步骤(8-3-1-1);
(8-3-1-1)在该文件的父文件夹的元数据行中增加一列记录该文件的路径,创建该文件的元数据行,确定该文件内容的第一个数据块的行键,使用第一个数据块的行键创建内容数据行,再将字节数据写入第一个内容数据行的数据列,最后置下一数据块行键列为“文件结尾”,并向用户返回“成功”信息;
(8-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;
(8-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:
(8-3-3-1)若追加选项为假,则读取该文件的元数据行,获得文件内容第一个数据块的行键,并将字节数据写入第一个数据块的行键所指示的内容数据行的数据列中,读取第一数据块内容数据行,获得下一数据块的行键,并将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块的下一数据块行键的列,获得下一数据块的行键,并删除该当前数据块的内容数据行,置下一数据块为当前数据块,重复上述读取删除操作,直到当前数据块的下一数据块行键列的值为“文件结尾”,删除当前数据块的内容数据行,向用户返回“成功”信息;
(8-3-3-2)若追加选项为真,则读取该文件元数据行,获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键,重复“置数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键”的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,读出当前数据块的内容数据,并将字节数据追加到当前数据块的内容数据后,得到新的当前数据块内容数据,进行步骤(8-3-3-2-1);
(8-3-3-2-1)根据用户设定的数据块大小域值判断当前数据块内容数据大小,若当前数据块内容数据大小超过数据块大小域值,则将当前数据块拆分出一块等于数据块大小域值的数据块和最后一块剩余内容数据块,将当前数据块设为大小等于数据块大小域值的数据块后,将当前数据块内容数据写入当前数据块的内容数据行的数据中,构建下一数据块的行键,并在当前数据块的内容数据行中写入下一数据块的行键,并将最后一块剩余内容数据块设为当前数据块,重复步骤(8-3-3-2-1),直到最后一块剩余内容数据块不超过数据块大小域值,并将最后一块内容数据块写入该数据块行键指定的内容数据行的数据列中,并置下一数据块行键列内容为“文件结尾”,向用户返回“成功”信息;
(9)当存储接口模块接到用户的本地路径上传命令及相应的存储标识符、本地文件或本地文件夹路径时,存储接口模块对存储标识符进行识别:
(9-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;
(9-2)若存储标识符标识的是文件且本地路径是文件夹,则向用户返回“错误”信息;
(9-3)若存储标识符标识的是文件夹且本地路径是文件,则向用户返回“错误”信息;
(9-4)若存储标识符标识的是文件且本地路径是文件,则存储接口模块使用步骤(6-3)创建该文件的父文件夹,若步骤(6-3)返回“失败”信息,则向用户返回“失败”信息,若步骤(6-3)返回“已经存在同名资源”或“成功”信息,则在该文件所在父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,置第一个数据块为当前数据块,并置当前文件读取位置为0,从本地路径所指示的文件内容的当前文件读取位置向后读取数据,使读取的数据大小等于数据块大小域值,形成第一个数据块,将该第一个数据块内容写入当前数据块行键所指示的内容数据行的数据列中,同时存储接口模块确定下一个数据块的行键,并将下一个数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,置下一个数据块为当前数据块,将当前文件读取位置加上数据块大小域值,重复上述读取数据块、写入数据块、确定行键、置当前数据块的操作,直至读到本地文件内容的最后一个数据块,将最后一个数据块内容写入该数据块内容数据行的数据列后,在该数据块内容数据行的下一数据块行键列中写入“文件结尾”,向用户返回“成功”信息;
(9-5)若存储标识符标识的是文件夹且本地路径是文件夹,使用步骤(6-3)创建该文件夹,若步骤(6-3)返回“已经存在同名资源”或“失败”信息,则向用户返回“已经存在同名资源”或“失败”信息,若步骤(6-3)返回“成功”信息,则读取本地路径所指示文件夹的一个子文件或子文件夹i(i=1,2,..,n),并使用步骤(9-3)或(9-4)对子文件或子文件夹i进行上传后,在存储标识符标识的文件夹的元数据行中添加“子文件路径”或“子文件夹路径”列以及内容为子文件或子文件夹i的元数据行行键的列数据,重复上述上传子文件或子文件夹的步骤,直到将n个子文件或子文件夹上传完成后,向用户返回“成功”信息,当重复过程中出现子文件或子文件夹上传失败,则向用户返回“失败”信息;
(10)当存储接口模块接到用户的流上传命令及相应的存储标识符、追加选项时,存储接口模块初始化一个大小等于用户设定的数据块大小域值的本地内存缓存区,并将本地内存缓存区内容置为空,对存储标识符进行识别:
(10-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;
(10-2)若存储标识符标识的是列,则对追加选项进行判断:
(10-2-1)若追加选项为假,则存储接口模块对存储标识符中标识的列所在的表格和列簇进行判断,若存储标识符标识的列所在的表格和列簇不存在,则向用户返回“失败”信息,若存储标识符标识的列所在的表格和列簇存在,则将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;
(10-2-2)若追加选项为真,则存储接口模块对存储标识符中标识的列进行判断,若存储标识符标识的列不存在,则向用户返回“失败”信息,若存储标识符标识的列存在,则将存储标识符标识的键值库中的列数据读到本地内存缓存区中,将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;
(10-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:
(10-3-1)若键值库中不存在存储标识符标识的文件,则存储接口模块对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得该文件的父文件夹存在,该文件的父文件夹存在后,在该文件的父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,使用第一个数据块的行键创建内容数据行,将该内容数据行的下一数据块行键列置为“文件结尾”,并打开一个输出流,向用户返回该输出流操作对象;
(10-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;
(10-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:
(10-3-3-1)若追加选项为假,则存储接口模块读取该文件元数据行,获得文件内容第一个数据块的行键,读取第一数据块的行键所指示的内容数据行,以获得下一数据块的行键,将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块内容数据行,以获得下一数据块的行键,删除当前数据块的内容数据行后置下一数据块为当前数据块,重复上述置当前数据块、获取下一数据块行键、删除当前数据行的操作直到获取当前数据块的下一数据块行键列数据为“文件结尾”,删除当前数据块的内容数据行,打开一个输出流,向用户返回该输出流操作对象;
(10-3-3-2)若追加选项为真,则存储接口模块读取该文件元数据行,以获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,读取该当前数据块的行键所指示的内容数据行,以获得下一数据块的行键,重复读取下一数据块行键列查找下一数据块内容数据行的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,将当前数据块内容数据读到本地内存缓存区中,打开一个输出流,向用户返回该输出流操作对象;
(10-4)用户使用上述输出流操作对象,以字节或字节数组的方式向本地内存缓存区写入数据,同时存储接口模块启动一个计时器,若计时器计时超过用户设定的未写超时时间或用户关闭了该输出流操作对象,则存储接口模块关闭计时器,关闭输出流,存储接口模块根据存储标识符进行识别,根据识别结果分别进行步骤(10-4-1)或(10-4-2),若计时器计时在用户设定的未写超时时间内,且用户写入的数据将本地内存缓存区填满时,存储接口模块对存储标识符进行识别:
(10-4-1)若存储标识符标识的是列,则存储接口模块从键值库中读取存储标识符标识的列的数据,将本地内存缓存区数据追加到原列数据,形成新的列数据,将该新的列数据写入存储标识符标识的列中,置本地内存缓存区数据为空,重复步骤(10-4);
(10-4-2)若存储标识符标识的是文件,则存储接口模块将本地内存缓存区数据写入当前数据块的内容数据行的数据列中,确定下一数据块的行键,将下一数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,将下一数据块置为当前数据块,创建当前数据块行键所指示的内容数据行,将当前数据块的内容数据行的下一数据块行键列置为“文件结尾”,将本地内存缓存区数据置为空,重复步骤(10-4),
(11)当存储接口模块接到用户字节下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别,若存储标识符标识的是文件、文件夹、表格、行或列簇,则向用户返回“不支持”信息;若存储标识符标识的是列,则存储接口模块对键值库进行查询,若键值库中不存在存储标识符标识的列,则向用户返回一个空字节数组;若键值库中存在存储标识符标识的列,则从键值库中读取存储标识符标识的列数据,并将该列数据存入字节数组中,向用户返回该字节数组;
(12)当存储接口模块接到用户本地路径下载命令及相应的存储标识符、本地路径时,存储接口模块对存储标识符进行识别:
(12-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;
(12-2)若存储标识符标识的是文件或文件夹,则存储接口模块对存储标识符和本地路径进行识别:
(12-2-1)若存储标识符标识的是文件,且本地路径指示的是已经存在的文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;
(12-2-2)若存储标识符标识的是文件,且本地路径指示的文件不存在,则根据本地路径创建本地文件,存储接口模块从键值库中读出存储标识符标识的文件元数据行中的第一个数据块的行键,将第一个数据块设为当前数据块,通过当前数据块的行键读取当前数据块的内容数据,并将当前数据块的内容数据追加到本地文件内容中,再读取当前数据块的内容数据行,获得下一个数据块的行键,再将下一个数据块置为当前数据块,重复上述读取数据块内容、追加本地文件内容、读取下一数据块行键、设置当前数据块的操作直到当前数据块的下一数据块行键列数据为“文件结尾”时,向用户返回“成功”信息;
(12-2-3)若存储标识符标识的是文件夹,且本地路径指示的是已经存在的文件,或存储标识符标识的是文件夹,且本地路径加标识符标识的文件夹名称形成的新路径指示的是已存在的本地文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;
(12-2-4)若存储标识符标识的是文件夹,且不存在本地路径指示的文件或文件夹,则存储接口模块在本地创建本地路径指示的文件夹,并在本地路径指示的文件夹下创建以标识符标识的文件夹名称命名的文件夹,存储接口模块从键值库中读取存储标识符标识的文件夹元数据行的“子文件路径i”或“子文件夹路径i”(i=1,2,..,n)各列数据,并重复步骤(12-2),下载该文件夹的所有子文件和子文件夹,并向用户返回“成功”信息;
(13)当存储接口模块接到流下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(13-1)若存储标识符标识的是表格,则存储接口模块向用户返回“不支持”信息;
(13-2)若存储标识符标识的是列,则存储接口模块对存储标识符标识的列进行判断,若键值库中不存在存储标识符标识的列,则向用户返回“列不存在”信息,若键值库中存在存储标识符标识的列,则从键值库中将存储标识符标识的列数据下载到本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;
(13-3)若存储标识符标识的是文件,存储接口模块对存储标识符标识的文件进行判断,若键值库中不存在存储标识符标识的文件,则向用户返回“文件不存在”信息,若键值库中存在存储标识符标识的文件,则存储接口模块从键值库中读取该文件元数据行,以获得第一个数据块的内容数据行的行键,将第一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;
(13-4)若存储标识符标识的是文件夹,存储接口模块对存储标识符标识的文件夹进行判断,若键值库中不存在存储标识符标识的文件夹,则向用户返回“文件夹不存在”信息,若键值库中存在存储标识符标识的文件夹,则存储接口模块从键值库中读取该文件夹元数据行的“子文件路径i”或子文件夹路径i”(i=1,2,..,n)各列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;
(13-5)若存储标识符标识的是列簇,存储接口模块对存储标识符标识的列簇进行判断,若键值库中不存在存储标识符标识的列簇,则向用户返回“列簇不存在”信息,若键值库中存在存储标识符标识的列簇,则存储接口模块从键值库中读取列簇的所有列及列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;
(13-6)若存储标识符标识的是行,存储接口模块对存储标识符标识的行进行判断,若键值库中不存在存储标识符标识的行,则向用户返回“行不存在”信息,若键值库中存在存储标识符标识的行,则存储接口模块从键值中读取表格定义的列簇列表,并存入本地内存的缓存区中,依次对上述列簇列表中的每一列簇,重复步骤(13-5),但在用户使用输入流操作对象时不向用户返回“读取完毕”信息,直到遍历列簇列表中的所有列簇,向用户返回“读取完毕”信息;
(13-7)用户使用输入流操作对象进行读取时,输入流操作对象对存储标识符进行识别:
(13-7-1)若存储标识符标识的是列,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,则向用户返回“读取完毕”信息;
(13-7-2)若存储标识符标识的是文件,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,读取当前数据块的内容数据行,以获得下一个数据块的行键,将下一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,重复上述步骤,直到读取当前数据块的内容数据行的下一数据块行键列为“文件结尾”时,向用户返回“读取完毕”信息;
(13-7-3)若存储标识符标识的是文件夹,则输入流操作对象从本地内存缓存区中读取下一子文件或子文件夹路径,并向用户返回下一子文件或子文件夹路径,当所有子文件或子文件夹路径已经读取完成时,向用户返回“读取完毕”信息;
(13-7-4)若存储标识符标识的是列簇,则输入流操作对象从本地内存缓存区中读取下一列,并向用户返回下一列的名称及数据,当所有列已经读取完成时,向用户返回“读取完毕”信息。

Claims (1)

1.一种基于键值库的文件与结构化数据统一存储方法,其特征在于该方法包括以下步骤:
(1)用户初始化键值库,键值库中具有表格、列簇和列三种单元的结构化存储模式,其中,表格包含多个列簇,每个列簇包含一个或多个列,数据按行存入表格中,每行数据在同一表格中用行键识别,数据存储在列中,一行列数据存储在一个或多个列簇中;
(2)建成对文件与结构化数据统一进行高效访问的存储接口模块,在键值库中为文件建立元数据表格,在元数据表格中存储文件的属性数据,所述的元数据表格包含元数据和内容数据两个列簇,分别用以表示文件或文件所在的文件夹的属性数据和文件的内容数据;
(3)存储接口模块通过将文件拆分成多个数据块存储在键值库中,使用一行元数据和多行内容数据存储一个文件,存储形式如下:文件在所在文件系统中的路径所形成的行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件的属性数据,该属性数据包括一列文件名、一列文件所在的父文件夹路径和一列文件内容数据的第一个数据块的行键;文件内容数据被切分成数据块后存储在内容数据列簇中,每个数据块为一行,数据块的行键为即时生成的通用唯一识别码(UUID),所述的内容数据列簇包括一列下一个数据块的行键、一列本数据块的内容,若该数据块为最后一个数据块,则将下一个数据块行键列的内容记为“文件结尾”;
(4)存储接口模块用一行元数据存储一个文件夹,存储形式如下:文件夹在所在文件系统中的路径形成行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件夹的属性数据,该属性数据包括一列文件夹的名称和一列文件夹所在的父文件夹路径,若该文件夹存在子文件,则属性数据还包括子文件路径,若该文件夹存在子文件夹,则属性数据还包括子文件夹路径;
(5)当存储接口模块接到用户的构造命令及相应构造参数时,存储接口模块返回用户所访问资源的存储标识符,该存储标识符标识文件夹、文件、表格、行、列簇和列6种资源,若用户访问的是文件夹或文件,则构造参数为路径,若用户访问的是表格,则构造参数为表格名称或表格名称与一个或多个列簇名称,若用户访问的是行,则构造参数为表格名称和行键,若用户访问的是列簇,则构造参数为表格名称、行键和列簇名称,若用户访问的是列,则构造参数为表格名称、行键、列簇名称和列名称;
(6)当存储接口模块接到用户的创建命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(6-1)若为文件、行、列簇或列中的任何一种资源,则向用户返回“不支持此资源”信息;
(6-2)若为表格资源,则存储接口模块对键值库进行检查,若键值库中已存在同名的表格,则向用户返回“已存在同名表格”信息,若键值库中不存在同名的表格,则在键值库中创建含指定表格名称的表格,并向用户返回“创建成功”信息;
(6-3)若为文件夹资源,则存储接口模块对指定路径进行判断,若指定路径下已存储同名的文件或文件夹,则向用户返回“已经存在同名资源”信息,若指定路径下未存储同名的文件或文件夹,则对父文件夹进行判断,若不存在父文件夹,则重复步骤(6-3),创建父文件夹,使得父文件夹存在,若存在父文件夹,则在父文件夹所在行的元数据列簇下插入一个列,列的名称为指定路径名称,并添加特殊前缀,列的数据为指定路径,同时创建本文件夹路径的所在行,行的数据分布在元数据列簇下,在该行元数据列簇下增加两列,其中一列记录本文件夹名称,另一列记录父文件夹路径,向用户返回“成功”信息;若创建父文件夹过程中出现“已存在同名资源”信息,则向用户返回“失败”信息;
(7)当存储接口模块接到用户的删除命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(7-1)当存储标识符标识的是表格资源时,存储接口模块对表格资源进行判断:
(7-1-1)若键值库中存在与该表格资源相对应的表格,则从键值库中删除与该表格资源相对应的表格,并向用户返回“成功”信息;
(7-1-2)若键值库中不存在与该表格资源相对应的表格,则向用户返回“成功”信息;
(7-2)当存储标识符标识的是列资源时,存储接口模块对列资源进行判断:
(7-2-1)若键值库中存在与该列资源相对应的列,则从键值库中删除与该列资源相对应的列,并向用户返回“成功”信息;
(7-2-2)若键值库中不存在与该列资源相对应的列,则向用户返回“成功”信息;
(7-3)当存储标识符标识的是列簇资源时,存储接口模块对列簇资源进行判断:
(7-3-1)若键值库中存在与该列簇资源相对应的列簇,则从键值库中删除与该列簇资源相对应的列簇,并向用户返回“成功”信息;
(7-3-2)若键值库中不存在与该列簇资源相对应的列簇,则向用户返回“成功”信息;
(7-4)当存储标识符标识的是行资源时,存储接口模块对行资源进行判断:
(7-4-1)若键值库存在与该行资源相对应的行时,存储接口模块对行中存储了数据的各列簇使用步骤(7-3)逐一进行删除,并向用户返回“成功”信息;
(7-4-2)若键值库不存在与该行资源相对应的行时,则向用户返回“成功”信息;
(7-5)当存储标识符标识的是文件资源时,存储接口模块从键值库中的该文件的父文件夹所在元数据行中删除记录该文件路径的列,同时从该文件所在元数据行中获取该文件的首个数据块所在行键,将首个数据块作为当前数据块,从当前数据块所在行中读出下一数据块的行键后,删除当前数据块,再将下一数据块置为当前数据块,重复上述读出和删除的操作,直到读出下一数据块行键为“文件结尾”的数据块,将下一数据块的行键为“文件结尾”的数据块置为当前数据块后,删除当前数据块,同时删除该文件的元数据行,并向用户返回“成功”信息;
(7-6)当存储标识符标识的是文件夹资源时,存储接口模块先从键值库中的该文件夹的父文件夹所在元数据行中删除记录该文件夹路径的列,从该文件夹所在元数据行中获取存储各子文件或子文件夹的路径,并重复步骤(7-5)或(7-6),删除各子文件或子文件夹,直到该文件夹不存在子文件或子文件夹,当该文件夹不存在子文件或子文件夹时,删除该文件夹所在的元数据行,并向用户返回“成功”信息;
(8)当存储接口模块接到用户的字节上传命令及相应的存储标识符、字节数据、追加选项时,存储接口模块对存储标识符进行识别:
(8-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;
(8-2)若存储标识符标识的是列,对追加选项进行识别:
(8-2-1)当追加选项为假时,存储接口模块对与存储标识符标识的列相关的表格和列簇进行判断,若与存储标识符标识的列相关的表格或列簇存在,则在键值库中将字节数据存储到存储标识符标识的列,并向用户返回“成功”信息,若与存储标识符标识的列相关的表格或列簇不存在,则向用户返回“失败”信息,
(8-2-2)当追加选项为真时,存储接口模块对存储标识符标识的列进行判断,若存储标识符标识的列存在,则从键值库中读取存储标识符标识的列的数据,并将字节数据追加到存储标识符标识的列的数据,存入存储标识符标识的列中,若存储标识符标识的列不存在,则向用户返回“失败”信息;
(8-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:
(8-3-1)若键值库中不存在存储标识符标识的文件,则对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得键值库中存在该文件的文件夹,则进行步骤(8-3-1-1);若键值库中存在该文件的父文件夹,则进行步骤(8-3-1-1);
(8-3-1-1)在该文件的父文件夹的元数据行中增加一列记录该文件的路径,创建该文件的元数据行,确定该文件内容的第一个数据块的行键,使用第一个数据块的行键创建内容数据行,再将字节数据写入第一个内容数据行的数据列,最后置下一数据块行键列为“文件结尾”,并向用户返回“成功”信息;
(8-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;
(8-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:
(8-3-3-1)若追加选项为假,则读取该文件的元数据行,获得文件内容第一个数据块的行键,并将字节数据写入第一个数据块的行键所指示的内容数据行的数据列中,读取第一数据块内容数据行,获得下一数据块的行键,并将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块的下一数据块行键的列,获得下一数据块的行键,并删除该当前数据块的内容数据行,置下一数据块为当前数据块,重复上述读取删除操作,直到当前数据块的下一数据块行键列的值为“文件结尾”,删除当前数据块的内容数据行,向用户返回“成功”信息;
(8-3-3-2)若追加选项为真,则读取该文件元数据行,获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键,重复“置数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键”的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,读出当前数据块的内容数据,并将字节数据追加到当前数据块的内容数据后,得到新的当前数据块内容数据,进行步骤(8-3-3-2-1);
(8-3-3-2-1)根据用户设定的数据块大小域值判断当前数据块内容数据大小,若当前数据块内容数据大小超过数据块大小域值,则将当前数据块拆分出一块等于数据块大小域值的数据块和最后一块内容数据块,将当前数据块设为大小等于数据块大小域值的数据块后,将当前数据块内容数据写入当前数据块的内容数据行的数据中,构建下一数据块的行键,并在当前数据块的内容数据行中写入下一数据块的行键,并将最后一块剩余内容数据块设为当前数据块,重复步骤(8-3-3-2-1),直到最后一块内容数据块不超过数据块大小域值,并将最后一块内容数据块写入该数据块行键指定的内容数据行的数据列中,并置下一数据块行键列内容为“文件结尾”,向用户返回“成功”信息;
(9)当存储接口模块接到用户的本地路径上传命令及相应的存储标识符、本地文件或本地文件夹路径时,存储接口模块对存储标识符进行识别:
(9-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;
(9-2)若存储标识符标识的是文件且本地路径是文件夹,则向用户返回“错误”信息;
(9-3)若存储标识符标识的是文件夹且本地路径是文件,则向用户返回“错误”信息;
(9-4)若存储标识符标识的是文件且本地路径是文件,则存储接口模块使用步骤(6-3)创建该文件的父文件夹,若步骤(6-3)返回“失败”信息,则向用户返回“失败”信息,若步骤(6-3)返回“已经存在同名资源”或“成功”信息,则在该文件所在父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,置第一个数据块为当前数据块,并置当前文件读取位置为0,从本地路径所指示的文件内容的当前文件读取位置向后读取数据,使读取的数据大小等于数据块大小域值,形成第一个数据块,将该第一个数据块内容写入当前数据块行键所指示的内容数据行的数据列中,同时存储接口模块确定下一个数据块的行键,并将下一个数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,置下一个数据块为当前数据块,将当前文件读取位置加上数据块大小域值,重复上述读取数据块、写入数据块、确定行键、置当前数据块的操作,直至读到本地文件内容的最后一个数据块,将最后一个数据块内容写入该数据块内容数据行的数据列后,在该数据块内容数据行的下一数据块行键列中写入“文件结尾”,向用户返回“成功”信息;
(9-5)若存储标识符标识的是文件夹且本地路径是文件夹,使用步骤(6-3)创建该文件夹,若步骤(6-3)返回“已经存在同名资源”或“失败”信息,则向用户返回“已经存在同名资源”或“失败”信息,若步骤(6-3)返回“成功”信息,则读取本地路径所指示文件夹的一个子文件或子文件夹i(i=1,2,..,n),并使用步骤(9-3)或(9-4)对子文件或子文件夹i进行上传后,在存储标识符标识的文件夹的元数据行中添加“子文件路径”或“子文件夹路径”列以及内容为子文件或子文件夹i的元数据行行键的列数据,重复上述上传子文件或子文件夹的步骤,直到将n个子文件或子文件夹上传完成后,向用户返回“成功”信息,当重复过程中出现子文件或子文件夹上传失败,则向用户返回“失败”信息;
(10)当存储接口模块接到用户的流上传命令及相应的存储标识符、追加选项时,存储接口模块初始化一个大小等于用户设定的数据块大小域值的本地内存缓存区,并将本地内存缓存区内容置为空,对存储标识符进行识别:
(10-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;
(10-2)若存储标识符标识的是列,则对追加选项进行判断:
(10-2-1)若追加选项为假,则存储接口模块对存储标识符中标识的列所在的表格和列簇进行判断,若存储标识符标识的列所在的表格和列簇不存在,则向用户返回“失败”信息,若存储标识符标识的列所在的表格和列簇存在,则将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;
(10-2-2)若追加选项为真,则存储接口模块对存储标识符中标识的列进行判断,若存储标识符标识的列不存在,则向用户返回“失败”信息,若存储标识符标识的列存在,则将存储标识符标识的键值库中的列数据读到本地内存缓存区中,将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;
(10-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:
(10-3-1)若键值库中不存在存储标识符标识的文件,则存储接口模块对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得该文件的父文件夹存在,该文件的父文件夹存在后,在该文件的父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,使用第一个数据块的行键创建内容数据行,将该内容数据行的下一数据块行键列置为“文件结尾”,并打开一个输出流,向用户返回该输出流操作对象;
(10-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;
(10-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:
(10-3-3-1)若追加选项为假,则存储接口模块读取该文件元数据行,获得文件内容第一个数据块的行键,读取第一数据块的行键所指示的内容数据行,以获得下一数据块的行键,将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块内容数据行,以获得下一数据块的行键,删除当前数据块的内容数据行后置下一数据块为当前数据块,重复上述置当前数据块、获取下一数据块行键、删除当前数据行的操作直到获取当前数据块的下一数据块行键列数据为“文件结尾”,删除当前数据块的内容数据行,打开一个输出流,向用户返回该输出流操作对象;
(10-3-3-2)若追加选项为真,则存储接口模块读取该文件元数据行,以获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,读取该当前数据块的行键所指示的内容数据行,以获得下一数据块的行键,重复读取下一数据块行键列查找下一数据块内容数据行的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,将当前数据块内容数据读到本地内存缓存区中,打开一个输出流,向用户返回该输出流操作对象;
(10-4)用户使用上述输出流操作对象,以字节或字节数组的方式向本地内存缓存区写入数据,同时存储接口模块启动一个计时器,若计时器计时超过用户设定的未写超时时间或用户关闭了该输出流操作对象,则存储接口模块关闭计时器,关闭输出流,存储接口模块根据存储标识符进行识别,根据识别结果分别进行步骤(10-4-1)或(10-4-2),若计时器计时在用户设定的未写超时时间内,且用户写入的数据将本地内存缓存区填满时,存储接口模块对存储标识符进行识别:
(10-4-1)若存储标识符标识的是列,则存储接口模块从键值库中读取存储标识符标识的列的数据,将本地内存缓存区数据追加到原列数据,形成新的列数据,将该新的列数据写入存储标识符标识的列中,置本地内存缓存区数据为空,重复步骤(10-4);
(10-4-2)若存储标识符标识的是文件,则存储接口模块将本地内存缓存区数据写入当前数据块的内容数据行的数据列中,确定下一数据块的行键,将下一数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,将下一数据块置为当前数据块,创建当前数据块行键所指示的内容数据行,将当前数据块的内容数据行的下一数据块行键列置为“文件结尾”,将本地内存缓存区数据置为空,重复步骤(10-4),
(11)当存储接口模块接到用户字节下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别,若存储标识符标识的是文件、文件夹、表格、行或列簇,则向用户返回“不支持”信息;若存储标识符标识的是列,则存储接口模块对键值库进行查询,若键值库中不存在存储标识符标识的列,则向用户返回一个空字节数组;若键值库中存在存储标识符标识的列,则从键值库中读取存储标识符标识的列数据,并将该列数据存入字节数组中,向用户返回该字节数组;
(12)当存储接口模块接到用户本地路径下载命令及相应的存储标识符、本地路径时,存储接口模块对存储标识符进行识别:
(12-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;
(12-2)若存储标识符标识的是文件或文件夹,则存储接口模块对存储标识符和本地路径进行识别:
(12-2-1)若存储标识符标识的是文件,且本地路径指示的是已经存在的文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;
(12-2-2)若存储标识符标识的是文件,且本地路径指示的文件不存在,则根据本地路径创建本地文件,存储接口模块从键值库中读出存储标识符标识的文件元数据行中的第一个数据块的行键,将第一个数据块设为当前数据块,通过当前数据块的行键读取当前数据块的内容数据,并将当前数据块的内容数据追加到本地文件内容中,再读取当前数据块的内容数据行,获得下一个数据块的行键,再将下一个数据块置为当前数据块,重复上述读取数据块内容、追加本地文件内容、读取下一数据块行键、设置当前数据块的操作直到当前数据块的下一数据块行键列数据为“文件结尾”时,向用户返回“成功”信息;
(12-2-3)若存储标识符标识的是文件夹,且本地路径指示的是已经存在的文件,或存储标识符标识的是文件夹,且本地路径加标识符标识的文件夹名称形成的新路径指示的是已存在的本地文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;
(12-2-4)若存储标识符标识的是文件夹,且不存在本地路径指示的文件或文件夹,则存储接口模块在本地创建本地路径指示的文件夹,并在本地路径指示的文件夹下创建以标识符标识的文件夹名称命名的文件夹,存储接口模块从键值库中读取存储标识符标识的文件夹元数据行的“子文件路径i”或“子文件夹路径i”(i=1,2,..,n)各列数据,并重复步骤(12-2),下载该文件夹的所有子文件和子文件夹,并向用户返回“成功”信息;
(13)当存储接口模块接到流下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:
(13-1)若存储标识符标识的是表格,则存储接口模块向用户返回“不支持”信息;
(13-2)若存储标识符标识的是列,则存储接口模块对存储标识符标识的列进行判断,若键值库中不存在存储标识符标识的列,则向用户返回“列不存在”信息,若键值库中存在存储标识符标识的列,则从键值库中将存储标识符标识的列数据下载到本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;
(13-3)若存储标识符标识的是文件,存储接口模块对存储标识符标识的文件进行判断,若键值库中不存在存储标识符标识的文件,则向用户返回“文件不存在”信息,若键值库中存在存储标识符标识的文件,则存储接口模块从键值库中读取该文件元数据行,以获得第一个数据块的内容数据行的行键,将第一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;
(13-4)若存储标识符标识的是文件夹,存储接口模块对存储标识符标识的文件夹进行判断,若键值库中不存在存储标识符标识的文件夹,则向用户返回“文件夹不存在”信息,若键值库中存在存储标识符标识的文件夹,则存储接口模块从键值库中读取该文件夹元数据行的“子文件路径i”或子文件夹路径i”(i=1,2,..,n)各列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;
(13-5)若存储标识符标识的是列簇,存储接口模块对存储标识符标识的列簇进行判断,若键值库中不存在存储标识符标识的列簇,则向用户返回“列簇不存在”信息,若键值库中存在存储标识符标识的列簇,则存储接口模块从键值库中读取列簇的所有列及列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;
(13-6)若存储标识符标识的是行,存储接口模块对存储标识符标识的行进行判断,若键值库中不存在存储标识符标识的行,则向用户返回“行不存在”信息,若键值库中存在存储标识符标识的行,则存储接口模块从键值中读取表格定义的列簇列表,并存入本地内存的缓存区中,依次对上述列簇列表中的每一列簇,重复步骤(13-5),但在用户使用输入流操作对象时不向用户返回“读取完毕”信息,直到遍历列簇列表中的所有列簇,向用户返回“读取完毕”信息;
(13-7)用户使用输入流操作对象进行读取时,输入流操作对象对存储标识符进行识别:
(13-7-1)若存储标识符标识的是列,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,则向用户返回“读取完毕”信息;
(13-7-2)若存储标识符标识的是文件,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,读取当前数据块的内容数据行,以获得下一个数据块的行键,将下一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,重复上述步骤,直到读取当前数据块的内容数据行的下一数据块行键列为“文件结尾”时,向用户返回“读取完毕”信息;
(13-7-3)若存储标识符标识的是文件夹,则输入流操作对象从本地内存缓存区中读取下一子文件或子文件夹路径,并向用户返回下一子文件或子文件夹路径,当所有子文件或子文件夹路径已经读取完成时,向用户返回“读取完毕”信息;
(13-7-4)若存储标识符标识的是列簇,则输入流操作对象从本地内存缓存区中读取下一列,并向用户返回下一列的名称及数据,当所有列已经读取完成时,向用户返回“读取完毕”信息。
CN 201110272333 2011-09-14 2011-09-14 一种基于键值库的文件与结构化数据统一存储方法 Expired - Fee Related CN102298641B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 201110272333 CN102298641B (zh) 2011-09-14 2011-09-14 一种基于键值库的文件与结构化数据统一存储方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 201110272333 CN102298641B (zh) 2011-09-14 2011-09-14 一种基于键值库的文件与结构化数据统一存储方法

Publications (2)

Publication Number Publication Date
CN102298641A CN102298641A (zh) 2011-12-28
CN102298641B true CN102298641B (zh) 2013-05-01

Family

ID=45359055

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 201110272333 Expired - Fee Related CN102298641B (zh) 2011-09-14 2011-09-14 一种基于键值库的文件与结构化数据统一存储方法

Country Status (1)

Country Link
CN (1) CN102298641B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114443670A (zh) * 2022-04-07 2022-05-06 北京奥星贝斯科技有限公司 数据的存储、读取方法及装置

Families Citing this family (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103294710B (zh) * 2012-02-28 2016-08-31 北京新媒传信科技有限公司 一种数据存取方法和装置
CN103327052B (zh) * 2012-03-22 2018-04-03 深圳市腾讯计算机系统有限公司 数据存储方法和系统以及数据访问方法和系统
CN102693312B (zh) * 2012-05-28 2014-05-28 清华大学 一种键值库数据存储中柔性事务管理方法
CN102750354B (zh) * 2012-06-11 2014-08-20 清华大学 一种非结构化数据查询操作语言的解析与处理方法
CN103714091B (zh) * 2012-10-09 2020-01-21 创新先进技术有限公司 一种生成对象识别符及从其中提取属性信息的方法及装置
CN103049574B (zh) * 2013-01-04 2015-12-09 中国科学院高能物理研究所 实现文件动态副本的键值文件系统及方法
CN104281628B (zh) * 2013-07-12 2019-07-19 腾讯科技(深圳)有限公司 报表数据的处理方法及服务器
CN103778188A (zh) * 2013-12-31 2014-05-07 网秦(北京)科技有限公司 用于在库文件中查询和/或维护数据的方法和设备
CN104679889A (zh) * 2015-03-17 2015-06-03 浪潮集团有限公司 一种面向大数据处理的数据存储方法和装置
CN106326305A (zh) * 2015-06-30 2017-01-11 星环信息科技(上海)有限公司 一种数据文件的存储和查询方法及设备
CN106484691B (zh) 2015-08-24 2019-12-10 阿里巴巴集团控股有限公司 移动终端的数据存储方法和装置
CN107301183B (zh) * 2016-04-14 2020-02-18 杭州海康威视数字技术股份有限公司 一种文件存储方法及装置
CN107038179B (zh) * 2016-08-23 2020-04-10 平安科技(深圳)有限公司 信息项存储方法和系统
CN106570129A (zh) * 2016-10-27 2017-04-19 南京邮电大学 一种对实时数据进行快速分析的存储系统及其存储方法
CN108287667A (zh) * 2018-01-24 2018-07-17 上海应用技术大学 一种访问数据的方法及其装置
CN110381128B (zh) * 2019-07-08 2022-06-07 紫光云技术有限公司 一种适用于流媒体文件的上传方法和云存储模型
CN110347690B (zh) * 2019-07-18 2022-08-09 网易(杭州)网络有限公司 一种计分板的数据索引方法和装置
CN110597767B (zh) * 2019-08-08 2022-05-10 北京盛赞科技有限公司 一种数据分割方法、装置、设备及计算机可读存储介质
CN111159176A (zh) * 2019-11-29 2020-05-15 中国科学院计算技术研究所 一种海量流数据的存储和读取的方法和系统
CN111045994B (zh) * 2019-12-25 2023-08-22 山东方寸微电子科技有限公司 一种基于kv数据库的文件分类检索方法及系统
US11762913B2 (en) * 2019-12-31 2023-09-19 Micron Technology, Inc. Cursor seek operations using deleted record spans
CN113220211A (zh) * 2020-01-21 2021-08-06 上海商汤智能科技有限公司 数据存储系统、数据访问方法及相关装置
CN111488386B (zh) * 2020-04-14 2023-09-29 北京易数科技有限公司 数据查询方法和装置
CN113051301A (zh) * 2021-03-08 2021-06-29 网宿科技股份有限公司 一种对象存储方法、系统及设备
CN114090522B (zh) * 2022-01-17 2022-04-22 泰山信息科技有限公司 一种电子文件的标识符定义方法、装置、设备
CN116107979B (zh) * 2023-04-14 2023-06-27 大熊集团有限公司 一种数据分布式读取方法及系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0994425A2 (en) * 1998-06-30 2000-04-19 iOra Ltd. System and method for generating file updates for files stored on read-only media
CN102043830A (zh) * 2010-11-17 2011-05-04 北京握奇数据系统有限公司 一种处理blob类型数据的方法、装置及智能卡

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0994425A2 (en) * 1998-06-30 2000-04-19 iOra Ltd. System and method for generating file updates for files stored on read-only media
CN102043830A (zh) * 2010-11-17 2011-05-04 北京握奇数据系统有限公司 一种处理blob类型数据的方法、装置及智能卡

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
孔兰菊等.面向SaaS应用基于键值对模式的多租户索引研究.《计算机学报》.2010,第33卷(第12期),第2239-2247页. *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114443670A (zh) * 2022-04-07 2022-05-06 北京奥星贝斯科技有限公司 数据的存储、读取方法及装置

Also Published As

Publication number Publication date
CN102298641A (zh) 2011-12-28

Similar Documents

Publication Publication Date Title
CN102298641B (zh) 一种基于键值库的文件与结构化数据统一存储方法
CN102332029B (zh) 一种基于Hadoop 的海量可归类小文件关联存储方法
CN103793534B (zh) 分布式文件系统及均衡元数据存储和访问负载的实现方法
CN101719141B (zh) 基于目录对象的文件处理方法和系统
CN103473239B (zh) 一种非关系型数据库数据更新方法和装置
US20100161565A1 (en) Cluster data management system and method for data restoration using shared redo log in cluster data management system
WO2017065885A1 (en) Distributed pipeline optimization data preparation
CN111159133B (zh) 一种基于微服务的分布式论坛系统
CN102024019B (zh) 一种分布式文件系统中基于后缀树的目录组织方法
CN101996217A (zh) 一种存储数据的方法及其存储设备
CN107807932B (zh) 一种基于路径枚举的层级数据管理方法和系统
CN102243660A (zh) 一种数据访问方法及设备
CN101840400A (zh) 一种多级分类检索方法及系统
WO2014110940A1 (en) A method, apparatus and system for storing, reading the directory index
CN103198153A (zh) 一种应用于分布式文件系统的元数据分簇管理方法和模块
CN103473337A (zh) 一种分布式存储系统中处理面向海量目录和文件的方法
CN103279489A (zh) 一种元数据的存储方法、装置
CN104123237A (zh) 海量小文件分级存储方法及系统
CN103078898A (zh) 文件系统、接口服务装置和数据存储服务提供方法
CN103049574B (zh) 实现文件动态副本的键值文件系统及方法
CN104182487A (zh) 一种支持多种存储方式的统一存储方法
CN103246549A (zh) 一种数据转存的方法及系统
CN102779138A (zh) 实时数据的硬盘存取方法
CN101833511B (zh) 数据管理方法、装置和系统
CN103473258A (zh) 云存储文件系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20130501

CF01 Termination of patent right due to non-payment of annual fee