一种数据存储兼容方法

文档序号:9708410阅读:613来源:国知局
一种数据存储兼容方法
【技术领域】
[0001]本发明涉及一种数据存储兼容方法,特别是涉及一种适用于软件版本更叠兼容的数据存储兼容方法。
【背景技术】
[0002]软件版本更叠是一个逐渐且必然的过程,在更叠的过程中总会带来一些软件功能的添加、改动,进而会使新旧版本软件存储管理的数据结构和内容有所差异,但是往往旧版本软件产生的数据信息是很有意义,需要被保留并且可以被使用的,这就要求必须有一套完整的方法保证不同版本之间的数据兼容。
[0003]目前已有的方法基本都是给各个版本数据添加一些标识版本的信息,然后在新的版本软件开发过程中通过代码为不同版本数据做转化从而实现数据兼容,但从实际使用效果上来看,上述数据兼容方案使用上并不完美,主要体现在以下方面:
1、只能做到新版本兼容旧版本,不能做到不同版本之间的存储读取数据相互兼容;在某些场合完全是有可能出现旧版本的软件使用新版本的数据的;
2、需要为每两个版本号维护一个单独的兼容转换方法,若有N个版本,则需要维护2~N个转换方法,需要额外的工作,而且当维护的方法很多时工作会变得非常复杂且容易出错;
3、必须保留每个历史版本的数据结构信息,需要额外的维护,若信息丢失,则兼容失败。

【发明内容】

[0004]本发明要解决的技术问题是提供一种无版本依赖,维护简单的数据存储兼容方法。
[0005]本发明采用的技术方案如下:一种数据存储兼容方法,其特征在于,将存储的内容消息分解为只有基本的内容与业务无关的若干个元数据,并对元数据进行兼容处理;具体对元数据进行兼容处理的方法为:
预先给每个元数据分配一个标识号,并且保证每个字段的标识号不变且不同;用Key字段通过标识号来标识出元数据在其所属消息中的结构映射,使用户正常得到消息数据;在存储时,将该标识号编码进Key字段中;每个元数据对应一个元数据基本类型,其存储的用户内容称之为Value值;所述元数据的基本类型为用户自己定义的具有通用性的数据的基本类型;所述元数据作为基本的存储单元,采用Key—Valve对存储方式实现数据兼容,每个Value由一个Key字段来标识,读取时通过Key值来实现Value值的正常存储和正常读取。
[0006]将需要被存储的数据称为一个消息(Message),一条消息由若干个字段(Field)组成,每一个元数据对应一个字段基本类型(Field_Type),这个字段基本类型,由使用的程序语言定义,字段存储的用户内容,称之为Value值,Value值是需要被存储和读取使用的。
[0007]不同版本之间的消息Message包含的字段是不相同的,为了保证兼容,正常会记录下版本号,根据版本号,来进行消息的转换,实现兼容;现有技术内容已经阐述这种方法的种种缺陷,所以本发明方案方法就是为了实现一种与版本无关,消息无需转换的兼容方式。
[0008]基于此,我们可能看到Message是基于特定场景定义的,是用户定义的,不具有通用性;而Message下的字段(Field),却是数据的基本类型,具有通用性,因为本方法是基于具有通用性的字段(Field)来实现兼容,在方法中我们把这些字段统称之为元数据(MetaDataField)。
[0009]元数据是具体通用语言的基本类型(Field_Type)信息和保存用户数据的Value信息,我们以元数据作为基本的存储单元,并采用了一种称之为Key-Value对的存储方式来实现数据兼容,即每个Value由一个Key字段来标识,读取时通过Key值来实现Value值的还原。
[0010]基于Key-Va lue对存储,彻底抛弃了消息Me s sage的结构和不同消息Me s sage的版本信息,但因为正常用户使用的信息仍然是其定义的消息Message,所以我们在实现Key的值的时候,需要其不仅标识对应的Va 1 ue的信息,也需要映射与Message的结构信息,使用多个Key-Value对可以正常得到用户需要的消息Message。
[0011 ] 在消息Message中预先给每个元数据分配一个标识号tag_id,比如从0开始,依次增加,唯一需要保证的就是每个元数据的标识号是不变的,即新添加存储字段时,不能使用历史已经使用过的标识号,删除字段的标识号也不能被再其它字段使用,标识号的定义,保证在一种记录内,记录包含的每个元数据标识号不重复且对已经定义过不变为原则。
[0012]此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是唯一对应的。
[0013]所述方法还包括:根据元数据的基本类型(Field_Type),确定其存储的类型值,称之为字段封装类型:WireType;由元数据的基本类型转换得到元数据的字段封装类型;通过转化,多个元数据的基本类型被简单的几个字段封装类型取代;所述字段封装类型与元数据的标识号一起,生成元数据对应存储Key值;读取时,从Key值中反解码出元数据的标识号tag_id和字段封装类型,通过标识号决定消息的具体元数据关联,通过字段封装类型实现存储数据向用户的转码,从而完整的读出Message的内容,即实现了数据的兼容。
[0014]存储类型值为方法中定义的,此封装类型值具有一般性,而元数据的基本类型具有特殊性,通过转化,不具备通用属性且具数量较多的数据字段基本类型值会被简单的几个封装类型取代,因封装类型的一般性,使得需要扩展支持的基本类型时更加容易,底层不需要再增加代码实现。
[0015]由字段的基本类型(Field_Type)转换得到了字段的封装类型WireType,同时与元数据分配的tag_id—起,生成元数据对应的存储Key值,一般采用如下位偏移方法:
Key = tag_id < 3 | WireType
所述方法还包括:对元数据进行压缩存储,根据元数据具体的Value值来确定其存储空间,对于元数据的具体编码实现方法为:使用Varint编码存储,每一个字节的高位为1时表示下一个字节还有数据,当字节的高位为0时表示是最后一组有效数据,然后将所有组的数据的最高位剔除掉,将剩余的数据组到一起即是原始数据。
[0016]由于本兼容方法需要增加一个额外的key和valuelength字段,所以会增加存储空间占用,需要以一种简单高效的数据编码算法,实现数据压缩,从而减少存储空间占用。
[0017]一般数据在类型确定时会有一个默认的空间占用,比如uint64会默认有8个字节的占用,但往往在实际中只会赋一个比较小的值,那么就会造成数据存储空间的浪费,本编码方法就是旨在减少不占用空间的存储,在使用时会根据数据具体的值来确定存储的字
Τ ο
[0018]比如一个uint64_t a = 100时,因为100—个字段足够存下,编码后只会存储一个字段,比默认的少了 7个字节的大小,就有效的提高了空间利用率。
[0019]此方法对于较小非常节省空间,但对很大的数据,反而会多消耗掉一个空间,但一般情况下不会存储这么大的整数。
[0020]通常所有整形数据都可以使用varint来存储,而且编码基本是位运算,足够高效。
[0021]所述方法还包括:具体编码实现方法中,对于很大数据的存储,使用fixed字段来直接存储原始数据。当需要明确存储很大的数据时,可以使用fixed字段来直接存储原始数据,此种情况下相比使用Varint编码,存储效率会更高。
[0022]所述方法还包括:针对负数,通过位移的编码和解码方法,实现负数和与其对应的正数的转化后再使用Varint编码存储:
对一个负数N,先进行编码,再进行解码;其编码过程为:将N向左移1位的结果和向右移n-Ι位的结果做异或运算,得到一个正数D;所述η为负数N的位数;其解码过程为:将D向右位移一位的结果,与D和1做位与运算结果强转为int类型并取负数的结果,做异或运算,解码后即能够根据D得到原始的负数N;所述负数N为有符号整数。
[0023]int32和int64就是简单的按varint方法来编码,所以像-1、-2这样负数对应的无符号数是非常大的,也会占比较多的字节Bytes,因此提供了一种改进方法将所有的有符号整数(正数、负数
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1