CN105468712A - 一种数据存储兼容方法 - Google Patents
一种数据存储兼容方法 Download PDFInfo
- Publication number
- CN105468712A CN105468712A CN201510805701.7A CN201510805701A CN105468712A CN 105468712 A CN105468712 A CN 105468712A CN 201510805701 A CN201510805701 A CN 201510805701A CN 105468712 A CN105468712 A CN 105468712A
- Authority
- CN
- China
- Prior art keywords
- metadata
- data
- storage
- value
- field
- 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.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
- G06F16/2474—Sequence data queries, e.g. querying versioned data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Computational Linguistics (AREA)
- Probability & Statistics with Applications (AREA)
- Fuzzy Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种数据存储兼容方法。本发明方案放弃了传统的基于不同版本的数据转化实现兼容的思路,将存储的内容分解为只有基本的内容与业务无关的元数据,并对元数据实现压缩、兼容处理和存储;预先给每个元数据分配一个标识号,并且保证每个字段的标识号不变且不同;用Key字段标识元数据在其所属消息中的结构映射,使用户正常得到消息数据;在存储时,将该标识号编码进Key字段中;能够足够高效并且引入一种数据压缩方法来有效的利用存储空间,实现高效处理、最小存储、完美相互兼容的目的。
Description
技术领域
本发明涉及一种数据存储兼容方法,特别是涉及一种适用于软件版本更叠兼容的数据存储兼容方法。
背景技术
软件版本更叠是一个逐渐且必然的过程,在更叠的过程中总会带来一些软件功能的添加、改动,进而会使新旧版本软件存储管理的数据结构和内容有所差异,但是往往旧版本软件产生的数据信息是很有意义,需要被保留并且可以被使用的,这就要求必须有一套完整的方法保证不同版本之间的数据兼容。
目前已有的方法基本都是给各个版本数据添加一些标识版本的信息,然后在新的版本软件开发过程中通过代码为不同版本数据做转化从而实现数据兼容,但从实际使用效果上来看,上述数据兼容方案使用上并不完美,主要体现在以下方面:
1、只能做到新版本兼容旧版本,不能做到不同版本之间的存储读取数据相互兼容;在某些场合完全是有可能出现旧版本的软件使用新版本的数据的;
2、需要为每两个版本号维护一个单独的兼容转换方法,若有N个版本,则需要维护2^N个转换方法,需要额外的工作,而且当维护的方法很多时工作会变得非常复杂且容易出错;
3、必须保留每个历史版本的数据结构信息,需要额外的维护,若信息丢失,则兼容失败。
发明内容
本发明要解决的技术问题是提供一种无版本依赖,维护简单的数据存储兼容方法。
本发明采用的技术方案如下:一种数据存储兼容方法,其特征在于,将存储的内容消息分解为只有基本的内容与业务无关的若干个元数据,并对元数据进行兼容处理;具体对元数据进行兼容处理的方法为:
预先给每个元数据分配一个标识号,并且保证每个字段的标识号不变且不同;用Key字段通过标识号来标识出元数据在其所属消息中的结构映射,使用户正常得到消息数据;在存储时,将该标识号编码进Key字段中;每个元数据对应一个元数据基本类型,其存储的用户内容称之为Value值;所述元数据的基本类型为用户自己定义的具有通用性的数据的基本类型;所述元数据作为基本的存储单元,采用Key—Valve对存储方式实现数据兼容,每个Value由一个Key字段来标识,读取时通过Key值来实现Value值的正常存储和正常读取。
将需要被存储的数据称为一个消息(Message),一条消息由若干个字段(Field)组成,每一个元数据对应一个字段基本类型(Field_Type),这个字段基本类型,由使用的程序语言定义,字段存储的用户内容,称之为Value值,Value值是需要被存储和读取使用的。
不同版本之间的消息Message包含的字段是不相同的,为了保证兼容,正常会记录下版本号,根据版本号,来进行消息的转换,实现兼容;现有技术内容已经阐述这种方法的种种缺陷,所以本发明方案方法就是为了实现一种与版本无关,消息无需转换的兼容方式。
基于此,我们可能看到Message是基于特定场景定义的,是用户定义的,不具有通用性;而Message下的字段(Field),却是数据的基本类型,具有通用性,因为本方法是基于具有通用性的字段(Field)来实现兼容,在方法中我们把这些字段统称之为元数据(MetaDataField)。
元数据是具体通用语言的基本类型(Field_Type)信息和保存用户数据的Value信息,我们以元数据作为基本的存储单元,并采用了一种称之为Key-Value对的存储方式来实现数据兼容,即每个Value由一个Key字段来标识,读取时通过Key值来实现Value值的还原。
基于Key-Value对存储,彻底抛弃了消息Message的结构和不同消息Message的版本信息,但因为正常用户使用的信息仍然是其定义的消息Message,所以我们在实现Key的值的时候,需要其不仅标识对应的Value的信息,也需要映射与Message的结构信息,使用多个Key-Value对可以正常得到用户需要的消息Message。
在消息Message中预先给每个元数据分配一个标识号tag_id,比如从0开始,依次增加,唯一需要保证的就是每个元数据的标识号是不变的,即新添加存储字段时,不能使用历史已经使用过的标识号,删除字段的标识号也不能被再其它字段使用,标识号的定义,保证在一种记录内,记录包含的每个元数据标识号不重复且对已经定义过不变为原则。
此tag_id与具体的元数据关联,某消息MessageA中,定义了A,B元数据,分别定义tag_id为0和1,在存储时,tag_id会被编码进Key中,在读取时,即会将tag_id为0的值读入A字段,tag_id为1的值读取B字段,若A,B字段被删除后,即新版本MessageA中没有tag_id为0和1的元数据了,若旧版本存储数据中的A,B元数据的值不被会新版本的MessageA来读取出来,因为元数据和tag_id是唯一对应的。
所述方法还包括:根据元数据的基本类型(Field_Type),确定其存储的类型值,称之为字段封装类型:WireType;由元数据的基本类型转换得到元数据的字段封装类型;通过转化,多个元数据的基本类型被简单的几个字段封装类型取代;所述字段封装类型与元数据的标识号一起,生成元数据对应存储Key值;读取时,从Key值中反解码出元数据的标识号tag_id和字段封装类型,通过标识号决定消息的具体元数据关联,通过字段封装类型实现存储数据向用户的转码,从而完整的读出Message的内容,即实现了数据的兼容。
存储类型值为方法中定义的,此封装类型值具有一般性,而元数据的基本类型具有特殊性,通过转化,不具备通用属性且具数量较多的数据字段基本类型值会被简单的几个封装类型取代,因封装类型的一般性,使得需要扩展支持的基本类型时更加容易,底层不需要再增加代码实现。
由字段的基本类型(Field_Type)转换得到了字段的封装类型WireType,同时与元数据分配的tag_id一起,生成元数据对应的存储Key值,一般采用如下位偏移方法:
Key=tag_id<3|WireType
所述方法还包括:对元数据进行压缩存储,根据元数据具体的Value值来确定其存储空间,对于元数据的具体编码实现方法为:使用Varint编码存储,每一个字节的高位为1时表示下一个字节还有数据,当字节的高位为0时表示是最后一组有效数据,然后将所有组的数据的最高位剔除掉,将剩余的数据组到一起即是原始数据。
由于本兼容方法需要增加一个额外的key和valuelength字段,所以会增加存储空间占用,需要以一种简单高效的数据编码算法,实现数据压缩,从而减少存储空间占用。
一般数据在类型确定时会有一个默认的空间占用,比如uint64会默认有8个字节的占用,但往往在实际中只会赋一个比较小的值,那么就会造成数据存储空间的浪费,本编码方法就是旨在减少不占用空间的存储,在使用时会根据数据具体的值来确定存储的字节。
比如一个uint64_ta=100时,因为100一个字段足够存下,编码后只会存储一个字段,比默认的少了7个字节的大小,就有效的提高了空间利用率。
此方法对于较小非常节省空间,但对很大的数据,反而会多消耗掉一个空间,但一般情况下不会存储这么大的整数。
通常所有整形数据都可以使用varint来存储,而且编码基本是位运算,足够高效。
所述方法还包括:具体编码实现方法中,对于很大数据的存储,使用fixed字段来直接存储原始数据。当需要明确存储很大的数据时,可以使用fixed字段来直接存储原始数据,此种情况下相比使用Varint编码,存储效率会更高。
所述方法还包括:针对负数,通过位移的编码和解码方法,实现负数和与其对应的正数的转化后再使用Varint编码存储:
对一个负数N,先进行编码,再进行解码;其编码过程为:将N向左移1位的结果和向右移n-1位的结果做异或运算,得到一个正数D;所述n为负数N的位数;其解码过程为:将D向右位移一位的结果,与D和1做位与运算结果强转为int类型并取负数的结果,做异或运算,解码后即能够根据D得到原始的负数N;所述负数N为有符号整数。
int32和int64就是简单的按varint方法来编码,所以像-1、-2这样负数对应的无符号数是非常大的,也会占比较多的字节Bytes,因此提供了一种改进方法将所有的有符号整数(正数、负数和0)映射成为所有对应的无符号数,再对无符号数采用Varint编码,实现数据高效存储。
通过以下位偏移的编码和解码方法,实现整数与之对应的无符号数的相互转化,此转化方法主要针对负数做优化处理,在实际中仅针对申明为有符号的数据做处理,若原始数据已经是无符号的数据,则不会做此编码处理。
存储Key值和Value值时,使用varint编码方法,可以使数据空闲位不被存储,只有实际有意义的数据位才会被存储到磁盘,有效的节省存储利用率。
与现有技术相比,本发明的有益效果是:本发明方案放弃了传统的基于不同版本的数据转化实现兼容的思路,将存储的内容分解为只有基本的内容与业务无关的元数据,并对元数据实现压缩、兼容处理和存储,能够足够高效并且引入一种数据压缩方法来有效的利用存储空间,实现高效处理、最小存储、完美相互兼容的目的。
附图说明
图1为现有技术版本1的数据组成示意图。
图2为现有技术版本2的数据组成示意图。
图3为本发明其中一实施例的元数据存储结构。
图4为本发明其中一实施例的元数据存储结构。
图5为本发明其中一实施例的一条消息的存储结构。
图6为C++程序举例的字段封装类型及定义表。
图7为C++程序举例的基本类型与字段封装类型的映射关系表。
图8为以131415为例的Varint编码举例示意图。
图9为有符号整数(负数)的编码处理原始数据与编码结果的对照表。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本说明书(包括摘要和附图)中公开的任一特征,除非特别叙述,均可被其他等效或者具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
如图1所示的版本1的数据组成和图2所示的版本2的数据组成,版本1的数据包括A、B、C三个元数据字段,而版本2的数据包括A、C、D三个元数据字段,其中A、C是共有,版本2在版本一的基础上删除了一个B字段和增加了一个D字段,经过兼容处理后,版本1的程序可以正常从版本2的数据中读取出版本1才有的字段,而版本2程序亦可以从版本1的数据中读取出版本2包括的字段。其具体兼容处理方法为:
在存储时,如图3所示,元数据基本类型能确定Value长度的,将Key与Value一起存储;如图4所示,元数据基本类型不能判断出Value长度的,在存储时指定Value的长度。则如图5所示,一条整个消息结构体存储就是以Key—Value对的形式进行存储。
如图6和图7所示,以下以C++程序为例,列出基本类型与存储存储的映射关系,若需要支持其它编程语言,仅需要指明基本类型与WireType类型的映射关系,从而可以实现支持多语言的能力;
如图8所示,以131415为例子讲解编码原理,编码后的存储二进制为:100000000101010111。以一个字节即8位二进制数据为一个分组,其中每一个字节的高位为1时表示下一个字节还有数据,当字节的高位为0时表示是最后一组有效数据,然后将所有组的数据的最高位剔除掉,将所有数据分组的低7位二进制组合到一起即可得到原始数据131415。
此方法对于较小非常节省空间,但对很大的数据,反而会多消耗掉一个空间,因为每一个字节的最高二进制位会被做标识符,但一般情况下不会存储这么大的整数,当需要明确存储很大的数据时,可以使用fixed字段来直接存储原始数据,此种情况下存原始数据比存Varint编码数据利用率更高。
通常所有整形数据都可以使用varint来存储,而且编码基本是位运算,足够高效。
对有符号整数处理的具体方法为:对一个原始有符号整数N,做编码处理:
(N<<1)^(N>>31)//当N为一个32位的整数时
(N<<1)^(N>>63)//当N为一个64位的整数时
即将有符号整数N向左位移一位的结果和有符号整数N向右位移31(或者63)位的结果做异或运算,得到我们需要的无符号D,此编码结果就是将绝对值较小的负数映射来较小的无符号正数,使其占用的字节数Bytes较小,如图9所示为一个直观映射表。
在读取时,将存储的无符号数转换为原始的整数,采用以下方法解码:
(D>>1)^-static_cast<int32>(D&1)//当N为一个32位的整数时
(D>>1)^-static_cast<int64>(D&1)//当N为一个64位的整数时
解码过程为:
将D向右位移一位的结果,与D和1做位与运算结果强转为int32类型(或者int64类型)并取负数的结果,做异或运算,解码后即可以根据D得到原始的整数N。
Claims (5)
1.一种数据存储兼容方法,其特征在于,将存储的内容消息分解为只有基本的内容与业务无关的若干个元数据,并对元数据进行兼容处理;具体对元数据进行兼容处理的方法为:
预先给每个元数据分配一个标识号,并且保证每个字段的标识号不变且不同;使用Key字段通过标识号来标识出元数据在其所属消息中的结构映射,使用户正常得到消息数据;在存储时,将该标识号编码进Key字段中;每个元数据对应一个元数据基本类型,其存储的用户内容称之为Value值;所述元数据的基本类型为用户自己定义的具有通用性的数据的基本类型;所述元数据作为基本的存储单元,采用Key—Valve对存储方式实现数据兼容,每个Value由一个Key字段来标识,读取时通过Key值来实现Value值的正常存储和正常读取。
2.根据权利要求1所述的数据存储兼容方法,其特征在于,所述方法还包括:根据元数据的基本类型,确定其存储的类型值,称之为字段封装类型;由元数据的基本类型转换得到元数据的字段封装类型;通过转化,多个元数据的基本类型被简单的几个字段封装类型取代;所述字段封装类型与元数据的标识号一起,生成元数据对应存储Key值;读取时,从Key值中反解码出元数据的标识号和字段封装类型,通过标识号决定消息的具体元数据关联,通过字段封装类型实现存储数据向用户的转码。
3.根据权利要求1或2所述的数据存储兼容方法,其特征在于,所述方法还包括:对元数据进行压缩存储,根据元数据具体的Value值来确定其存储空间,对于元数据的具体编码实现方法为:使用Varint编码存储,每一个字节的高位为1时表示下一个字节还有数据,当字节的高位为0时表示是最后一组有效数据,然后将所有组的数据的最高位剔除掉,将剩余的数据组到一起即是原始数据。
4.根据权利要求1所述的数据存储兼容方法,其特征在于,所述方法还包括:具体编码实现方法中,对于很大数据的存储,使用fixed字段来直接存储原始数据。
5.根据权利要求1所述的数据存储兼容方法,其特征在于,所述方法还包括:针对负数,通过位移的编码和解码方法,实现负数和与其对应的正数的转化后再使用Varint编码存储:
对一个负数N,先进行编码,再进行解码;其编码过程为:将N向左移1位的结果和向右移n-1位的结果做异或运算,得到一个正数D;所述n为负数N的位数;其解码过程为:将D向右位移一位的结果,与D和1做位与运算结果强转为int类型并取负数的结果,做异或运算,解码后即能够根据D得到原始的负数N;所述负数N为有符号整数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510805701.7A CN105468712A (zh) | 2015-11-20 | 2015-11-20 | 一种数据存储兼容方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510805701.7A CN105468712A (zh) | 2015-11-20 | 2015-11-20 | 一种数据存储兼容方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105468712A true CN105468712A (zh) | 2016-04-06 |
Family
ID=55606413
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510805701.7A Pending CN105468712A (zh) | 2015-11-20 | 2015-11-20 | 一种数据存储兼容方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105468712A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106372180A (zh) * | 2016-08-30 | 2017-02-01 | 东南大学 | 支持共享共治的内容元数据标识及应用方法 |
CN108681456A (zh) * | 2018-04-02 | 2018-10-19 | 长沙八思量信息技术有限公司 | 版本兼容的数据结构存取方法、计算机装置及存储介质 |
CN112328278A (zh) * | 2020-10-26 | 2021-02-05 | 浙江大华技术股份有限公司 | 对网络中的设备进行安装升级的方法、平台及存储介质 |
CN112992066A (zh) * | 2021-04-26 | 2021-06-18 | 北京集创北方科技股份有限公司 | 显示数据存取方法及其控制电路、显示器和资讯处理装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090225771A1 (en) * | 2008-03-06 | 2009-09-10 | Nec Corporation | Apparatus and method for tcp buffer copy distributed parallel processing |
CN103389992A (zh) * | 2012-05-09 | 2013-11-13 | 北京百度网讯科技有限公司 | 一种结构化数据存储方法及装置 |
CN103473267A (zh) * | 2013-08-09 | 2013-12-25 | 深圳市中科新业信息科技发展有限公司 | 数据存储查询方法及系统 |
-
2015
- 2015-11-20 CN CN201510805701.7A patent/CN105468712A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090225771A1 (en) * | 2008-03-06 | 2009-09-10 | Nec Corporation | Apparatus and method for tcp buffer copy distributed parallel processing |
CN103389992A (zh) * | 2012-05-09 | 2013-11-13 | 北京百度网讯科技有限公司 | 一种结构化数据存储方法及装置 |
CN103473267A (zh) * | 2013-08-09 | 2013-12-25 | 深圳市中科新业信息科技发展有限公司 | 数据存储查询方法及系统 |
Non-Patent Citations (2)
Title |
---|
STEPHEN LIU: "protocol buffer技术详解(数据编码)", 《博客园》 * |
刘明: "Google Protocol Buffer的使用和原理", 《IBM开发者中心博客》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106372180A (zh) * | 2016-08-30 | 2017-02-01 | 东南大学 | 支持共享共治的内容元数据标识及应用方法 |
CN106372180B (zh) * | 2016-08-30 | 2017-08-25 | 东南大学 | 支持共享共治的内容元数据标识及应用方法 |
CN108681456A (zh) * | 2018-04-02 | 2018-10-19 | 长沙八思量信息技术有限公司 | 版本兼容的数据结构存取方法、计算机装置及存储介质 |
CN112328278A (zh) * | 2020-10-26 | 2021-02-05 | 浙江大华技术股份有限公司 | 对网络中的设备进行安装升级的方法、平台及存储介质 |
CN112992066A (zh) * | 2021-04-26 | 2021-06-18 | 北京集创北方科技股份有限公司 | 显示数据存取方法及其控制电路、显示器和资讯处理装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105468712A (zh) | 一种数据存储兼容方法 | |
TWI531971B (zh) | 用以加速壓縮及解壓縮操作之設備與方法 | |
CN106170921A (zh) | 涉及符号压缩的数据的源编码和解码方法及装置 | |
RU2725763C1 (ru) | Способы и устройства для кодирования и декодирования двоичных данных | |
CN106528786B (zh) | 快速迁移多源异构电网大数据到HBase的方法及系统 | |
CN103944981A (zh) | 一种基于纠删码技术改进的云存储系统及实现方法 | |
CN103561057A (zh) | 基于分布式哈希表和纠删码的数据存储方法 | |
US8452093B2 (en) | Efficient histogram storage | |
CN103838860A (zh) | 一种基于动态副本策略的文件存储系统及其存储方法 | |
CN101977061B (zh) | 一种通用信息的无损压缩与解压缩方法 | |
CN102411616A (zh) | 一种数据存储方法和系统及数据管理方法 | |
US11070231B2 (en) | Reducing storage of blockchain metadata via dictionary-style compression | |
US9292549B2 (en) | Method and system for index serialization | |
US9602129B2 (en) | Compactly storing geodetic points | |
CN112287642A (zh) | 树形结构自增数据节点id及其路径链二进制编码方法 | |
CN106802927A (zh) | 一种数据存储方法及查询方法 | |
CN105337617B (zh) | 一种fsn文件高效压缩方法 | |
CN105302915A (zh) | 基于内存计算的高性能数据处理系统 | |
US20220005229A1 (en) | Point cloud attribute encoding method and device, and point cloud attribute decoding method and devcie | |
CN112988908B (zh) | 区块链数据存储方法及装置、电子设备 | |
CN105446666A (zh) | 一种基于移动终端的全数字序列存储方法及系统 | |
CN103116654B (zh) | 一种xml数据节点编码压缩方法 | |
CN103092607A (zh) | 一种电信话单数据编解码方法 | |
CN102508690A (zh) | 一种嵌入式设备的命令行的保存方法和解码方法 | |
CN103975593A (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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20160406 |
|
RJ01 | Rejection of invention patent application after publication |