本发明涉及数据存储,具体提供一种多种类索引的数据存储方法及数据存储装置。
背景技术:
::1、顺序文件存储结构,在经典的lsm树下sstable(static sorted table)是一种按块存储有序kv数据的文件结构。sstable保存了排序后的数据(实际上是按照key排序的key-value对)。每个sstable可以包含多个存储数据的文件,称为segment,每个segment内部的数据都是按照key排序的。2、但是问题在于现有sstable文件结构对于kv数据,不同key分布、不同value分布及运行适用资源时,无法有更好的动态匹配。3、因此,针对不同资源和不同kv数据分布,如何使用更匹配的存储方案是本发明专利所要解决的技术问题。技术实现思路1、为了解决上述技术问题,本发明提出一种多种类索引的数据存储方法及数据存储装置,具体地,采用了如下技术方案:2、在第一方面,本发明提供一种多种类索引的数据存储方法,包括第一数据存储结构,所述第一数据存储结构包括:3、头部标识区段header,用于写入代表文件编码方式的类型数据;4、kv数据区段kvs,用于依序写入前缀压缩的kv键值对数据;5、kv索引区段array-index,记录各kv键值对在文件的起始位置offset,某一kv键值对的总长度通过该kv键值对的起始位置offset和后一个kv键值对的起始位置offset差值确定;6、key索引区段hash-index,用于记录key与kv键值对在整体文件中序号的对应索引关系。7、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法中,所述kv数据区段kvs对于具有公共前缀数据的kv键值对的编码结构包括:8、keysize区,用于存储key中后缀数据suffix的长度;9、sharedheader区,用于设置当前kv键值对不包含公共前缀数据或者包含公共前缀数据且是第一个的情况;10、sharedlen区,用于保存公共前缀数据的长度;11、suffix区,用于保存后缀数据,则该suffix区保存完整的key;12、value区,用于保存kv键值对的value。13、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法中,所述kv数据区段kvs对于仅保存后缀数据的kv键值对的编码结构包括:14、keysize区,用于存储key中后缀数据suffix的长度;15、sharedheader区,用于设置当前kv键值对包含公共前缀数据且不是第一个的情况;16、sharedpost区,用于保存与具有公共前缀数据的key之间的距离;17、suffix区,用于保存key中除去公共前缀数据的后缀数据;18、value区,用于保存kv键值对的value。19、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法中,所述的key索引区段hash-index包括:20、对key取哈希得到无符号整数,将无符号整数的高位记录下来得到key分片shard,将item记录在对应key分片shard中的第0位,同一个key分片shard有多个元素,依次记录在后续位置即可;所述item的内容是该kv键值对在整体文件中的序号。21、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法,包括基于第一数据存储结构的数据查找过程:22、根据查询key查找key索引区段hash-index,若key索引区段hash-index存在查询key的key分片shard,则获取key分片shard内的item;23、根据所述item查找kv索引区段array-index,定位kv键值对在kv索引区段array-index的起始位置offset,通过当前偏移量和其后一个位置存储的起始位置offset的差值,得到kv数据区段kvs;24、解码kv数据区段kvs得到keysize区和shareheader区,根据sharedheader区的值判断当前key是否完整;25、若判断结果为是,则将当前key和查询key比较,如一致则返回value,如不一致则回退到根据查询key查找key索引区段hash-index,继续查找,直到当前key分片shard的元素不存在该查询key则返回;26、若判断结果为否,则查找当前key的公共前缀数据,将当前key的公共前缀数据和当前key的后缀数据拼接起来得到完整的key,将当前完整的key和查询key比较,如一致则返回value,如不一致则回退到根据查询key查找key索引区段hash-index,继续查找,直到当前key分片shard的元素不存在该查询key则返回。27、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法中,所述解码kv数据区段kvs得到keysize区和shareheader区,根据sharedheader区的值判断当前key是否完整包括:28、根据sharedheader区的值判断当前key为不包含公共前缀数据或者包含公共前缀数据且是第一个的情况时,则当前key为完整key;29、根据sharedheader区的值判断当前key为包含公共前缀数据且不是第一个的情况时,则进一步查找公共前缀数据;30、根据当前key的sharedpost区的值,得到其公共前缀数据所在的位置,然后得到公共前缀数据对应的kv键值对,通过具有公共前缀数据的kv键值对的sharedlen区得到公共前缀数据,和当前key的suffix区的后缀数据拼接起来得到完整的key。31、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法,包括第二数据存储结构,所述第二数据存储结构包括:32、头部标识区段header,用于写入代表文件编码方式的类型数据;33、kv数据块区段block,用于存储经过压缩后的多个kv键值对数据;34、kv数据块索引区段array-index(block),用于记录各个kv数据块区段block的起始位置信息。35、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法中,所述kv数据块区段block包括:36、max-key区,写入该kv数据块区段block中的最大key(max-key);37、header区,写入最大key(max-key)的长度;38、kv数据区段kvs,用于依序写入前缀压缩的kv键值对数据;39、kv索引区段array-index,记录各kv键值对在文件的起始位置offset,某一kv键值对的总长度通过该kv键值对的起始位置offset和后一个kv键值对的起始位置offset差值确定;40、key索引区段hash-index,用于记录key与kv键值对在整体文件中序号的对应索引关系;41、其中,所述kv数据区段kvs、kv索引区段array-index和key索引区段hash-index中的数据作为整体,压缩后存储在文件中。42、作为本发明的可选实施方式,本发明的一种多种类索引的数据存储方法,包括基于第二数据存储结构的数据查找过程:43、由kv数据块索引区段array-index(block)中获取到kv数据块区段block信息;44、根据kv数据块区段block获取max-key区的最大key(max-key)和header区的最大key(max-key)的长度;45、判断查询key是否大于最大key(max-key);46、若查询key大于最大key(max-key),则向后二分查找kv数据块区段block,若查询key小于最大key(max-key),则向前二分查找kv数据块区段block;47、直到定位查询key所在的kv数据块区段block,比上一个kv数据块区段block的最大key(max-key)大,比当前kv数据块区段block的最大key(max-key)小,则继续在当前kv数据块区段block内部查找;48、将当前kv数据块区段block进行解压缩,获取kv数据区段kvs、kv索引区段array-index和key索引区段hash-index的原始数据信息,所述查询key基于所述原始数据信息进行查询,有查询结果则返回value,没有查询结果则返回空。49、在第二方面,本发明提供一种多种类索引的数据存储装置,包括第一数据存储模块,所述第一数据存储模块包括:50、头部标识区段header,用于写入代表文件编码方式的类型数据;51、kv数据区段kvs,用于依序写入前缀压缩的kv键值对数据;52、kv索引区段array-index,记录各kv键值对在文件的起始位置offset,某一kv键值对的总长度通过该kv键值对的起始位置offset和后一个kv键值对的起始位置offset差值确定;53、key索引区段hash-index,用于记录key与kv键值对在整体文件中序号的对应索引关系。54、与现有技术相比,本发明的有益效果:55、本发明的第一数据存储结构,可以作为默认的写入格式,可胜任绝大部分场景,尤其是key-value数据量离散分布,文件整体数量在100g以内的场景,其cpu/memory/disk消耗都比较低,也更均衡。56、本发明的第二数据存储结构,由于采用kv数据块区段block的设计,用于存储经过压缩后的多个kv键值对数据,因此,比第一数据存储结构更省空间,但因为解码整个kv数据块区段block会多消耗cpu或者使用缓存来存储这部分解压后的数据会消耗多些内存,适用于数据量超过100g的场景,对disk是友好的。57、本发明针对不同的资源和不同kv分布时,使用到更匹配的存储方案:比较均衡的就选择第一数据存储结构;在此基础上如果文件超过100g往上,则考虑使用第二数据存储结构来进行数据压缩,减少文件的磁盘占用。这几种方案综合起来使用,通过版本号进行区分,可按照不同的解析格式解析该文件,扩展性更好。当前第1页12当前第1页12