基于Java的堆外跳表结构存储方法、装置、设备及介质与流程

文档序号:37166545发布日期:2024-03-01 12:07阅读:13来源:国知局
基于Java的堆外跳表结构存储方法、装置、设备及介质与流程

本发明涉及计算机软件,具体涉及一种基于java的堆外跳表结构存储方法、装置、设备及介质。


背景技术:

1、跳表(skiplist,简称skl)是一种非常常用的有序键值对(key-value,简称kv)存储的数据结构,在诸多数据库实现中都有使用,是一个非常重要的高效读取的数据结构。

2、在常见的编程语言提供的默认数据结构库中,几乎都有提供skl的数据结构,而不同编程语言的默认库中所提供的skl都有着不同优缺点,大多是来自于语言本身的优缺点。

3、其中java原生的skl的实现是concurrentskiplistmap类,存在以下两个问题:

4、1.和其它java提供的集合类型一样,为了通用性而采用范型实现的,首先每一个写入的键值对都各是一个对象,其次每一个键值对都会再被封装成一个node或index对象,如果键值对是基本数据类型时,在键值对对象装箱拆箱的过程中就会有一定的性能损失,类似的例如arraylist就拥有基于基本类型实现的优化:intarraylist,其去掉了integer类的装箱而直接使用int基本类型。

5、2.java原生的集合类型的元素都是一个java对象,对象都是存放于堆内内存中,当在数据量庞大且有频繁写入和修改操作的场景下时,会经常面临gc问题,如果concurrentskiplistmap存入大量数据且有频繁修改,就会因为gc问题间接影响java程序中其它使用堆内内存的功能,所以concurrentskiplistmap不适合作为大数据量、高频修改的数据存储。


技术实现思路

1、针对现有技术中的技术缺陷,本发明实施例的目的在于提供一种基于java的堆外跳表结构存储方法、装置、设备及介质,以解决背景技术中所提出的技术问题。

2、为实现上述目的,第一方面,本发明实施例提供了一种基于java的堆外跳表结构存储方法,包括:

3、接收用户传入的序列化后的键值对;

4、通过跳表将所述序列化后的键值对封装为键值对对象,并将所述键值对对象存储在堆外存储空间中;

5、通过跳表根据所述键值对对象的哈希值创建节点;

6、将所述节点插入到所述跳表的索引结构中,其中,所述索引结构中包含多个节点,所述节点存储在堆内内存中;

7、接收用户发起的读请求,根据所述读请求携带的查找条件在所述索引结构中查找出与所述查找条件最接近的结果;

8、待所述用户确认所述结果后,取出所述结果的节点,根据用户自定义的反序列化接口将与所述节点对应的所述键值对对象从所述堆外存储空间中取回并反序列化完成后返回给用户。

9、进一步,所述堆外存储空间为堆外内存。

10、进一步,将所述节点采用二分法插入到所述跳表的索引结构中。

11、进一步,通过二分查找在所述索引结构中查找出与所述查找条件最接近的结果。

12、第二方面,本发明实施例还提供了一种基于java的堆外跳表结构存储装置,包括:

13、键值对接收模块,用于接收用户传入的序列化后的键值对;

14、键值对封装模块,用于通过跳表将所述序列化后的键值对封装为键值对对象,并将所述键值对对象存储在堆外存储空间中;

15、节点创建模块,用于通过跳表根据所述键值对对象的哈希值创建节点;

16、节点插入模块,用于将所述节点插入到所述跳表的索引结构中,其中,所述索引结构中包含多个节点,所述节点存储在堆内内存中;

17、请求接收模块,用于接收用户发起的读请求,根据所述读请求携带的查找条件在所述索引结构中查找出与所述查找条件最接近的结果;

18、数据返回模块,用于待所述用户确认所述结果后,取出所述结果的节点,根据用户自定义的反序列化接口将与所述节点对应的所述键值对对象从所述堆外存储空间中取回并反序列化完成后返回给用户。

19、进一步,所述堆外存储空间为堆外内存。

20、进一步,所述节点插入模块将所述节点采用二分法插入到所述跳表的索引结构中。

21、进一步,所述请求接收模块通过二分查找在所述索引结构中查找出与所述查找条件最接近的结果。

22、第三方面,本发明实施例还提供了一种电子设备,包括处理器、输入设备、输出设备和存储器,所述处理器、输入设备、输出设备和存储器相互连接,其中,所述存储器用于存储计算机程序,所述计算机程序包括程序指令,所述处理器被配置用于调用所述程序指令,执行如第一方面所述的方法。

23、第四方面,本发明实施例还提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时使所述处理器执行如第一方面所述的方法。

24、实施本发明实施例提供的方法,具有以下优点:

25、1、将大数据量的skl存储内存与java堆内存隔离,避免了对其它使用堆内内存部分的影响以及对gc的影响。

26、2、将数据统一采用字节的方式存储,同时提供序列化和反序列化接口由调用者实现,避免了频繁装箱拆箱带来的性能损失。

27、3、在查询操作中全程直接操纵堆外内存,直到最后查询到结果后返回给调用者进行反序列化时才复制到堆内,避免频繁的内存复制导致性能损失。

28、4、堆外内存的使用提供一个监控器来保证内存不会泄漏并提供内存用量统计。

29、5、反序列化提供spi由调用者实现,增加了序列化的拓展性。



技术特征:

1.一种基于java的堆外跳表结构存储方法,其特征在于,包括:

2.如权利要求1所述的一种基于java的堆外跳表结构存储方法,其特征在于,所述堆外存储空间为堆外内存。

3.如权利要求1所述的一种基于java的堆外跳表结构存储方法,其特征在于,将所述节点采用二分法插入到所述跳表的索引结构中。

4.如权利要求1所述的一种基于java的堆外跳表结构存储方法,其特征在于,通过二分查找在所述索引结构中查找出与所述查找条件最接近的结果。

5.一种基于java的堆外跳表结构存储装置,其特征在于,包括:

6.如权利要求5所述的一种基于java的堆外跳表结构存储装置,其特征在于,所述堆外存储空间为堆外内存。

7.如权利要求5所述的一种基于java的堆外跳表结构存储装置,其特征在于,所述节点插入模块将所述节点采用二分法插入到所述跳表的索引结构中。

8.如权利要求5所述的一种基于java的堆外跳表结构存储装置,其特征在于,所述请求接收模块通过二分查找在所述索引结构中查找出与所述查找条件最接近的结果。

9.一种电子设备,其特征在于,包括处理器、输入设备、输出设备和存储器,所述处理器、输入设备、输出设备和存储器相互连接,其中,所述存储器用于存储计算机程序,所述计算机程序包括程序指令,所述处理器被配置用于调用所述程序指令,执行如权利要求1-4任一项所述的方法。

10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时使所述处理器执行如权利要求1-4任一项所述的方法。


技术总结
本发明实施例公开了基于Java的堆外跳表结构存储方法、装置、设备及介质,方法包括:接收用户传入的序列化后的键值对;通过跳表将所述序列化后的键值对封装为键值对对象,并将所述键值对对象存储在堆外存储空间中;通过跳表根据所述键值对对象的哈希值创建节点;将所述节点插入到所述跳表的索引结构中,其中,所述索引结构中包含多个节点,所述节点存储在堆内内存中;接收用户发起的读请求,根据所述读请求携带的查找条件在所述索引结构中查找出与所述查找条件最接近的结果;待所述用户确认所述结果后,取出所述结果的节点,根据用户自定义的反序列化接口将与所述节点对应的所述键值对对象从所述堆外存储空间中取回并反序列化完成后返回给用户。

技术研发人员:张晨,周研,杨蕾红,吴菁,李祁烨
受保护的技术使用者:浙江创邻科技有限公司
技术研发日:
技术公布日:2024/2/29
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1