一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于Redis协议的高效KV编码存储方法与流程

2022-08-30 23:17:39 来源:中国专利 TAG:

基于redis协议的高效kv编码存储方法
技术领域
1.本协议涉及nosql存储领域,具体而言,涉及基于redis协议的高效kv编码存储方法。


背景技术:

2.redis是一种非常流行的nosql协议,适合解决一些不适合用传统关系数据库解决的问题。redis作为内存数据库,所有的数据全部都存在内存中,特别适合处理少量的热数据,但当有巨量数据超过内存大小时,就需要落盘保存,这时候就需要使用redis kv存储的方案,如rocksdb。
3.redis与kv存储的融合方案中,编解码是一个很重要的环节。标准的redis协议在管理hash,list,set,sorted set等复杂类型的数据对象时,是将数据对象的meta和field分别进行编码,编码的逻辑结构如图1所示(不同业务场景下field的编码字段会有一些区别)。比如对于list类型数据对象,需要一个kv对(meta_key,meta_value)来存储其整个key的元信息(比如list的成员个数,过期时间等),另一个kv对(field_key,field_value)来保存成员的名称和值,对于sorted set这样的数据对象,由于存在score和rank两个属性,甚至需要一个kv对保存整个key的元信息,一个kv对保存score信息,还需要一个kv保存每个成员对应rank信息。
4.这种方式存在如下缺点:
5.(1)当对象成员的个数为1的时候,相对于set/get命令,该数据类型多了1次i/o,首先它必须获取metakey来判断这个成员是否已经过期,没有则继续获取这个key对应的value。
6.(2)当对象成员的个数为n的时候,要查找一个范围内的成员,需要n 1次i/o。
7.(3)对每一个成员的更新需要2次i/o,一个是更新成员的值,另外一个更新它的成员个数的meta信息。
8.(4)增多了key的数量,加重了落盘kv的compaction的负担。
9.此外,由于文件系统进行磁盘i/o操作时是以操作系统块为基本单位,且落盘的写入操作是随机的,所以采用上述编码方案时,一个数据对象的多个field进行落盘操作后会散落在不同的数据块中,导致读取再读取这个数据对象时的i/o效率被大大降低。


技术实现要素:

10.鉴于以上所述现有技术的缺点,本发明提供一种基于redis协议的高效kv编码存储方法,其特征在于,包括:将数据对象的所有key元信息存入对象键的步骤;将所述数据对象的描述性信息,所述数据对象中各field的键,以及所述数据对象中各field的值均存入对象值的步骤。
11.优选地,上述基于redis协议的高效kv编码存储方法中,所述对象值按固定长度对齐成块进行编码,每个所述块的块头存储所述数据对象值的描述性信息,每个所述块的其
余部分存储所述field的键和值。
12.优选地,上述基于redis协议的高效kv编码存储方法中,所述块的固定长度为操作系统块的整数倍。
13.优选地,上述基于redis协议的高效kv编码存储方法中,所述块的块头存储所述数据对象的field成员的总数、所述数据对象的生命周期和所述块中保存的field的个数。
14.优选地,上述基于redis协议的高效kv编码存储方法中,在每个所述块的尾部用2个字节记录field键的长度;2字节记录field值的长度。
15.优选地,上述基于redis协议的高效kv编码存储方法中,所述块的块头还存储下个块的索引信息。
16.优选地,上述基于redis协议的高效kv编码存储方法中,所述块的块头还包括保留字段。
17.优选地,上述基于redis协议的高效kv编码存储方法中,所述保留字段后紧接着用2个字节记录field键的长度,随后面直接保存field键的字符串,所述field键字符串后再用2字节记录field值的长度,随后直接保存field值。
附图说明
18.图1是现有基于redis的kv编码的逻辑结构图;
19.图2是本发明一种实施方式的objvalue逻辑结构图;
20.图3是本发明第二种实施方式的objvalue逻辑结构图。
具体实施方式
21.以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
22.本发明编码方案的核心是单一的kv编码,首先介绍第一种实施方式:包括设置数据对象键objkey的步骤,它对应之前的metakey,主要记录数据对象的所有key的元信息,包括所在分布式集群的slot、对象名称(object name,也即raw_key)等信息。
23.实例例一的编码方案还包括将meta_value、field_key和field_value合并为对象值objvalue的步骤。objvalue按固定长度对齐成块进行编码,这个固定的长度根据文件系统进行磁盘i/o操作时数据块大小进行选择,一般选择操作系统块的整数倍。针对目前常用的磁盘文件系统,本实施例中该固定长度定为4kb。根据redis协议推荐的标准,value的值不超过512mb,那么可以编码的objvalue块就会有131072个。
24.每个块的块头记录数据对象的大小、生命周期等描述性信息(value的描述性信息)。本例中,块头采用定长32byte,具体记录了如下信息:
25.字段长度(byte)说明obj_size8该结构体当前大小,即field成员的总数ttl8该对象的生命周期field_size8该block中保存的field的个数
rsd8保留字段
26.块的剩余空间用来存储field的值,因为每个field_key和field_value是变长的,在插入到块中时,在尾部分别使用2个字节来记录field_key和field_value的长度(该方案目的是针对小key的场景,所以2个byte可以记录的最大长度为65536),这样通过数学运算就可以获取指定的field。块内的操作是首尾指针,当首尾指针相遇时表示空间满当收尾相遇时表示该块空间已满。实施例一的objvalue块逻辑结构如图2所示。
27.本发明还提供第二实施方式:实施例二中objvalue也按固定长度对齐成块进行编码,与实施例一的区别在于:每个块的块头不但记录数据对象的大小、生命周期,还记录了下个块的索引信息。块的保留字段(rsd)后,紧接着用2个字节记录field键(field_key)的长度,后面直接保存field_key的字符串,field_key字符串后再用2字节记录field值(field_value)的长度,后面直接保存field_value的值。实施例二的objvalue块逻辑结构如图3所示。与实施例一相比,实施例二的优势在于在数据对象的field数量、种类发生改变的场景下,能大大提高存储效率——只需要针对变化的field重新分配块进行存储,然后更新原块中下个块的信息即可。
28.采用上述的编码方式,首先是减少了i/o的次数,因为对单个数据对象的操作,通过一次i/o操作即可获取该对象的meta和field成员的信息,完成读、写和局部查找。其次是减少key的编码个数,相当于压缩了对field的编码,而且在落盘的kv存储系统里面,减少了key就减小了compaction的压力,节省了计算资源。此外,文件系统进行磁盘i/o操作时是以数据块为基本单位,按本发明的编码方式,objvalue的信息更容易在磁盘上连续存储,同样也提高了读写效率。因此本发明解决了现有技术中i/o次数过多、落盘存储不连续等问题,而且大大节省了计算资源,从而具有较高的产业利用价值。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献