数据存储方法、装置和计算机可读存储介质与流程

文档序号:18301547发布日期:2019-07-31 10:12阅读:163来源:国知局
数据存储方法、装置和计算机可读存储介质与流程

本公开涉及一种信息处理技术领域,特别是涉及一种数据存储方法、装置和计算机可读存储介质。



背景技术:

现有的移动终端键-值对存储大多是基于xml(extensiblemarkuplanguage,可扩展标记语言)或者json(javascriptobjectnotation,js对象简谱)格式来实现的,对于这类格式的文件,解析加载的消耗比较大,而在应用程序app开发过程中,键值持久化又是十分常见的场景,大量使用会导致app整体性能下降严重。

例如安卓android终端的sharedpreferences以及苹果ios终端的nsuserdefault等系统默认方案都存在这个问题。因此目前业界还没有一个移动终端高速读写键-值对并能实现持久化的方案。



技术实现要素:

本公开解决的技术问题是提供一种数据存储方法,以至少部分地解决现有技术中无法实现高速读写数据并能实现持久化的技术问题。此外,还提供一种数据存储装置、数据存储硬件装置、计算机可读存储介质和数据存储终端。

为了实现上述目的,根据本公开的一个方面,提供以下技术方案:

一种数据存储方法,包括:

获取待存储的键-值对;

将键-值对中的键存储在数据文件的第一数据块中;

将所述键在所述数据文件中的位置索引存储在索引文件的第一数据块中的索引存储位置中;

确定所述键-值对中的值的数据类型;

根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中。

进一步的,所述根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中,包括:

如果所述数据类型为第一数据类型,将所述第一数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值存储在所述数据文件的第二数据块中,并将所述值在所述数据文件中的位置索引存储在所述索引文件的第二数据块中。

进一步的,所述根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中,包括:

如果所述数据类型为第二数据类型,则将所述第二数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值存储在所述索引文件的第二数据块中。

进一步的,所述根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中,包括:

如果所述数据类型为第三数据类型,则将所述第三数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值所占的位数分为低位和高位,分别存储在所述索引文件的第二数据块和第三数据块中。

进一步的,所述根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中,包括:

如果所述数据类型为第四数据类型,则将所述值存储在所述索引文件的第一数据块的标志位中。

进一步的,所述索引文件还包括表征所述键-值对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

进一步的,所述方法还包括:

确定所述键-值对的存储操作是否为修改操作;

若是,则根据所述值对应的历史值的数据类型确定历史存储时所占用的存储文件及对应的数据块,并清空对应的数据块中的所述历史值。

进一步的,所述方法还包括:

根据预先建立的空闲数据块列表查询空闲数据块索引;

针对所述索引文件和所述数据文件,若零散分布在文件中的空闲数据块的数量超过预设阈值,则对对应文件进行整理,以将零散分布的空闲数据块集中在一起。

进一步的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

进一步的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

进一步的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

进一步的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种数据读取方法,包括:

从索引文件的第一数据块中的索引存储位置中读取键-值对中的键存储在数据文件中的第一位置索引;

根据所述第一位置索引从所述数据文件中的第一数据块中读取键;

根据所述索引文件中的第一数据块中的标志位确定所述键-值对中的值的数据类型;

根据所述数据类型从所述数据文件或所述索引文件中读取所述值。

进一步的,所述根据所述索引文件中的第一数据块中的标志位确定所述键-值对中的值的数据类型,包括:

如果从所述索引文件的第一数据块中的第一标志位中读取到数据类型标识,则根据所述数据类型标识确定所述键-值对中的值的数据类型;或

如果从所述索引文件的第一数据块中的第一标志位中未读取到数据类型标识,则确定所述键-值对中的值的数据类型为第四数据类型。

进一步的,所述根据所述数据类型从所述数据文件或所述索引文件中读取所述值,包括:

如果所述数据类型为第一数据类型,则从所述索引文件的第二数据块中读取所述值存储在所述数据文件中的第二位置索引;

根据所述第二位置索引从所述数据文件的第二数据块中读取所述值。

进一步的,所述根据所述数据类型从所述数据文件或所述索引文件中读取所述值,包括:

如果所述数据类型为第二数据类型,则从所述索引文件的第二数据块中读取所述值。

进一步的,所述根据所述数据类型从所述数据文件或所述索引文件中读取所述值,包括:

如果所述数据类型为第三数据类型,则从所述索引文件的第二数据块和第三数据块中分别读取第一数据和第二数据;

将所述第一数据作为低位部分及将所述第二数据作为高位部分,由所述低位部分和所述高位部分组成所述值。

进一步的,所述根据所述数据类型从所述数据文件或所述索引文件中读取所述值,包括:

如果所述数据类型为第四数据类型,则从所述索引文件的第一数据块的标志位中读取所述值。

进一步的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

进一步的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

进一步的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

进一步的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

进一步的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种数据存储装置,包括:

键-值对获取模块,用于获取待存储的键-值对;键存储模块,用于将键-值对中的键存储在数据文件的第一数据块中;

键索引存储模块,用于将所述键在所述数据文件中的位置索引存储在索引文件的第一数据块中的索引存储位置中;

数据类型确定模块,用于确定所述键-值对中的值的数据类型;

值存储模块,用于根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中。

进一步的,值存储模块具体用于:

如果所述数据类型为第一数据类型,将所述第一数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值存储在所述数据文件的第二数据块中,并将所述值在所述数据文件中的位置索引存储在所述索引文件的第二数据块中。

进一步的,值存储模块具体用于:

如果所述数据类型为第二数据类型,则将所述第二数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值存储在所述索引文件的第二数据块中。

进一步的,值存储模块具体用于:

如果所述数据类型为第三数据类型,则将所述第三数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值所占的位数分为低位和高位,分别存储在所述索引文件的第二数据块和第三数据块中。

进一步的,值存储模块具体用于:

如果所述数据类型为第四数据类型,则将所述值存储在所述索引文件的第一数据块的标志位中。

进一步的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

进一步的,所述装置还包括:

数据清空模块,用于确定所述键-值对的存储操作是否为修改操作;若是,则根据所述值对应的历史值的数据类型确定历史存储时所占用的存储文件及对应的数据块,并清空对应的数据块中的所述历史值。

进一步的,所述装置还包括:

空闲数据块整理模块,用于根据预先建立的空闲数据块列表查询空闲数据块索引;针对所述索引文件和所述数据文件,若零散分布在文件中的空闲数据块的数量超过预设阈值,则对对应文件进行整理,以将零散分布的空闲数据块集中在一起。

进一步的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

进一步的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

进一步的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

进一步的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种数据读取装置,包括:

键索引读取模块,用于从索引文件的第一数据块中的索引存储位置中读取键-值对中的键存储在数据文件中的第一位置索引;

键读取模块,用于根据所述第一位置索引从所述数据文件中的第一数据块中读取键;

数据类型读取模块,用于根据所述索引文件中的第一数据块中的标志位确定所述键-值对中的值的数据类型;

值读取模块,用于根据所述数据类型从所述数据文件或所述索引文件中读取所述值。

进一步的,所述数据类型读取模块具体用于:

如果从所述索引文件的第一数据块中的第一标志位中读取到数据类型标识,则根据所述数据类型标识确定所述键-值对中的值的数据类型;或

如果从所述索引文件的第一数据块中的第一标志位中未读取到数据类型标识,则确定所述键-值对中的值的数据类型为第四数据类型。

进一步的,所述值读取模块具体用于:如果所述数据类型为第一数据类型,则从所述索引文件的第二数据块中读取所述值存储在所述数据文件中的第二位置索引;根据所述第二位置索引从所述数据文件的第二数据块中读取所述值。

进一步的,所述值读取模块具体用于:如果所述数据类型为第二数据类型,则从所述索引文件的第二数据块中读取所述值。

进一步的,所述值读取模块具体用于:如果所述数据类型为第三数据类型,则从所述索引文件的第二数据块和第三数据块中分别读取第一数据和第二数据;将所述第一数据作为低位部分及将所述第二数据作为高位部分,由所述低位部分和所述高位部分组成所述值。

进一步的,所述值读取模块具体用于:如果所述数据类型为第四数据类型,则从所述索引文件的第一数据块的标志位中读取所述值。

进一步的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

进一步的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

进一步的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

进一步的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

进一步的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种电子设备,包括:

存储器,用于存储非暂时性计算机可读指令;以及

处理器,用于运行所述计算机可读指令,使得所述处理器执行时实现上述任一数据存储方法技术方案中所述的步骤。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种计算机可读存储介质,用于存储非暂时性计算机可读指令,当所述非暂时性计算机可读指令由计算机执行时,使得所述计算机执行上述任一数据存储方法技术方案中所述的步骤。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种电子设备,包括:

存储器,用于存储非暂时性计算机可读指令;以及

处理器,用于运行所述计算机可读指令,使得所述处理器执行时实现上述任一数据读取方法技术方案中所述的步骤。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种计算机可读存储介质,用于存储非暂时性计算机可读指令,当所述非暂时性计算机可读指令由计算机执行时,使得所述计算机执行上述任一数据读取方法技术方案中所述的步骤。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种数据存储终端,包括上述任一数据存储装置。

为了实现上述目的,根据本公开的又一个方面,还提供以下技术方案:

一种数据读取终端,包括上述任一数据读取装置。

本公开实施例通过将键的位置索引和键分别存储在不同的文件中,即将键的位置索引存储在索引文件的第一数据块中的索引存储位置中,并将键存储在数据文件的第一数据块中,并根据值的数据类型确定将所述值的存储在所述数据文件或所述索引文件中,可以实现键-值对的高速读写数据并能实现持久化。

上述说明仅是本公开技术方案的概述,为了能更清楚了解本公开的技术手段,而可依照说明书的内容予以实施,并且为让本公开的上述和其他目的、特征和优点能够更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。

附图说明

图1为根据本公开一个实施例的数据存储方法的流程示意图;

图2为根据本公开一个实施例的数据存储方法的流程示意图;

图3为根据本公开一个实施例的数据存储装置的结构示意图;

图4为根据本公开一个实施例的数据读取装置的结构示意图;

图5为根据本公开一个实施例的电子设备的结构示意图。

具体实施方式

以下通过特定的具体实例说明本公开的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本公开的其他优点与功效。显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。本公开还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本公开的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目个方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。

还需要说明的是,以下实施例中所提供的图示仅以示意方式说明本公开的基本构想,图式中仅显示与本公开中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。

另外,在以下描述中,提供具体细节是为了便于透彻理解实例。然而,所属领域的技术人员将理解,可在没有这些特定细节的情况下实践所述方面。

为了解决现有技术中无法实现高速读写数据并能实现持久化的技术问题,本公开实施例提供一种数据存储方法。如图1所示,该数据存储方法主要包括如下步骤s11至步骤s15。其中:

步骤s11:获取待存储的键-值对。

其中,键-值对包括key和value,其中键对应值的编号,数据类型通常为字符串类型,值对应为数值,对应多种数据类型。例如,手机通讯录中姓名和电话就为一个键-值对,例如键:小明,值:13333333333(小明号码)。

步骤s12:将键-值对中的键存储在数据文件的第一数据块中。

其中,数据文件用于存储大容量数据,具体的,在存储之前确定是否已有对应的数据文件,若已有,则直接进行存储,若无,则首先生成对应的数据文件,再进行存储。

步骤s13:将所述键在所述数据文件中的位置索引存储在索引文件的第一数据块中的索引存储位置中。

其中,索引文件用于存储位置索引或小容量数据。具体的,在存储之前确定是否已有对应的索引文件,若已有,则直接进行存储,若无,则首先生成对应的索引文件,再进行存储。

由于键通常为字符串类型,占用较大的存储空间,为了便于对其进行管理及实现高速读写键-值对并能实现持久化,在本实施例中将其分开存储,即将键存储在数据文件的第一数据块中,将对应的位置索引存储在索引文件的第一数据块中的索引存储位置中。

其中,为了使存储文件最大可复用,文件结构按块分配,每个文件包括至少一个数据块。

数据文件中包含多个不同的数据块,分别用于存储不同的数据,这里为了区分数据文件中不同的数据块,将本文中首次出现的数据块定义为第一数据块,将后续出现的数据块定义为第二数据块。同理,索引文件中也包含多个不同的数据块,分别用于存储不同的数据,将索引文件中出现的不同数据块分别定义为第一数据块和第二数据块。

索引文件中每个数据块的存储空间可以相同(例如,均为32bit),也可以不同(例如,有的数据块为32bit,有的数据块为64bit等)。但是,索引文件中出现的数据块分为两类,一类为键对应的数据块,用于存储键的位置索引、标志位、或值,另一类为值对应的数据块,用于存储值或值的位置索引。其中,索引文件中的第一数据块即为键对应的数据块,索引文件中的第二数据块即为值对应的数据块。

步骤s14:确定所述键-值对中的值的数据类型。

其中,值数据类型包括整型int、短整型short、长整型longint、布尔类型bool、字符型char、字节类型byte、字符串类型string、浮点型foat、双精度型double等。

步骤s15:根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中。

由于数据类型决定了存储值所占用的位数,若占用的位数较多,则为了便于对其进行管理及实现高速读写键-值对并能实现持久化,将其存储在所述数据文件,若占用的位数较少,为了便于后续读取,则直接将其存储在所述索引文件中。

本实施例通过将键的位置索引和键分别存储在不同的文件中,即将键的位置索引存储在索引文件的第一数据块中的索引存储位置中,并将键存储在数据文件的第一数据块中,并根据值的数据类型确定将所述值的存储在所述数据文件或所述索引文件中,可以实现键-值对的高速读写数据并能实现持久化。

在一个可选的实施例中,步骤s13具体包括:

步骤s131:如果所述数据类型为第一数据类型,将所述第一数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中。

为了区分本文中出现的不同数据类型,将本文中首次出现的数据类型定义为第一数据类型,后续出现的数据类型依次定义为第二数据类型、第三数据类型和第四数据类型。

为了区分本文中出现的不同的标志位,将本文中首次出现的标志位定义为第一标志位,后续出现的标志位依次定义为第二标志位、第三标志位、第四标志位和第五标志位。

其中,第一数据类型为字符串类型string。

其中,第一标志位为预先在索引文件的第一数据块即键对应的数据块中设定的固定存储位置,该固定存储位置用于存储数据类型标识,具体包括至少一位,最多可包括4bit,最多可存储16种数据类型。

可选的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

具体的,下面对索引文件的第一数据块即键对应的数据块的存储结构进行举例说明,其中,标志位占8bit,键的位置索引占24bit。具体结构如下:

为了便于对8bit标志位进行解释说明,现对8bit标志位对应的存储位置进行标号如下|0|1|2|3|4|5|6|7|,其中,0标志位对应的数据表征所述键-值对对应的数据块是否有效(例如0表示有效,1表示无效)、1标志位对应的数据表征所述索引文件是否能够扩展(例如0表示可以扩展,1表示不能扩展)、2标志位对应的数据表征所述值是否是压缩类型(例如0表示是,1表示否)、3标志位对应的数据是否预留存储空间(例如0表示预留,1表示不预留)、4、5、6、7四标志位(对应第一标志位)对应的数据表征值的数据类型,可以表示16种数据类型。

其中,键位置索引24bit,可以表示的最大索引数为224=16777216。

步骤s132:将所述值存储在所述数据文件的第二数据块中,并将所述值在所述数据文件中的位置索引存储在所述索引文件的第二数据块中。

为了提高索引和分配效率,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

在本实施例中,可由8bit标志位和24bit键的存储索引组成索引文件的第一数据块,32bit值的存储索引组成索引文件的第二数据块,将存储键的数据块组成数据文件的第一数据块,例如其对应的索引为索引0,将存储值的数据块组成数据文件的第二数据块,例如其对应的索引为索引1。例如,对应的数据文件的存储结构可以为如下形式:

对应的索引文件的存储结构可采用如下形式:

可选的,所述索引文件中的第一数据块和第二数据块物理位置相邻。即键对应的数据块和值对应的数据块物理位置相邻。

可选的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

具体以上述键结构为例,将标志位和键的存储索引共同组成第一数据块即键对应的数据块,以值的存储索引组成第二数据块即值对应的数据块,那么当对应的键-值对为多个时,其对应的索引文件结构如下:

|键|值|键|值|键|值|键|值|

在一个可选的实施例中,步骤s13具体包括:

步骤s133:如果所述数据类型为第二数据类型,则将所述第二数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中。

其中,第二数据类型可以为int、shortint、char、byte、float中的任意一种。

步骤s134:将所述值存储在所述索引文件的第二数据块中。

由于第二数据类型所占的存储空间较少,例如float占32bit、int占32bit、shortint占16bit、char占16bit、byte占8bit,当第二数据块为32bit时,则可以直接存储上述数据类型对应的数据即值。其对应的索引文件的存储形式如下:

在一个可选的实施例中,步骤s13具体包括:

步骤s135:如果所述数据类型为第三数据类型,则将所述第三数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中。

其中,第三数据类型可以为longint或double。

步骤s136:将所述值所占的位数分为低位和高位,分别存储在所述索引文件的第二数据块和第三数据块中。

由于第三数据类型占用的存储空间较多,longint或double均占64bit,可以分为高位32bit和低位32bit分别进行存储,并将其存储在索引文件中,如果索引文件中的每个数据块对应的长度为32bit,则对应的索引文件的存储结构如下:

在一个可选的实施例中,步骤s13具体包括:

如果所述数据类型为第四数据类型,则将所述值存储在所述索引文件的第一数据块的标志位中。

其中,第四数据类型可以为bool类型,占用1bit。因此,可以直接将其存储在索引文件的标志位中。例如,值为1,其对应的索引文件的存储结构如下:

上述实施例通过根据值的数据类型确定存储方式,当数据类型为第一数据类型,分两个文件存储,并且采用分块的方式,将所述第一数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中,并将所述值存储在所述数据文件的第二数据块中,进一步将所述值在所述数据文件中的位置索引存储在所述索引文件的第二数据块中,当数据类型为其他数据类型时,则直接将其存储在索引文件中,可以实现高速读写数据并能实现持久化。

并且,通过分文件存储,在存储时,可以先将值写入数据文件中,如果写入过程发生中断,则不会造成索引文件有脏数据的现象出现。

进一步的,为方便快速分配及复用数据块,在所述数据文件和/或所述索引文件中预留固定数目的数据块。

例如,可在索引文件前部预留如下数据块:

·16个32bit

·16个64bit

·4个128bit

一共预留16*4+16*8+4*16=256byte存储空间(8bit=1byte),除了这些预留的存储空间,索引文件中的其余存储空间可以随机分配。

可在数据文件前部预留如下数据块:

文件前部预留固定数目块,方便快速分配与复用块

·10个8byte

·20个16byte

·20个32byte

一共预留10*8+20*16+10*32=720byte存储空间,除了这些预留的存储空间,数据文件中的其余存储空间可以随机分配。例如可以以32byte为单位进行分配。

在一个可选的实施例中,本公开的方法还包括:

确定所述键-值对的存储操作是否为修改操作;

若是,则根据所述值对应的历史值的数据类型确定历史存储时所占用的存储文件及对应的数据块,并清空对应的数据块中的所述历史值。

此外,如果发现是重复存储,则就不必再重新存储了。如果发现数据重复了,还可以清除存储文件中重复的数据。

在一个可选的实施例中,由于数据在存储过程中,可能会清空存储文件中的重复数据或清空修改前的数据,这样会导致文件中存在一些零散的空闲数据块,为了使文件更为规整,并便于管理,本公开的方法还包括:

在一个可选的实施例中,本公开的方法还包括:

根据预先建立的空闲数据块列表查询空闲数据块索引;

针对所述索引文件和所述数据文件,若零散分布在文件中的空闲数据块的数量超过预设阈值,则对对应文件进行整理,以将零散分布的空闲数据块集中在一起。

为了解决现有技术中无法实现高速读写数据并能实现持久化的技术问题,本公开实施例提供一种数据读取方法。如图2所示,该数据读取方法主要包括如下步骤s21至步骤s24。其中:

步骤s21:从索引文件的第一数据块中的索引存储位置中读取键-值对中的键存储在数据文件中的第一位置索引。

在本文中,为了区分本文中前后出现的不同位置索引,这里将首次出现的位置索引定义为第一位置索引,后续出现的位置索引定义为第二位置索引。

步骤s22:根据所述第一位置索引从所述数据文件中的第一数据块中读取键。

步骤s23:根据所述索引文件中的第一数据块中的标志位确定所述键-值对中的值的数据类型。

其中,值数据类型包括整型int、短整型short、长整型longint、布尔类型bool、字符型char、字节类型byte、字符串类型string、浮点型foat、双精度型double等。

步骤s24:根据所述数据类型从所述数据文件或所述索引文件中读取所述值。

由于在对键-值对进行存储时,分两个文件并且采用分块的方式进行存储,本实施例在读取时分别从不同的文件中读取,从而获得数据,可以实现高速读取数据并能实现持久化。

在一个可选的实施例中,步骤s23具体包括:

如果从所述索引文件的第一数据块中的第一标志位中读取到数据类型标识,则根据所述数据类型标识确定所述键-值对中的值的数据类型;或

如果从所述索引文件的第一数据块中的第一标志位中未读取到数据类型标识,则确定所述键-值对中的值的数据类型为第四数据类型。

在一个可选的实施例中,步骤s24具体包括:

步骤s241:如果所述数据类型为第一数据类型,则从所述索引文件的第二数据块中读取所述值存储在所述数据文件中的第二位置索引。

步骤s242:根据所述第二位置索引从所述数据文件的第二数据块中读取所述值。

其中,第一数据类型为字符串类型string。在存储时,如果数据类型为上述数据类型中的任意一种,则值被存储在数据文件的第二数据块中。因此读取时,如果数据类型为上述数据类型中的任意一种,则首先从所述索引文件的第二数据块中读取所述值存储在所述数据文件中的第二位置索引,然后根据所述第二位置索引从所述数据文件的第二数据块中读取。

在一个可选的实施例中,步骤s24具体包括:

如果所述数据类型为第二数据类型,则从所述索引文件的第二数据块中读取所述值。

其中,第二数据类型可以为int、shortint、char、byte、float中的任意一种。在存储时,如果数据类型为上述数据类型中的任意一种,则直接将值存储在索引文件的第二数据块中。因此,在读取时,如果数据类型为上述数据类型中的任意一种,则直接从所述索引文件的第二数据块中读取。

在一个可选的实施例中,步骤s24具体包括:

如果所述数据类型为第三数据类型,则从所述索引文件的第二数据块和第三数据块中分别读取第一数据和第二数据;

将所述第一数据作为低位部分及将所述第二数据作为高位部分,由所述低位部分和所述高位部分组成所述值。

其中,第三数据类型可以为longint或double。在存储时,如果数据类型为上述数据类型中的任意一种,则直接将值分为高位和低位,分别存储在索引文件的第二数据块和第三数据块中。因此,在读取时,如果数据类型为上述数据类型中的任意一种,则直接从所述索引文件的第二数据块和第三数据块中读取数据,并合成得到所述值。

在一个可选的实施例中,步骤s24具体包括:

如果所述数据类型为第四数据类型,则从所述索引文件的第一数据块的标志位中读取所述值。

其中,第四数据类型可以为bool。在存储时,如果数据类型为上述数据类型,则直接将值存储在索引文件的第一数据块的标志位中。因此,在读取时,如果数据类型为上述数据类型,则直接从所述索引文件的第一数据块的标志位中读取。

可选的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

可选的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

可选的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

可选的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

可选的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

关于上述步骤中各名词的详细解释参见上述实施例,这里不再赘述。

本领域技术人员应能理解,在上述各个实施例的基础上,还可以进行明显变型(例如,对所列举的模式进行组合)或等同替换。

在上文中,虽然按照上述的顺序描述了数据存储方法实施例中的各个步骤,本领域技术人员应清楚,本公开实施例中的步骤并不必然按照上述顺序执行,其也可以倒序、并行、交叉等其他顺序执行,而且,在上述步骤的基础上,本领域技术人员也可以再加入其他步骤,这些明显变型或等同替换的方式也应包含在本公开的保护范围之内,在此不再赘述。

下面为本公开装置实施例,本公开装置实施例可用于执行本公开方法实施例实现的步骤,为了便于说明,仅示出了与本公开实施例相关的部分,具体技术细节未揭示的,请参照本公开方法实施例。

为了解决现有技术中无法实现高速读写数据并能实现持久化的技术问题,本公开实施例提供一种数据存储装置。该装置可以执行上述数据存储方法实施例中的步骤。如图3所示,该装置主要包括:键-值对获取模块31、键存储模块32、键索引存储模块33、数据类型确定模块34和值存储模块35;其中,

键-值对获取模块31用于获取待存储的键-值对;键存储模块32用于将键-值对中的键存储在数据文件的第一数据块中;

键索引存储模块33用于将所述键在所述数据文件中的位置索引存储在索引文件的第一数据块中的索引存储位置中;

数据类型确定模块34用于确定所述键-值对中的值的数据类型;

值存储模块35用于根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中。

进一步的,值存储模块35具体用于:

如果所述数据类型为第一数据类型,将所述第一数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值存储在所述数据文件的第二数据块中,并将所述值在所述数据文件中的位置索引存储在所述索引文件的第二数据块中。

进一步的,值存储模块35具体用于:

如果所述数据类型为第二数据类型,则将所述第二数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值存储在所述索引文件的第二数据块中。

进一步的,值存储模块35具体用于:

如果所述数据类型为第三数据类型,则将所述第三数据类型的标识存储在所述索引文件的第一数据块中的第一标志位中;

将所述值所占的位数分为低位和高位,分别存储在所述索引文件的第二数据块和第三数据块中。

进一步的,值存储模块35具体用于:

如果所述数据类型为第四数据类型,则将所述值存储在所述索引文件的第一数据块的标志位中。

进一步的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

进一步的,所述装置还包括:数据清空模块36;其中

数据清空模块36用于确定所述键-值对的存储操作是否为修改操作;若是,则根据所述值对应的历史值的数据类型确定历史存储时所占用的存储文件及对应的数据块,并清空对应的数据块中的所述历史值。

进一步的,所述装置还包括:空闲数据块整理模块37;其中,

空闲数据块整理模块37用于根据预先建立的空闲数据块列表查询空闲数据块索引;针对所述索引文件和所述数据文件,若零散分布在文件中的空闲数据块的数量超过预设阈值,则对对应文件进行整理,以将零散分布的空闲数据块集中在一起。

进一步的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

进一步的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

进一步的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

进一步的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

有关数据存储装置实施例的工作原理、实现的技术效果等详细说明可以参考前述数据存储方法实施例中的相关说明,在此不再赘述。

为了解决现有技术中无法实现高速读写数据并能实现持久化的技术问题,本公开实施例提供一种数据读取装置。该装置可以执行上述数据读取方法实施例中的步骤。如图4所示,该装置主要包括:键索引读取模块41、键读取模块42、数据类型读取模块43和值读取模块44;其中,

键索引读取模块41用于从索引文件的第一数据块中的索引存储位置中读取键-值对键-值对中的键存储在数据文件中的第一位置索引;

键读取模块42用于根据所述第一位置索引从所述数据文件中的第一数据块中读取键;

数据类型读取模块43用于根据所述索引文件中的第一数据块中的标志位确定所述键-值对中的值的数据类型;

值读取模块44用于根据所述数据类型从所述数据文件或所述索引文件中读取所述值。

进一步的,所述数据类型读取模块43具体用于:

如果从所述索引文件的第一数据块中的第一标志位中读取到数据类型标识,则根据所述数据类型标识确定所述键-值对中的值的数据类型;或

如果从所述索引文件的第一数据块中的第一标志位中未读取到数据类型标识,则确定所述键-值对中的值的数据类型为第四数据类型。

进一步的,所述值读取模块44具体用于:如果所述数据类型为第一数据类型,则从所述索引文件的第二数据块中读取所述值存储在所述数据文件中的第二位置索引;根据所述第二位置索引从所述数据文件的第二数据块中读取所述值。

进一步的,所述值读取模块44具体用于:如果所述数据类型为第二数据类型,则从所述索引文件的第二数据块中读取所述值。

进一步的,所述值读取模块44具体用于:如果所述数据类型为第三数据类型,则从所述索引文件的第二数据块和第三数据块中分别读取第一数据和第二数据;将所述第一数据作为低位部分及将所述第二数据作为高位部分,由所述低位部分和所述高位部分组成所述值。

进一步的,所述值读取模块44具体用于:如果所述数据类型为第四数据类型,则从所述索引文件的第一数据块的标志位中读取所述值。

进一步的,所述索引文件还包括表征所述键-值对对应的数据块是否有效的第二标志位、表征所述索引文件是否能够扩展的第三标志位、表征所述值是否是压缩类型的第四标志位和是否预留存储空间的第五标志位中的至少一种存储标识。

进一步的,所述索引文件中的第一数据块和第二数据块物理位置相邻。

进一步的,当所述键-值对为多个时;针对每个键-值对,在所述索引文件中所占用的第一数据块和第二数据块构成一个数据块对,在所述索引文件中所有数据块对在物理位置上连续排列。

进一步的,当所述键-值对为多个时,每个键-值对在所述数据文件中所占用的数据块是相互独立的。

进一步的,所述索引文件和/或所述数据文件中预留固定数目的数据块。

有关数据读取装置实施例的工作原理、实现的技术效果等详细说明可以参考前述数据读取方法实施例中的相关说明,在此不再赘述。

下面参考图5,其示出了适于用来实现本公开实施例的电子设备的结构示意图。本公开实施例中的电子设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字tv、台式计算机等等的固定终端。图5示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

如图5所示,电子设备可以包括处理装置(例如中央处理器、图形处理器等)501,其可以根据存储在只读存储器(rom)502中的程序或者从存储装置508加载到随机访问存储器(ram)503中的程序而执行各种适当的动作和处理。在ram503中,还存储有电子设备操作所需的各种程序和数据。处理装置501、rom502以及ram503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。

通常,以下装置可以连接至i/o接口505:包括例如触摸屏、触摸板、键盘、鼠标、图像传感器、麦克风、加速度计、陀螺仪等的输入装置506;包括例如液晶显示器(lcd)、扬声器、振动器等的输出装置507;包括例如磁带、硬盘等的存储装置508;以及通信装置509。通信装置509可以允许电子设备与其他设备进行无线或有线通信以交换数据。虽然图5示出了具有各种装置的电子设备,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。

特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置509从网络上被下载和安装,或者从存储装置508被安装,或者从rom502被安装。在该计算机程序被处理装置501执行时,执行本公开实施例的方法中限定的上述功能。

需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、rf(射频)等等,或者上述的任意合适的组合。

上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。

上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:获取待存储的键-值对,将键-值对中的键存储在数据文件的第一数据块中,并将所述键在所述数据文件中的位置索引存储在索引文件的第一数据块中的索引存储位置中;确定所述键-值对中的值的数据类型;根据所述数据类型确定将所述值的存储在所述数据文件或所述索引文件中。

或者,上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:从索引文件的第一数据块中的索引存储位置中读取键-值对中的键存储在数据文件中的第一位置索引;根据所述第一位置索引从所述数据文件中的第一数据块中读取键;根据所述索引文件中的第一数据块中的标志位确定所述键-值对中的值的数据类型;根据所述数据类型从所述数据文件或所述索引文件中读取所述值。

可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。

附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,单元的名称在某种情况下并不构成对该单元本身的限定。

以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。

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