首页> 中国专利> 基于Java技术实现内存键值数据管理的方法及其装置

基于Java技术实现内存键值数据管理的方法及其装置

摘要

本发明公开了基于Java技术实现内存键值数据管理的方法及其装置。该基于Java技术实现内存键值数据管理的方法包括将应用的对象划分为临时性业务对象、以及长期性业务对象;针对所述临时性业务对象,在业务处理完成之后会立即释放,以使得所述临时性业务对象留在所述新生代区、并在释放时被Java虚拟机的垃圾回收机制快速回收;针对所述长期性业务对象,在数据存储内存区域中创建一个或多个基础内存、以及一个或多个扩展内存;其中,每个基础内存为一个对象,用于存放n条键值数据,其中n大于等于1;每个扩展内存为一个对象,用于存储所述键值数据中value的扩展数据。

著录项

  • 公开/公告号CN114840498A

    专利类型发明专利

  • 公开/公告日2022-08-02

    原文格式PDF

  • 申请/专利权人 北京优合融宜科技有限公司;

    申请/专利号CN202210781258.4

  • 发明设计人 李罡;周正茂;

    申请日2022-07-05

  • 分类号G06F16/21(2019.01);G06F16/22(2019.01);G06F3/06(2006.01);

  • 代理机构北京高文律师事务所 11359;

  • 代理人潘聪

  • 地址 100094 北京市海淀区唐家岭村南9幢平房1125号

  • 入库时间 2023-06-19 16:16:00

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-09-13

    授权

    发明专利权授予

  • 2022-08-19

    实质审查的生效 IPC(主分类):G06F16/21 专利申请号:2022107812584 申请日:20220705

    实质审查的生效

说明书

技术领域

本专利的实施例总体上涉及分布式内存数据管理领域,并且更具体地,涉及一种基于Java技术实现内存键值数据管理的方法、装置、计算机程序产品、以及计算机可读存储介质。

背景技术

高并发、低延时是业务支撑系统技术发展的核心需求之一,传统的技术架构受数据库访问瓶颈限制,很难同时满足不同业务量下的系统响应需求。因此,技术架构需要补充和调整,特别是通过缓存技术来解决数据库访问的并发和延迟问题。缓存技术出现的基础理论支撑是利用内存的IO高效特性,提升应用数据访问效率,其中最简单的是在每个应用服务中开辟一块内存,存放缓存的数据。

但是在一个分布式或者集群的环境中,应用服务会部署多套,如果每个服务的内存是不能共享的,则会导致大规模数据混乱,这就需要使用共享数据缓存技术。在共享数据缓存技术中,不论部署多少个访问数据的服务,都会去访问同一套内存缓存,而内存缓存能力根据业务需要去扩展,同时依赖独立的共享数据缓存技术来维持数据的一致性即可满足业务需要。

相应地,非关系型的数据库NoSQL技术应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到开发人员和运维管理人员的广泛青睐。而基于共享内存缓存数据的分布式中间件,可以在提高查询性能和提升并发能力两个维度上,对应用设计在架构上实现很好的补充。

在共享数据缓存的主流技术方面,通常会使用键值技术(key-value)来实现。键值技术(key-value)是NoSQL数据库普遍采用的数据管理技术,由于其对分布式体系的天然适配,且数据查询速度快、存放数据量大、支持高并发,因此非常适合作高速数据缓存来应用,便于通过主键进行查询。因此,键值技术(key-value)数据管理能力通常的应用场景是需要高性能,且相对固态的数据访问形式的应用,因此其被广泛应用于交互式系统中的交互环节。例如,在网站登录认证中,用于保存客户登录状态(key)和系统用户授权(value)的关系。又例如,在宽带认证系统中,用于保存接入端口(key)和用户IP、连接数(value)的关系等。可以说,在当今应用开发技术上,交互式应用系统都会用到缓存技术来提升并发能力和扩展能力,而绝大多数缓存技术都会用到键值技术(key-value)。

目前主流的键值型缓存产品例如为Redis,其作为一款全球开源的内存缓存产品,经过长达10年以上的技术发展,已经成为全球主流的内存缓存产品。使用缓存技术的全球应用系统中,70%以上都采用Redis,而从国内的应用系统发展来看,Redis同样具有无可替代的位置,目前接近90%以上的交互式应用系统都会采用Redis,其应用领域更是扩展到各个行业领域。Redis在全球推广时,也正是Java技术体系被广泛应用时,但Redis本身却采用了C语言技术来实现其核心能力,而且目前国内推出的一系列缓存技术也均采用C语言或者其它类C的编译型语言来实现。但是,选用C语言技术来实现缓存核心能力的产品,其兼容成本较高,导致在不同硬件环境中,不同操作系统平台上,都需要进行重复编译和回归测试,特别是诸多国产化环境适配问题。

而Java技术体系则有开发代码可靠、兼容移植能力强等特色,特别适合国产环境应用。但从目前来看,尚没有采用Java技术体系实现键值型(key-value)分布式数据缓存的产品,其核心问题在于,由于缓存的键值(key-value)数据量大,采用Java技术,在内存管理大量/海量键值(key-value)数据时,由于Java技术的面向对象体系,就会不断产生或处理大量对象,而高频、海量对象的变化会带动Java系统中垃圾回收(Garbage Collection,简称“GC”)的频繁发生,进而导致Java技术体系无法实现“不间断地满足实时、高并发”的响应要求,因此目前市场上出现的高效缓存类产品均没有用Java技术来实现键值型(key-value)数据缓存管理。

发明内容

本发明提供一种基于Java技术实现内存键值数据管理的方法、装置、计算机程序产品、以及计算机可读存储介质,以解决现有技术中的以上技术问题和其他潜在技术问题中的任一技术问题。

本发明的第一方面提供了一种基于Java技术实现内存键值数据管理的方法,包括:将应用的对象划分为临时性业务对象、以及长期性业务对象;其中,所述临时性业务对象是业务处理过程中临时产生的对象,所述临时性业务对象留在新生代区;所述长期性业务对象是业务处理过程中长期有效的对象,所述长期性业务对象留在旧生代区; 针对所述临时性业务对象,在业务处理完成之后会立即释放,以使得所述临时性业务对象留在所述新生代区、并在释放时被Java虚拟机的垃圾回收机制快速回收;针对所述长期性业务对象,在数据存储内存区域中创建一个或多个基础内存、以及一个或多个扩展内存;其中,每个基础内存为一个对象,用于存放n条键值数据,其中n大于等于1;每个扩展内存为一个对象,用于存储所述键值数据中value的扩展数据。

根据本发明的示例性实施例,每个基础内存包括占用第一内存空间的key索引、以及占用第二内存空间的n条键值数据。

根据本发明的示例性实施例,每个基础内存的起始部分为所述key索引,后续部分为所述n条键值数据。

根据本发明的示例性实施例,所述基础内存的类型为整型数组;所述key索引占用(3+1)n个整型数组空间。

根据本发明的示例性实施例,每条键值数据包括第一固定长度的key数据、第二固定长度的value数据、1个扩展value位置信息、以及1个扩展value长度信息。

根据本发明的示例性实施例,所述扩展内存在待处理的value的长度超过第二固定长度时创建,所述扩展内存用于存储value的扩展数据。

根据本发明的示例性实施例,每个扩展内存被分为一个或多个虚拟存储块,每个扩展内存的起始部分用于表示其内部的虚拟存储块的状态。

根据本发明的示例性实施例,所述扩展内存的类型为byte字节数组;所述虚拟存储块的状态包括以下各项中的至少一项:未分配、已分配、已删除但未回收。

根据本发明的示例性实施例,每个基础内存的大小不超过2G;每个虚拟存储块为4k,每个扩展内存中虚拟存储块的总大小不超过1G;所述虚拟存储块用0代表未分配,用1代表已分配,用2代表已删除但未回收。

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括缓存初始化步骤;所述缓存初始化步骤包括:根据所述基础内存中待存放的键值数据的数量n、保存key需要的大小k

根据本发明的示例性实施例,所述缓存初始化步骤还包括:在计算出的size大于2G时,将n减半,并将所述基础内存的总块数b加倍,然后重新计算直到满足所述size不超过2G为止,其中b的初始值为1;然后根据计算结果来创建b个大小为size的整型数组,从而完成基础内存的创建。

根据本发明的示例性实施例,所述缓存初始化步骤还包括:在待处理的value的长度超过v

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括创建数据步骤;所述创建数据步骤包括:在应用收到新的键值数据时,根据传入的key计算索引值hash;根据所计算的索引值hash来计算索引位置

根据本发明的示例性实施例,所述创建数据步骤还包括:在新的键值数据中value的长度超过v

根据本发明的示例性实施例,所述创建数据步骤还包括:计算新的键值数据中value的超出部分exp_len需要的扩展空间长度

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括查询数据步骤;所述查询数据步骤包括:在应用收到查找数据命令时,根据指定的key计算索引值hash;根据公式

根据本发明的示例性实施例,所述查询数据步骤还包括:在list_pos对应的value长度超过v

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括删除数据步骤;所述删除数据步骤包括:在应用收到删除数据命令时,根据指定的key计算索引值hash;根据公式

根据本发明的示例性实施例,所述删除数据步骤还包括:在list_pos对应的value长度超过v

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括更新数据步骤;所述更新数据步骤包括:在应用收到更新数据命令时,根据指定的key计算索引值hash;根据公式

根据本发明的示例性实施例,所述更新数据步骤还包括:在list_pos对应的已经存在的ext_value长度超过v

根据本发明的示例性实施例,针对所述临时性业务对象,每处理完10万次访问或者每隔60秒,通过调用System.gc()方法,主动触发Java虚拟机的垃圾回收机制,以主动回收释放的临时性业务对象。

本发明的第二方面提供了一种基于Java技术实现内存键值数据管理的装置,包括:处理器;存储器,耦合至所述处理器并且存储有指令,所述指令在由所述处理器执行时使所述处理器执行根据本发明的第一方面提供的基于Java技术实现内存键值数据管理的方法。

本发明的第三方面提供了一种计算机程序产品,被有形地存储在非瞬态计算机可读介质上并且包括计算机可读程序指令,当所述计算机可读程序指令在设备上被执行时使得所述设备执行根据本发明的第一方面提供的基于Java技术实现内存键值数据管理的方法。

本发明的第四方面提供了一种计算机可读存储介质,具有存储在其上的计算机可读程序指令,所述计算机可读程序指令用于执行根据本发明的第一方面提供的基于Java技术实现内存键值数据管理的方法。

附图说明

为了更清楚的说明本发明的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍,显而易见的,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为传统key-value数据缓存应用中业务数据的存在形式的示意图。

图2为本专利示例性实施例在旧生代中数据的存放管理形式的示意图。

图3为本专利示例性实施例中创建新数据时计算hash的部分示例性代码。

图4为本专利示例性实施例查询数据时寻找指定key在基础内存中的实际位置的部分示例性代码。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然所描述的实施例仅是本发明的一部分实施例,不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

Java是完全面向对象的技术,运行时数据均以对象形式存在,对象又被Java分为临时生成的对象和长期有效的对象两大类,其中临时对象存在于Java堆内存的新生代区,长期有效的对象存在于Java堆内存的旧生代区。当对象不再使用时,需要依靠Java的垃圾回收(GC)机制实现对象的回收和内存再利用,而Java的垃圾回收进行时,为了确保内存域的一致性,会暂停应用外部的响应,此时,垃圾回收(GC)机制的效率对应用系统的实时性有着至关重要的影响。垃圾回收(GC)又分为新生代回收(变量回收)和旧生代回收(全量回收),其中,新生代回收不做完整对象的全量处理,针对失效(或称为释放)对象实现非常迅速,不会对实时业务造成影响。但旧生代回收时,需要遍历全量对象,并逐一核查处理,相对新生代回收而言效率会受到严重影响(例如回收时间可能成几何倍数增长),因此会对实时性会造成较大影响,而此机制是Java技术的标准机制,无法通过技术调整更改。

图1为传统key-value数据缓存应用中业务数据的存在形式(示意图只描述了业务数据)。如图1所示,在键值(key-value)数据缓存技术的标准化处理中,由于缺少处理机制和算法的突破,无法区别使用新生代对象和旧生代对象,每个key和每个value均是一个对象。此时,如果有n条键值记录,则至少有2n个对象存在(key索引还会产生附加的对象)。参照Java技术的标准特点,这些对象均会保存在Java的旧生代区,因此,一旦key或value发生任何变化,就会引起旧生代对象变化。而随着缓存数据的高频响应和变化,必将导致频繁的全量GC,由于全量GC的时间和对象数量成正比,而作为缓存应用,数据量一般都比较巨大,因此参照标准Java技术体系实现的缓存管控,必然会导致大量变更的旧生代对象,进而频繁引发系统全量GC,这样以来,势必会对业务处理的实时性造成直接、明显、实质性的影响。

但是,通过Java技术实现键值(key-value)数据(例如海量键值)的高效、高可靠存储与管理存在诸多优势,例如兼容性更好、兼容成本低廉、后期技术能力完善及需求满足迭代效率高、使用维护成本低等。但如上所述,其实现亦存在如下技术难点:Java技术本身是面向对象的技术体系,按照Java标准的内存管理方式,每条键值(key-value)数据都是对象,而数据本身各种变化,都会导致对象的变化,例如新增、修改、删除等。而作为数据高速缓存应用的特点,就是各种数据的高频使用和高频变化,而对象的高频变化又会导致Java应用的虚拟机(JVM)依据运行机制,频繁启动系统垃圾回收(GC),进而影响业务的响应。

本专利的发明人发现,以上问题的核心技术难点就是如何解耦数据的高频变化与对象的高频变化的对应关系,即:需采用独立的内存分配管理技术在储存、管理键值(key-value)数据时,不再为每条数据单独创建对象,而是采用集中内存分配与管理,以便解决处理大量数据时必然产生大量对象的矛盾,进而解决数据变化带来大量对象变化的矛盾,使得Java语言能够实现键值(key-value)数据分布式存储系统以满足大并发、实时性的要求。

为解决以上核心技术难点,内存分配管理技术需要综合考虑数据应用的相关复杂场景问题,例如:(1)启动时,如何有效建立内存管控域,在系统初始化阶段,在创建数据键值时保持对象的静态化;(2)新增数据时,如何在静态对象域内部署数据,并实现多数据域的数据同步;(3)查找数据时,如何不依赖于对象查找技术,定位数据地址;(4)删除数据时,如何在静态对象域内清理数据,自主回收数据地址;(5)修改数据时,如何在静态对象域内更新数据;(6)针对Java的系统性GC,如何进行有效控制。

本发明的示例性实施例提供了一种基于Java技术(包括Java技术栈)实现内存键值数据管理的方法(也可以称为“基于Java技术实现内存键值数据管控的方法、基于Java技术实现内存键值数据存储的方法、或者基于Java技术实现内存键值数据缓存的方法”)。

该方法包括:将应用(例如交互式应用)的对象划分为临时性业务对象、以及长期性业务对象。作为示例,例如网站登录时接收用户登录session(即“会话”)和用户信息的临时性业务对象、以及需要长期保存的登录session与用户信息的对应关系及对应内容的长期性对象。

其中,所述临时性业务对象是业务处理过程中临时产生的对象,所述临时性业务对象留在新生代区;所述长期性业务对象是业务处理过程中长期有效的对象,所述长期性业务对象留在旧生代区。作为示例,业务例如是用户登录时根据输入的用户名、密码生成了session;然后查询到用户信息,并长期保存session和用户信息的对应关系和对应内容,以备后续查询验证用户身份。

针对所述临时性业务对象,在业务处理完成之后会立即释放,以使得所述临时性业务对象留(或称为“停留”)在所述新生代区、并在释放时被Java虚拟机的垃圾回收机制快速回收。

例如,临时性业务对象主要是数据处理和功能实现中需要的临时产生的对象。在使用这类对象时,应用在业务处理时方可创建,对应的业务功能处理完成后立即释放。此类对象不允许复用,如需使用,则再另行创建即可,确保此类对象留在新生代区,一旦释放会被迅速回收处理,杜绝全量回收处理。

针对所述长期性业务对象,在数据存储内存区域(比如服务器的应用内存区域)中创建一个或多个基础内存、以及一个或多个扩展内存;其中,每个基础内存为一个对象,用于存放n条键值数据,其中n大于等于1(可以理解,n为1个基础内存块中可存储的键值对的最大数量);每个扩展内存为一个对象,用于存储所述键值数据中value的扩展数据。

可以理解,与传统标准Java技术体系中将n条键值数据中的每个key和每个value都认为是对象(此时至少有2n个对象)的技术不同,本专利的示例性实施例中每个基础内存为一个对象,其用于存放n条键值数据。此时,n条键值数据会被Java技术(其包括JVM,即Java虚拟机)认为是一个对象,从而大幅度地减少了对象的数量(比传统算法的key-value类型数据存储对象少2n倍以上,在海量数据的情况下,经常达到1万倍以上),使得Java的旧生代垃圾回收过程大大加快(理论上快2n倍以上,在海量数据的情况下,经常达到1万倍倍以上),而不影响业务实时性。应用本专利示例性实施例中的技术之后,理论上旧生代垃圾回收速度是传统算法的2n分之一(在海量数据的情况下,经常达到万分之一)以内,能够解决旧生代垃圾回收影响业务实时性要求的难题。

根据本发明的示例性实施例,图2是本专利示例性实施例在旧生代中数据的存放管理形式的示意图。如图2所示,本专利示例性实施例将数据存储内存区域分为基础内存和扩展内存两部分,其中,基础内存在初始化时创建,用于存放键(key)的哈希(Hash)索引、键(key)数据和规范的value数据(即标准长度的value数据)。扩展内存用于存储value的扩展数据(如超长value数据、大量value数据的超出部分等),而这部分扩展内存可以根据实际需要来创建。

作为示例,长期有效的数据对象的处理原则是通过内存分配管理技术进行大区域对象的创建,支持将多个数据保存到同一个存储区内,并通过内存分配管理技术来支持区域内数据的各类管理能力(包括数据的增、删、改、查等操作),从而减少旧生代区的对象数量,以规避严重全量GC的发生。

由此可见,在本专利的示例性实施例中,为了利用Java技术来实现有实用价值的数据缓存功能,需要找到有效的控制全量GC的方法,充分利用Java技术中的新生代和旧生代回收机制区别,有效解决垃圾回收(GC)对业务处理实时性的影响。本专利的示例性实施例可以通过控制旧生代对象的数量和对象的变化,减少全量GC的出现,避免过度全量GC的产生,有效阻隔全量GC对业务实时性的影响。通过以上技术,本专利示例性实施例能够解耦数据的高频变化与对象的高频变化的对应关系,可以解决Java技术上大量数据必然产生大量对象,在数据缓存应用领域中,高频的数据变化必然带来高频对象变化这一技术难题。

根据本发明的示例性实施例,每个基础内存包括占用第一内存空间的key索引、以及占用第二内存空间的n条键值数据。作为示例,第一内存空间例如为空间大小为可保存n条键值数据的条目n的(3+1)倍的整型数组空间(可以理解,第一内存空间也可以是其他数值的整型数组空间)。比如,若存储1000条键值数据(n为1000),则第一内存空间可以为占用4000个整型数组空间。作为示例,若键(key)的长度为200字节,值(value)的最小长度是256字节,则每条键值数据占用空间通过(200+256)/4+1+1计算为116个整型数组空间,此时第二内存空间为空间大小为116n的整型数组空间。

根据本发明的示例性实施例,每个基础内存的起始部分为所述key索引,后续部分为所述n条键值数据。根据本发明的示例性实施例,所述基础内存的类型为整型数组;所述key索引占用(3+1)n个整型数组空间。根据本发明的示例性实施例,每条键值数据包括第一固定长度的key数据、第二固定长度的value数据、1个扩展value位置信息、以及1个扩展value长度信息。作为示例,第一固定长度例如为200字节,其实际占用50个基础内存的整型数组空间;第二固定长度例如为256字节,其实际占用64个基础内存的整型数组空间。

根据本发明的示例性实施例,所述扩展内存在待处理的value的长度超过第二固定长度时创建,所述扩展内存用于存储value的扩展数据。根据本发明的示例性实施例,每个扩展内存被分为一个或多个虚拟存储块,每个扩展内存的起始部分用于表示其内部的虚拟存储块的状态。根据本发明的示例性实施例,所述扩展内存的类型为byte字节数组;所述虚拟存储块的状态包括以下各项中的至少一项:未分配、已分配、已删除但未回收。 根据本发明的示例性实施例,每个基础内存的大小不超过2G;每个虚拟存储块为4k,每个扩展内存中虚拟存储块的总大小不超过1G;所述虚拟存储块用0代表未分配,用1代表已分配,用2代表已删除但未回收。

此外,本专利示例性实施例还可以通过内存分配管理技术的应用,实现从缓存初始化、到键值(key-value)业务数据的创建、查询、删除、更新等全生命周期过程的对象有效管控,从实用性角度、更优化地实现了本专利中Java技术体系下对数据对象的完整控制,举例说明如下。

根据本发明的示例性实施例,在管理所述键值数据时,本专利中基于Java技术实现内存键值数据管理的方法包括缓存初始化步骤。例如,缓存初始化的主要功能是完成基础内存的创建,这是因为,基础内存是必须创建的内存区。

所述缓存初始化步骤包括:根据所述基础内存中待存放的键值数据的数量n、保存key需要的大小ksize,保存value需要的最大值vmax和最小值v

例如,在本专利的实施例中,在初始化阶段,可以调用createDB方法创建基础内存。也即,createDB根据输入参数得到创建的记录数n,保存key需要的大小k

根据本发明的示例性实施例,所述缓存初始化步骤还包括:在计算出的size大于2G时,将n减半,并将所述基础内存的总块数b加倍,然后重新计算直到满足所述size不超过2G为止,其中b的初始值为1;然后根据计算结果来创建b个大小为size的整型数组,从而完成基础内存的创建。

例如,如果计算出来的size大于2G,则将n减半,将基础内存总块数b加倍(b的初始值为1),然后重新计算,直到满足上述size大小的要求。然后根据计算结果来创建b个大小为size的整型数组A(也可以称为基础内存或者基础内存块,用符号A来表示),从而完成基础内存的创建。上述创建的每个基础内存块A存放n条key-value数据,基础内存块A的起始部分索引占用(3+1)n个整型数组空间,后续空间存储key-value数据,每条key-value数据包括固定长度的key数据、固定长度的value数据、1个扩展value位置信息、1个扩展value长度信息。

根据本发明的示例性实施例,所述缓存初始化步骤还包括:在待处理的value的长度超过v

例如,扩展内存可以按需创建,当处理的value的长度超过v

可以理解,本专利示例性实施例中通过缓存初始化步骤可以有效建立内存管控域,在系统初始化阶段(启动时),在创建数据键值时,由于每个基础内存为一个对象(其用于存放n条键值数据),因此可以保持对象的静态化,系统会将其整体作为一个对象来对待,从而避免了频繁GC。

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括创建数据步骤;所述创建数据步骤包括:在应用收到新的键值数据时,根据传入的key计算索引值hash;根据所计算的索引值hash来计算索引位置

例如,当应用收到新key-value数据时,调用set(key, value)方法来创建新key-value数据。set方法首先根据传入的key计算索引值hash,计算hash的部分示例性代码如图3所示(应理解的是,本发明示例性实施例中计算hash的代码并不限于图3示例中的特定算法或代码,还可以利用其他可行的算法或代码)。

作为示例,本专利示例性实施例可以根据上述计算的hash值来计算索引位置

根据本发明的示例性实施例,所述创建数据步骤还包括:在新的键值数据中value的长度超过v

例如,本发明的示例性实施例中,可以判断value长度,如果长度超过v

可以理解,本专利示例性实施例中通过创建数据步骤,由于每个基础内存为一个对象(其用于存放n条键值数据),因此可以在新增数据时,在静态对象域内快速部署数据,并实现多数据域的数据同步。

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括查询数据步骤;所述查询数据步骤包括:在应用收到查找数据命令时,根据指定的key计算索引值hash;根据公式

例如,当应用收到查找数据命令时,调用get(key)方法查找并返回指定key对应的value值。get方法首先采用存储新数据(即创建新数据)时相同的算法计算指定key的索引值hash,然后根据公式

根据本发明的示例性实施例,所述查询数据步骤还包括:在list_pos对应的value长度超过v

作为示例,本发明的示例性实施例中,可以判断list_pos对应的value值长度是否超过v

可以理解,本专利示例性实施例中通过查询数据步骤,由于每个基础内存为一个对象(其用于存放n条键值数据),可以不依赖于传统Java中自带的对象查找技术,快速地定位数据地址。

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括删除数据步骤;所述删除数据步骤包括:在应用收到删除数据命令时,根据指定的key计算索引值hash;根据公式

作为示例,本发明的示例性实施例中,当应用收到删除数据命令时,调用del(key)方法,首先根据新增数据(即创建新数据)时使用的算法计算hash值,计算key的索引位置

根据本发明的示例性实施例,所述删除数据步骤还包括:在list_pos对应的value长度超过v

作为示例,本发明的示例性实施例中,可以根据查询到的list_pos判断value长度是否大于v

作为示例,完成扩展内存清理后,还可以将基础内存A中list_tail对应的记录复制到list_pos位置并执行list_tail = list_tail+1;在复制的同时,可以按照存储新数据(即创建新数据)的算法来更新复制的数据的key索引。在删除list_pos数据后,可以保持列表从list_head到list_tail之间均为完整有效的数据。

可以理解,本专利示例性实施例中通过删除数据步骤,由于每个基础内存为一个对象(其用于存放n条键值数据),因此在删除数据时,可以在静态对象域内清理数据,并自主回收数据地址。

根据本发明的示例性实施例,在管理所述键值数据时,所述方法包括更新数据步骤;所述更新数据步骤包括:在应用收到更新数据命令时,根据指定的key计算索引值hash;根据公式

作为示例,当应用收到更新已有数据的请求时,可以调用update(key, value)方法,首先计算key的索引位置

根据本发明的示例性实施例,所述更新数据步骤还包括:在list_pos对应的已经存在的ext_value长度超过v

作为示例,在本发明的示例性实施例中,可以根据查询到的list_pos判断已经存在的ext_value的长度是否大于v

可以理解,本专利示例性实施例中通过更新数据步骤,由于每个基础内存为一个对象(其用于存放n条键值数据),因此可以在修改数据时,在静态对象域内更新数据。

综上所述,通过本专利以上各示例性实施例,可以针对缓存数据的全生命周期进行有效管控,并能够解耦数据的高频变化与对象的高频变化的对应关系,通过控制旧生代对象的数量和对象的变化,减少全量GC的出现,避免过度全量GC的产生,有效阻隔全量GC对业务实时性的影响。

在本专利示例性实施例中,由于Java技术体系的全对象特性,会产生临时性变量对象,因此作为优选实施例,需要考虑新生代回收(变量回收)对缓存应用实时性业务响应是否存在不确定性影响,并对其进行有效控制。

为了避免由于应用便捷性考虑,临时性变量对象被重复利用,转入Java旧生代区,带来旧生代回收的不确定性,在本专利的优选实施例中,当收到请求时(如:存储新数据、查询数据、删除数据等),请求的key或value将以对象形式存在,当处理完成后(如:完成数据存储、数据查询成功后、删除数据成功后),这些对象将立即释放,因此这些对象将始终留在Java的新生代区并被GC快速回收。

根据本发明的示例性实施例,针对所述临时性业务对象,每处理完10万次访问或者每隔60秒,通过调用System.gc()方法,主动触发Java虚拟机的垃圾回收机制,以主动回收释放的临时性业务对象。

例如,实际应用启动后每处理完10万次访问,或者隔60秒,可以通过调用System.gc()方法,主动触发一次垃圾回收请求,从而有效避免由于垃圾对象堆积造成新生代垃圾过多、影响单次回收速度。

可以理解,由于Java技术的面向对象特性,会导致海量键值(key-value)数据映射为海量对象,数据的高频使用和高频变化将导致Java对象的高频变化,进而引发频繁且不可控GC,从而影响业务响应的实时性问题,这是Java标准技术无法解决的难题。为解决以上难题,本专利的示例性实施例通过解耦海量数据与Java对象的映射关系、以及有效的内存管控算法,取得了技术突破,实现了Java技术应用于分布式高实时数据管理的目标,以及针对键值(key-value)型数据的有效管控。

本专利示例性实施例中通过有效控制数据对象的数量和对象的变化,能够避免Java技术的标准机制对于实现海量数据管理、实时响应要求的应用的技术干扰,同时又可以充分利用Java技术本身的诸多优势特性。本专利示例性实施例中实现的数据缓存类产品,可以有效控制数据对象的数量和变化(比传统算法的key-value类型数据存储对象少2n倍以上,在海量数据的情况下,经常达到1万倍以上),使得Java的旧生代垃圾回收过程大大加快(理论上快2n倍以上,在海量数据的情况下,经常达到1万倍倍以上),而不影响业务实时性。本专利示例性实施例中实际存储的大量数据将保存在同一个对象中,使旧生代中对象数量大大减少(相比传统算法,可减少2n倍以上,在海量数据的情况下,经常达到1万倍以上)。应用本专利示例性实施例中的技术之后,理论上旧生代垃圾回收速度是传统算法的2n分之一(在海量数据的情况下,经常达到万分之一)以内,能够解决旧生代垃圾回收影响业务实时性要求的难题。

本发明的示例性实施例还提供了一种基于Java技术实现内存键值数据管理的装置,包括:处理器;存储器,耦合至所述处理器并且存储有指令,所述指令在由所述处理器执行时使所述处理器执行根据本发明以上示例性实施例提供的基于Java技术实现内存键值数据管理的方法。

本发明的示例性实施例还提供了一种计算机程序产品,被有形地存储在非瞬态计算机可读介质上并且包括计算机可读程序指令,当所述计算机可读程序指令在设备上被执行时使得所述设备执行根据本发明以上示例性实施例提供的基于Java技术实现内存键值数据管理的方法。

本发明的示例性实施例还提供了一种计算机可读存储介质,具有存储在其上的计算机可读程序指令,所述计算机可读程序指令用于执行根据本发明以上示例性实施例提供的基于Java技术实现内存键值数据管理的方法。

可以理解,本专利中使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”。其他术语的相关定义将在下文描述中给出。

可以理解,本专利中所描述的方法和功能可以至少部分地由一个或多个硬件逻辑组件来执行。例如但不限于,可以使用的硬件逻辑组件的示意性类型包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑器件(CPLD)等。

可以理解,计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其它自由传播的电磁波、通过波导或其它传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

这里参照根据本专利实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本专利的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其它设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本专利的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

此外,虽然采用特定次序描绘了各操作,但是这应当理解为要求这样操作以所示出的特定次序或以顺序次序执行,或者要求所有图示的操作应被执行以取得期望的结果。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本专利的范围的限制。在单独的实现的上下文中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明还可以通过其他结构来实现,本发明的特征并不局限于上述较佳的实施例。任何熟悉该项技术的人员在本发明的技术领域内,可轻易想到的变化或修饰,都应涵盖在本发明的专利保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号