存放Json数据的内存结构及其数据处理方法技术

技术编号:36845711 阅读:16 留言:0更新日期:2023-03-15 16:26
本发明专利技术提供了一种存放Json数据的内存结构及其数据处理方法,内存数据结构是一个分层的结构,每一层对应Json结构的一层,Json中的对象在内存数据结构中用带有并发控制机制的哈希表来实现,Json中的数组在内存数据结构中用带有并发控制机制的双向链表来实现,层与层之间的连接用内存指针实现,值用一个结构体来实现。本发明专利技术通过采用带有并发控制机制的哈希表和双向链表的内存数据结构,解决了读写单一Json结构中的值无法并发读写的问题,在多CPU或多核CPU的计算机上,可以显著提高Json结构数据的处理速度。数据的处理速度。数据的处理速度。

【技术实现步骤摘要】
存放Json数据的内存结构及其数据处理方法


[0001]本专利技术涉及数据处理
,具体地,涉及一种存放Json数据的内存结构及其数据处理方法。

技术介绍

[0002]现有的公用Json解析器解析出的Json数据结构不支持对象级的并发访问,Json结构体内部也没有索引机制。
[0003]专利文献CN105787128A(申请号:CN201610188809.0)公开了一种恢复Java序列化文件数据的方法,包括以下步骤:S1:分析并记录数据类型及结构的标识符;S2:定义中间结构用于存放各节点的数据类型名称、域名称及值;S3:获得最上层的中间结果,维护一个类定义ID列表;S4:展开中间结果,换为json字符串;S5:提取类的结构并生成类模版用于内存数据恢复;S6:恢复完整的序列化数据至内存中。然而这样去读写一个Json结构的时候,只能单线程处理,速度比较慢。
[0004]因此需要提供一种支持并发的,带索引结构的Json内存结构,可以并发的处理一个Json结构体内的多个对象,从而提高处理速度。

技术实现思路

[0005]针对现有技术中的缺陷,本专利技术的目的是提供一种存放Json数据的内存结构及其数据处理方法。
[0006]根据本专利技术提供的存放Json数据的内存结构,内存数据结构是一个分层的结构,每一层对应Json结构的一层,Json中的对象在内存数据结构中用带有并发控制机制的哈希表来实现,Json中的数组在内存数据结构中用带有并发控制机制的双向链表来实现,层与层之间的连接用内存指针实现,值用一个结构体来实现;
[0007]值结构体包括值类型、值和读写锁;
[0008]带并发控制机制的哈希表大小固定,至少支持读和写两种并发控制;
[0009]带并发控制机制的双向链表至少支持读和写两种并发控制;
[0010]键值对结构体包括键、指针和读写锁,当一个Json对象其中的键值对超过哈希表大小*装载因子,则增加一个完整的哈希表,新增的哈希表追加到原哈希表所在的双向链表的末尾;
[0011]不同的值类型,值存放方式不同:
[0012]字符串型:结构体中的值是一个指针,指向存放字符串的位置;
[0013]整型:如果在8字节64位的空间内保存该数字,则保存在这个结构体值的位置;如果在8字节内无法保存,则转化为大整型;
[0014]大整型:结构体中的值是一个指针,指向存放大整型的位置;
[0015]小数型:如果在8字节64位的空间内,以双精度浮点型保存该数字,则保存在这个结构体值的位置;如果在8字节内无法保存,就转化为长小数型;
[0016]长小数型:结构体中的值是一个指针,指向存放长小数型的位置;
[0017]对象:结构体中的值是一个指针,指向一个双向链表,这个双向链表的每一个节点都是一个哈希表;
[0018]数组:结构体中的值是一个指针,指向一个双向链表;
[0019]根节点是值结构体,在任何一个Json层当中包含有且只有一个值结构体内存数据结构层,对象、数组的内存数据结构上一层为值结构体。
[0020]根据本专利技术提供的并发读写内存数据结构的数据处理方法,包括:采用递归方式来读写内存数据,在递归中判断当前层和下一层的类型,若锁冲突,则等待持有者释放锁,在修改操作时,使用先删除再新建的方式实现;若在一个结构体上没有锁,则可加读锁或写锁;若在一个结构体上有读锁,则可再加读锁,但是不能再加写锁;若在一个结构体上有写锁,则不可再加读锁或写锁;结构体加锁只能从上层往下层加,解锁顺序是加锁顺序的逆序。
[0021]优选的,新增一个键值对时:
[0022]输入参数:
[0023]a)指向Json的内存数据结构的指针;
[0024]b)指向节点为哈希表的双向链表的指针,此键值对将保存到哈希表当中;
[0025]c)指向键值对结构体的指针;
[0026]操作步骤:
[0027]a)对指向Json的内存数据结构的指针设定为读锁;
[0028]b)对键值对结构体设定写锁;
[0029]c)对节点为哈希表的双向链表设定为写锁;
[0030]d)在双向链表的最后一个哈希表中设定为写锁;
[0031]e)检查双向链表的最后一个哈希表中的键值对是否超过哈希表大小*装载因子;
[0032]f)如果超过哈希表大小*装载因子,新建一个哈希表,并追加到双向链表的末尾,在新建的哈希表(此时新建哈希表是双向链表的最后一个哈希表)中设定写锁,并释放原哈希表的写锁;
[0033]g)计算键值对中键的哈希值,并按照哈希表的插入算法,将键值对的插入到哈希表中;
[0034]h)释放过程中,设定的所有读锁和写锁。
[0035]优选的,新增一个值时:
[0036]输入参数:
[0037]a)指向Json的内存数据结构的指针;
[0038]b)指向该值上一个内存数据结构节点的指针;
[0039]c)上一个内存数据结构节点的类型;
[0040]d)指向值结构体的指针;
[0041]操作步骤:
[0042]a)对指向Json的内存数据结构的指针设定为读锁;
[0043]b)将上一个内存数据结构节点设定为写锁;
[0044]c)如果上一个节点是节点为值结构体的双向链表,则在双向链表末尾增加一个节
点,并指向参数d)值结构体;
[0045]d)如果上一个节点是键值对,则修改键值对结构体的指针,指向参数d)值结构体;
[0046]e)释放过程中,设定的所有读锁和写锁。
[0047]优选的,新增一个空对象时:
[0048]输入参数:
[0049]a)指向Json的内存数据结构的指针;
[0050]b)指向该对象上一个内存数据结构节点的指针;
[0051]返回值:指向新增的节点为哈希表的双向链表的指针;
[0052]操作步骤:
[0053]a)对指向Json的内存数据结构的指针设定为读锁;
[0054]b)将上一个内存数据结构节点设定为写锁;
[0055]c)新建一个双向链表;
[0056]d)新建一个哈希表,并追加到双向链表;
[0057]e)释放过程中,设定的所有读锁和写锁。
[0058]优选的,新增一个空数组时:
[0059]输入参数:
[0060]a)指向Json的内存数据结构的指针;
[0061]b)指向该数组上一个内存数据结构节点的指针;
[0062]返回值:指向新增的节点为值结构体的双向链表的指针;
[0063]操作步骤:
[0064]a)对指向Json的内存数据结构的指针设定为读锁;
[0065]b)将上一个内存数据结构节点设定为写锁;
[0066]c)新建一个双向链表;
[0067]d)释放过程中本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种存放Json数据的内存结构,其特征在于,内存数据结构是一个分层的结构,每一层对应Json结构的一层,Json中的对象在内存数据结构中用带有并发控制机制的哈希表来实现,Json中的数组在内存数据结构中用带有并发控制机制的双向链表来实现,层与层之间的连接用内存指针实现,值用一个结构体来实现;值结构体包括值类型、值和读写锁;带并发控制机制的哈希表大小固定,至少支持读和写两种并发控制;带并发控制机制的双向链表至少支持读和写两种并发控制;键值对结构体包括键、指针和读写锁,当一个Json对象其中的键值对超过哈希表大小*装载因子,则增加一个完整的哈希表,新增的哈希表追加到原哈希表所在的双向链表的末尾;不同的值类型,值存放方式不同:字符串型:结构体中的值是一个指针,指向存放字符串的位置;整型:如果在8字节64位的空间内保存该数字,则保存在这个结构体值的位置;如果在8字节内无法保存,则转化为大整型;大整型:结构体中的值是一个指针,指向存放大整型的位置;小数型:如果在8字节64位的空间内,以双精度浮点型保存该数字,则保存在这个结构体值的位置;如果在8字节内无法保存,就转化为长小数型;长小数型:结构体中的值是一个指针,指向存放长小数型的位置;对象:结构体中的值是一个指针,指向一个双向链表,这个双向链表的每一个节点都是一个哈希表;数组:结构体中的值是一个指针,指向一个双向链表;根节点是值结构体,在任何一个Json层当中包含有且只有一个值结构体内存数据结构层,对象、数组的内存数据结构上一层为值结构体。2.一种并发读写内存数据结构的数据处理方法,其特征在于,采用权利要求1所述的存放Json数据的内存结构,包括:采用递归方式来读写内存数据,在递归中判断当前层和下一层的类型,若锁冲突,则等待持有者释放锁,在修改操作时,使用先删除再新建的方式实现;若在一个结构体上没有锁,则可加读锁或写锁;若在一个结构体上有读锁,则可再加读锁,但是不能再加写锁;若在一个结构体上有写锁,则不可再加读锁或写锁;结构体加锁只能从上层往下层加,解锁顺序是加锁顺序的逆序。3.根据权利要求2所述的并发读写内存数据结构的数据处理方法,其特征在于,新增一个键值对时:输入参数:a)指向Json的内存数据结构的指针;b)指向节点为哈希表的双向链表的指针,此键值对将保存到哈希表当中;c)指向键值对结构体的指针;操作步骤:a)对指向Json的内存数据结构的指针设定为读锁;b)对键值对结构体设定写锁;c)对节点为哈希表的双向链表设定为写锁;
d)在双向链表的最后一个哈希表中设定为写锁;e)检查双向链表的最后一个哈希表中的键值对是否超过哈希表大小*装载因子;f)如果超过哈希表大小*装载因子,新建一个哈希表,并追加到双向链表的末尾,在新建的哈希表(此时新建哈希表是双向链表的最后一个哈希表)中设定写锁,并释放原哈希表的写锁;g)计算键值对中键的哈希值,并按照哈希表的插入算法,将键值对的插入到哈希表中;h)释放过程中,设定的所有读锁和写锁。4.根据权利要求2所述的并发读写内存数据结构的数据处理方法,其特征在于,新增一个值时:输入参数:a)指向Json的内存数据结构的指针;b)指向该值上一个内存数据结构节点的指针;c)上一个内存数据结构节点的类型;d)指向值结构体的指针;操作步骤:a)对指向Json的内存数据结构的指针设定为读锁;b)将上一个内存数据结构节点设定为写锁;c)如果上一个节点是节点为值结构体的双向链表,则在双向链表末尾增加一个节点,并指向参数d)值结构体;d)如果上一个节点是键值对,则修改键值对结构体的指针,指向参数d)值结构体;e)释放过程中,设定的所有读锁和写锁。5.根据权利要求2所述的并发读写内存数据结构的数据处理方法,其特征在于,新增一个空对象时:输入参数:a)指向Json的内存数据结...

【专利技术属性】
技术研发人员:徐龙张柏根蔡晓华杨光辉
申请(专利权)人:上海天旦网络科技发展有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1