CN117251120A - 基于jvm堆外内存的对账系统优化方法、装置、设备及介质 - Google Patents
基于jvm堆外内存的对账系统优化方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN117251120A CN117251120A CN202311533727.1A CN202311533727A CN117251120A CN 117251120 A CN117251120 A CN 117251120A CN 202311533727 A CN202311533727 A CN 202311533727A CN 117251120 A CN117251120 A CN 117251120A
- Authority
- CN
- China
- Prior art keywords
- data
- checking
- memory
- reconciliation
- heap
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 63
- 238000005457 optimization Methods 0.000 title claims description 13
- 238000003860 storage Methods 0.000 claims abstract description 147
- 238000012432 intermediate storage Methods 0.000 claims abstract description 53
- 230000008569 process Effects 0.000 claims abstract description 30
- 238000013507 mapping Methods 0.000 claims abstract description 15
- 238000013500 data storage Methods 0.000 claims abstract description 10
- 238000006243 chemical reaction Methods 0.000 claims abstract description 9
- 238000011084 recovery Methods 0.000 claims description 21
- 230000002159 abnormal effect Effects 0.000 claims description 12
- 238000003491 array Methods 0.000 claims description 9
- 238000007726 management method Methods 0.000 claims description 8
- 230000007246 mechanism Effects 0.000 claims description 8
- 238000009826 distribution Methods 0.000 claims description 6
- 230000009466 transformation Effects 0.000 claims description 6
- 238000012217 deletion Methods 0.000 claims description 5
- 230000037430 deletion Effects 0.000 claims description 5
- 230000004044 response Effects 0.000 claims description 4
- 238000001914 filtration Methods 0.000 claims description 3
- 238000000638 solvent extraction Methods 0.000 claims description 3
- 230000000977 initiatory effect Effects 0.000 claims description 2
- 230000007704 transition Effects 0.000 claims 1
- 238000010586 diagram Methods 0.000 description 8
- 238000012545 processing Methods 0.000 description 7
- 230000006870 function Effects 0.000 description 6
- 230000005540 biological transmission Effects 0.000 description 4
- 239000012855 volatile organic compound Substances 0.000 description 4
- 238000009825 accumulation Methods 0.000 description 2
- 230000002776 aggregation Effects 0.000 description 2
- 238000004220 aggregation Methods 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 239000003550 marker Substances 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 241000508269 Psidium Species 0.000 description 1
- 230000005856 abnormality Effects 0.000 description 1
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 230000032683 aging Effects 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000009530 blood pressure measurement Methods 0.000 description 1
- 238000013499 data model Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000005484 gravity Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000007619 statistical method Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 239000000725 suspension Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0608—Saving storage space on storage systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
- G06F12/0615—Address space extension
- G06F12/063—Address space extension for I/O modules, e.g. memory mapped I/O
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0656—Data buffering arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0662—Virtualisation aspects
- G06F3/0665—Virtualisation aspects at area level, e.g. provisioning of virtual or logical volumes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于jvm堆外内存的对账系统优化方法、装置、设备及介质,包括响应于对账请求生成对账任务并从本地数据库获取对账数据;基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对中间存储模块进行调用;将获取到的对账数据输入中间存储模块并进行存取操作,将对账数据转换成以缓存形式下的临时存储数据;将临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩临时存储数据所占用的内存容量从而优化数据存储空间,基于构建的中间存储模块,能有效的避免IO的网络操作,同时在不改变本地机器JVM堆内存大小设置的前提下,利用堆外内存作为存储,对GC不产生影响。
Description
技术领域
本发明涉及对账技术领域,尤其涉及一种基于jvm堆外内存的对账系统优化方法、装置、设备及介质。
背景技术
堆外内存是指内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理,而不是虚拟机,这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。
在对账业务系统中,通常是通过把账单数据标准化处理,用统一的数据模型来进行对账处理,账单数据往往存储在db或其他的存储中,对账过程中从存储中获取数据进行对账,在这期间都需要IO通信传输,在数据量大的情况下,IO的传输对系统的影响会加剧,会影响系统的系统,成功提升系统性能的瓶颈;如果数据都保存在内容中,按现在大数据的体量,内存不足以承载现在的数据量,通过提升物理机器的内存来处理,对整体系统来说,其性价比不高,现在也有成熟的三方存储来存储数据,但是在大数据量场景下,频繁的进行存取操作的过程中,IO的影响也会被逐渐放大,也会影响整体系统的性能,尤其是在网络不稳定的情况下,性能会尤其凸显。并且大数据量在内存中存储操作,会导致频繁的GC问题会成为系统的一个瓶颈点,影响系统响应速度,GC处理线程的CPU使用率也会影响系统吞吐量。
发明内容
本发明的目的是提供一种基于jvm堆外内存的对账系统优化方法、装置、设备及介质,解决CPU性能低下及IO的网络开销,基于jvm堆外内存构建了一个中间存储模块,能有效的避免IO的网络操作,同时在不改变本地机器JVM堆内存大小设置的前提下,利用堆外内存作为存储,对GC不产生影响。
本发明提供了一种基于jvm堆外内存的对账系统优化方法,包括:
响应于对账请求生成对账任务并从本地数据库获取对账数据,所述对账数据为与对账请求订单关联流水数据;
在应用程序启动的情况下,基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对所述中间存储模块进行调用;
将获取到的所述对账数据输入中间存储模块并进行存取操作,将所述对账数据转换成以缓存形式下的临时存储数据;
将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间;
在正常对账模式下,基于高并发对账请求从所述中间存储模块对所述临时存储数据进行对应的读取操作和写入操作,并按照预设的对账逻辑进行初始对账操作,生成最终的对账结果;
在重新对账模式下,执行大批量数据实时对账操作,将最终的对账结果进行逆变换操作复原成未对账时的原始数据后,输入所述原始数据并按照正常对账模式下的对账逻辑进行最终对账操作,输出重新对账的最终结果。
作为优选地,对所述中间存储模块进行调用包括:
根据所述对账数据确定对主机内存的目标需求,根据所述目标需求对所述堆外内存进行第一次划块,得到与所述目标需求对应的第一内存块;
根据所述对账任务对所述第一内存块进行第二次划块,得到所述对账任务所占的子内存块;
在批量对账业务场景下,根据所述对账任务向所述子内存块执行写入操作以完成所述对账任务,在所述对账任务完成后按照预设批次向所述子内存块的空间进行批量写入操作和删除操作,其中,所述删除操作通过直接释放所述子内存块以获得数据清空后的内存空间。
作为优选地,所述基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存包括:
根据所述对账数据将内存对象按照预设存储需求划分第一存储空间和第二存储空间,确认所述第一存储空间和第二存储空间的映射关系;
对所述第一存储空间进行存储时,基于JVM虚拟机的内存管理机制,通过垃圾回收器GC对堆内内存进行统一管理,并对堆内内存中存储的指向堆外内存的地址指针进行一次存储;
对所述第二存储空间进行存储时,在不改变本地机器JVM堆内存大小的前提下,确认所述地址指针所指向的堆外内存并将存储于堆外内存的所述对账数据进行二次存储。
作为优选地,所述中间存储模块进行调用进一步包括:
响应于目标对象的查询请求,计算待查询目标对象的hash值;
根据所述hash值结合对应数组长度计算所在对应存储桶的编号,得到目标对象所在的目标存储桶;
从堆内内存中获取地址指针,获取所述目标存储桶对应的起始地址即第一元素;
基于桶排序算法沿所述第一元素按顺序线性查找,对第一元素及所述第一元素映射的数据进行访问并判断是否命中,将查询的元素与所述目标对象进行第一次对比;
若对比结果相同则处于命中状态,返回命中所述目标对象的结果,若对比结果不同则处于在未命中状态,对下一个next地址指针进行访问;
对第二元素及所述第二元素映射的数据进行访问并判断是否命中,将查询的元素与所述目标对象进行第二次对比;
若对比结果相同则处于命中状态,返回命中所述目标对象的结果,若对比结果不同则处于在未命中状态,则对下一个next地址指针进行访问直至返回命中结果;
其中,所述存储桶为链表结构,所述链表中的元素即缓存条目的堆外地址指针。
作为优选地,所述中间存储模块包括堆内内存和堆外内存,所述堆内内存通过指针引用至所述堆外内存,
所述堆内内存空间包括Cache存储体和多个分段数组,用于仅保留堆外内存的地址指针;
所述堆外内存空间包括多个存储桶,用于存储所述地址指针所指向的数据,对账过程中批量输入和删除数据;
每个所述分段数组通过指针引用至多个所述存储桶;
其中,每个桶对应一个链表,每个段对象用分段数组表示。
作为优选地,所述将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间包括:
基于key-value堆外缓存框架在Java项目中引入,将堆外内存的坐标添加到项目的对象模型中通过实现类来序列化和反序列化对象存储于堆外内存;
获取java对象类型并对java对象进行序列化操作,根据java对象类型获取类的注册关系,返回相应的序列化器,序列化该类型的value值;
如果序列化自定义类型,则返回值序列化器,逐个字段对类型、数据进行序列化操作来循环递归调用;
当JVM处于未开机状态时,将所述临时存储数据进行一次序列化操作,转换成第一临时存储对象待下一次JVM启动;
当所述临时存储数据执行数据调整操作的情况下,将各种数据类型的java对象序列化成字节数据;
当JVM处于启动状态时,将所述第一临时存储对象进行反序列化操作转换成原始存储对象,并将所述原始存储对象进行二次序列化操作转换成第二临时存储对象;
当所述临时存储数据执行读取操作的情况下,将所述字节数组反序列化成原始数据类型的java对象;
其中,所述第一临时存储对象为字节流,所述第二临时存储对象为java对象数据类型,所述数据调整操作包括写入、修改、删除操作。
作为优选地,所述重新对账模式启动包括:
获取重新对账请求参数生成对账任务列表进行重对账任务分发,并对所述重对账任务进行锁定操作并在任务锁定后进行重新对账操作;
判断所述重对账任务在预设对账账期中是否存在已对账数据,若存在已对账数据,则进行重对账复原操作,若不存在已对账数据,则直接进行重新对账操作;
根据重对账复原操作下对应的重新对账任务获取初始账期批次号,根据所述初始账期批次号查询并获取异常信息关联表;
根据异常关联表信息将当前重新对账任务按照重对账内外范围划分为第一重对账数据和第二重对账数据,对所述第一重对账数据和所述第二重对账数据分别进行关联数据复原操作;
对所述第一重对账数据根据预设的数据复原关联表执行复原操作,并对所述第二重对账数据执行删除操作,在关联数据复原结束后对历史复原过程产生的数据进行过滤,得到原始对账数据;
输入获取到的原始对账数据,触发正常对账模式执行直至重新对账操作结束,释放该重对账任务的锁定;
其中,所述第一重对账数据为重对账任务范围外的数据,第二重对账数据为重对账任务范围内的数据,所述数据复原关联表内容包括异常池,异常关联表,对账明细,对账结果及相关动态业务数据。
本发明还提供了一种基于jvm堆外内存的对账系统优化装置,包括:
采集模块,用于响应于对账请求生成对账任务并从本地数据库获取对账数据,所述对账数据为与对账请求订单关联流水数据;
调用模块,用于在应用程序启动的情况下,基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对所述中间存储模块进行调用;
执行模块,用于将获取到的所述对账数据输入中间存储模块并进行存取操作,将所述对账数据转换成以缓存形式下的临时存储数据;将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间;
对账模块,用于在正常对账模式下,基于高并发对账请求从所述中间存储模块对所述临时存储数据进行对应的读取操作和写入操作,并按照预设的对账逻辑进行初始对账操作,生成最终的对账结果;
重新对账模块,用于在重新对账模式下,执行大批量数据实时对账操作,将最终的对账结果进行逆变换操作复原成未对账时的原始数据后,输入所述原始数据并按照正常对账模式下的对账逻辑进行最终对账操作,输出重新对账的最终结果。
本发明提供了一种电子设备,包括:
存储器,所述存储器用于存储处理程序;
处理器,所述处理器执行所述处理程序时实现如本发明实施例所述的基于jvm堆外内存的对账系统优化方法。
本发明提供了一种可读存储介质,其特征在于,所述可读存储介质上存储有处理程序,所述处理程序被处理器执行时实现如本发明实施例所述的基于jvm堆外内存的对账系统优化方法。
针对现有技术,本发明具有如下的有益效果:
本发明所提供的一种基于jvm堆外内存的对账系统优化方法及装置,采用自研的高效的中间存储模块,通过直接使用物理机的内存,在不改变JAVA JVM 堆内存大小的前提下,利用堆外内存作为存储,对 GC不产生影响,消除对账过程中IO网络通信带来的时间耗时,增加CPU的利用率,提高机器资源的利用;
本发明采用中间存储模块通过自建的序列化方式,来序列化存储内容,压缩占用的内存大小,能存储更多的数据;中间存储模块功能支持灵活配置,并提供极简的api,无需大量的编码,使用简单,操作高效。
本发明采用分块方式将内存空间划块,根据对账任务批次写入桶和删除桶,节约了删除操作的处理时间,直接释放内存,提高对账系统的工作效率。
本发明通过正常对账模式和重新对账模式,适应大批量、复杂的对账场景,能极大的提升对账任务的时效,提高对账任务的吞吐量,快速响应业务方的对账需求, 提高对账准确性,降本增效。
附图说明
图1为本发明实施例中现有技术的示例图;
图2为本发明实施例中所述基于jvm堆外内存的对账系统优化方法的步骤示意图;
图3为本发明实施例中中间存储模块的整体架构原理图;
图4为本发明实施例中内存指针的分布和数据关联依赖关系示例图;
图5为本发明实施例中get操作流程示例图;
图6为本发明实施例中put操作流程示例图;
图7为本发明实施例中remove操作流程示例图;
图8为本发明实施例中测试效果对比图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一种实施例”表示“至少一种实施例”;术语“另一实施例”表示“至少一种另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
需要注意,本申请公开中提及的“一次”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本申请公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
在主流的财务账单对账场景中,目前主要采用定时对账的方式进行触发,可以直接对标准化的账单数据进行对账的,也可以根据不同的数据源采用实时对账和离线对账分流来缓解对账的压力。但在海量账单数据的背景下,并且对账规则多样化,存在1对1,1对多,多对多的对账场景,在实际业务场景中业务方会进行大批量的数据重新实时对账操作,对实时对账时效性和性能有高的要求。
为了解决上述缺陷并满足上述要求,如图2所示,本发明提供了一种基于jvm堆外内存的对账系统优化方法,适用于对账系统,包括:
S1:响应于对账请求生成对账任务并从本地数据库获取对账数据,所述对账数据为与对账请求订单关联流水数据,如获取主账单、从账单然后进行对账匹配;订单关联流水数据如1笔银行交易流转到资金中台形成加款单、手续费、各平台产生纠纷时产生来回的对账生成的大量流水单。
S2:在应用程序启动的情况下,基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对所述中间存储模块进行调用;Java程序运行时,由Java虚拟机(JVM)管理的内存区域称为堆(heap)。垃圾收集器会扫描堆内内存,识别应用程序已经不再使用的对象,并释放其空间,这个过程称为GC。堆内缓存是指将数据缓存在堆内的机制,比如HashMap就可以用作简单的堆内缓存。由于垃圾收集器需要扫描堆,并且在扫描时需要暂停应用线程(stop-the-world,STW),因此,缓存数据过多会导致GC开销增大,从而影响应用程序性能。与堆内内存不同,堆外内存不影响GC,由应用程序自身负责分配与释放内存。因此,当缓存数据量较大,如达到G以上级别时,中间存储模块可以使用堆外内存来提升性能。
S3:将获取到的所述对账数据输入中间存储模块并进行存取操作,将所述对账数据转换成以缓存形式下的临时存储数据;通常将访问频繁的数据放入堆外内存进行缓存,并保证缓存的时效性,数据存储在堆外,不影响GC;能够维护大量的缓存条目,如百万量级以上。
S4:将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间;
在正常对账模式下,基于高并发对账请求从所述中间存储模块对所述临时存储数据进行对应的读取操作和写入操作,并按照预设的对账逻辑进行初始对账操作,生成最终的对账结果;
在重新对账模式下,执行大批量数据实时对账操作,将最终的对账结果进行逆变换操作复原成未对账时的原始数据后,输入所述原始数据并按照正常对账模式下的对账逻辑进行最终对账操作,输出重新对账的最终结果,满足批量实时对账需求。
本发明实施例使用本地机器堆外内存的中间存储方案,在TB级别数据量的场景下,能很好的支持存储功能,并且操作达到us级别,可以很好的取代需要IO网络传输的临时存储功能,让机器的cpu等资源能达到充分的利用。针对大数据量对堆内内存影响敏感的场景,也可以通过设计的存储模块,利用堆外内存,避免大数据量的操作对JVM中GC的影响,减少系统的暂停时间,提升系统的吞吐量。中间存储模块有低延迟、容量大、不影响GC的特性,并且支持使用方根据自身业务需求进行灵活配置,如在对账场景中的应用,一次对账任务,单边50w的数据量的性能提升达5倍之多,这个模块的使用不仅仅局限于对账的场景,在其他场景也都适用,如大量的热点数据,大量离线数据的存储等。
本发明主要是为了提升在对账系统中的器的cpu利用率和对账的时效性。可以参见附图1中,原来的对账模型中从三方存储中来获取对应的对账数据,在复杂的对账场景中,存在1对多,多对1,多对多的场景,一个对账任务中,存在将一边的对账数据写入三方存储,并且在对账过程中,需要频繁的从三方存储中获取数据,存入数据等操作,都是涉及IO网络开销的,随着对账数据量几十万,上百万的增加,IO在对账任务中的比重增大,导致对账时效性低和机器资源的利用率低。本发明实施例的核心在于用自建的中间存储模块的替换三方存储模块,所述中间存储模块包括堆内内存和堆外内存,所述堆内内存通过指针引用至所述堆外内存,所述堆内内存空间包括Cache存储体和多个分段数组,用于仅保留堆外内存的地址指针,通过JVM分配和释放堆内内存;所述堆外内存空间包括多个存储桶,用于存储所述地址指针所指向的数据,对账过程中批量输入和删除数据;每个所述分段数组通过指针引用至多个所述存储桶。本实施例构建的中间存储模块以API的方式供JAVA程序调用,其VOCache接口定义了可调用的方法。其存储的结构和api函数同HashMap相似,其中Cache定义了可调用的增删改查方法,作为存储,最常用的就是get和put方法。中间存储模块采用了分段数组的实现形式,每个段对象用SpecialOffHeapData来表示。通过将Java对象序列化成字节数组存储在堆外,该过程中需要使用自定义的序列化器支持。堆内存仅仅保留了指向堆外内存的地址指针,所有的数据都存储在指针所指向的堆外内存中。存储桶采用链表结构,处理冲突简单,无堆积现象,链表上的节点都是动态申请的,参见图3所示主要架构原理图所示,从对账任务上抽象定义了桶的概念,可以快速获取和释放。桶结构可以被视为一种哈希表的变体,它通过将数据映射到桶的索引来快速访问和操作数据,有效提高数据的访问效率和处理速度。基于链表的桶结构通常被用于数据元素数量较大的场景。基于存储桶实现的中间存储模块优点如下:快速存储和访问数据:桶结构可以快速存储和访问数据,对于数据查询和统计分析等场景;易于实现数据聚合:桶结构可以极大的简化数据聚合的过程;适应性强:桶结构对数据元素的类型和数量没有特别的要求,适用于各种场景。
本发明实施例采用的中间存储模块操作的主要流程如下:
1、先计算key的hash值,再通过hash值计算出在段数组中的下标,确认所在的段对象;
2、从段对象中获取该键值对的堆外内存指针;
3、对于get操作,从指针指向的对外内存地址中读取byte数组,通过返反序列化器反序列化成对象,返回value;
4、对于put操作,通过序列化器将对象序列化成byte数组,写入指针指向的堆外内存。
本实施例中采用了分段数组的实现的中间存储模块底层的数据结构采用数据+链表实现。段中包含多个分桶,每个桶是一个链表,链表中的元素即是缓存条目的堆外地址指针。因为是链表,所以具有链表所具备的优点,处理冲突简单,无堆积现象,链表上的节点都是动态申请的。段对象是主要负责根据hash值找到键值对在堆外内存地址指针。在进行查询时,先根据hash值计算出桶号,然后找到该桶的第一个元素,然后沿着第一个元素按顺序线性查找。
为了快速存储、访问、操作数据,所述中间存储模块进行调用实现查询功能的具体步骤包括:响应于目标对象的查询请求,计算待查询目标对象的hash值;根据所述hash值结合对应数组长度计算所在对应存储桶的编号,得到目标对象所在的目标存储桶;从堆内内存中获取地址指针,获取所述目标存储桶对应的起始地址即第一元素;基于桶排序算法沿所述第一元素按顺序线性查找,对第一元素及所述第一元素映射的数据进行访问并判断是否命中,将查询的元素与所述目标对象进行第一次对比;若对比结果相同则处于命中状态,返回命中所述目标对象的结果,若对比结果不同则处于在未命中状态,对下一个next地址指针进行访问;对第二元素及所述第二元素映射的数据进行访问并判断是否命中,将查询的元素与所述目标对象进行第二次对比;若对比结果相同则处于命中状态,返回命中所述目标对象的结果,若对比结果不同则处于在未命中状态,则对下一个next地址指针进行访问直至返回命中结果;其中,所述存储桶为链表结构,所述链表中的元素即缓存条目的堆外地址指针。可以理解为,写命中(write-hit)指的是在计算机系统中,当执行写操作时,数据能够直接写入到缓存或内存中的目标位置,而无需额外的存储器访问,有利于提高对账效率。
本实施例采用的桶排序的思想就是把待排序的数尽量均匀地放到各个桶中,再对各个桶进行局部的排序,最后再按序将各个桶中的数输出,即可得到排好序的数。原理如下:首先确定桶的个数。因为桶排序最好是将数据均匀地分散在各个桶中,那么桶的个数最好是应该根据数据的分散情况来确定。首先找出所有数据中的最大值mx和最小值mn;根据mx和mn确定每个桶所装的数据的范围size,有size=(mx-mn)/n+1,n为数据的个数,需要保证至少有一个桶,故而需要加个1;求得了size即知道了每个桶所装数据的范围,还需要计算出所需的桶的个数cnt,有cnt=(mx-mn)/size+1,需要保证每个桶至少要能装1个数,故而需要加个1;求得了size和cnt后,即可知第一个桶装的数据范围为[mn,mn+size),第二个桶为[mn+size,mn+2*size),…,以此类推。因此步骤2中需要再扫描一遍数组,将待排序的各个数放进对应的桶中。对各个桶中的数据进行排序,可以使用其他的排序算法排序,例如快速排序;也可以递归使用桶排序进行排序;将各个桶中排好序的数据依次输出,最后得到的数据即为最终有序。
举例说明如下:如图4所示,假设segment段中存在两个桶,桶1存储了堆外地址为1024的key1和value1,和堆外地址为8192的key4和value4;桶2存储了堆外地址为2048的key2和value2,和堆外地址为4096的key3和value3,而堆内存中只需要保存一个地址指针10000。
当我们查询key3时,步骤如下:
计算key3的hash值,根据hash值计算所在桶的编号,得到桶2;从堆外10000处,获取2号桶对应的起始地址;访问2048,发现key2,不符合,访问next地址;访问4096,获取到key3,命中,返回。
本实施例当接收到对账数据进入内存使用主机内存进行划块,不使用JAVA内存,此时回收机制无效,即在不改变本地机器JVM堆内存大小设置的前提下,利用堆外内存作为存储,对GC不产生影响,实现的具体步骤如下:
根据所述对账数据确定对主机内存的目标需求,根据所述目标需求对所述堆外内存进行第一次划块,得到与所述目标需求对应的第一内存块;
根据所述对账任务对所述第一内存块进行第二次划块,得到所述对账任务所占的子内存块;
在批量对账业务场景下,根据所述对账任务向所述子内存块执行写入操作以完成所述对账任务,在所述对账任务完成后按照预设批次向所述子内存块的空间进行批量写入操作和删除操作,其中,所述删除操作通过直接释放所述子内存块以获得数据清空后的内存空间,节约了删除操作的处理时间,有效的避免IO的网络开销,提高了对账效率。对账任务是按照一个批次对账的,一个批次会有几十、几百万数据要写入桶和删除桶即上述子内存块,现有技术没办法把一个批次需要的数据快速查询或者删除的,本发明适用于对账时批量数据产生的场景,在高并发、海量数据场景下,占用内存大小、响应速率性能上的提升。
本实施例中间存储模块采用的主要操作流程:如图5-图7所示,
1、get操作:根据key计算hash和segmentIndex分段数组下标和tableIndex桶的下标;遍历table中指定桶的地址指针;不存在,则返回null;存在,如果过期,则删除,返回null;存在,如果未过期,返回其指针地址;根据指针地址,从堆外内存中获取值,反序列化后返回对象。
2、put操作:计算key/value的字节大小,计算存储一对key/value实际需要的占用空间,分配内存,失败则remove指定的key;写入key和value到堆外内存,计算hash值,并初始化head节点;计算段下标,并获取对应桶下标的head节点,遍历链表;比较key是否存在,存在未过期,则将value进行替换;如果过期,则将老的一处;检查是否需要rehash,需要则创建原来2倍大小的数量,原来tab数据迁移到扩容后的tab中;添加到table对应桶的head节点,next指向原来的head机节点。
3、remove操作:根据key计算hash和段数组下标segmentIndex和段中桶的下标tableIndex;遍历对应桶的链表地址元素,判断节点是否存在;不存在,直接返回;存在,重新连接桶中的列表,剔除符合的节点地址。
所述步骤S2中基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存包括:
根据所述对账数据将内存对象按照预设存储需求划分第一存储空间和第二存储空间,确认所述第一存储空间和第二存储空间的映射关系;
对所述第一存储空间进行存储时,基于JVM虚拟机的内存管理机制,通过垃圾回收器GC对堆内内存进行统一管理,并对堆内内存中存储的指向堆外内存的地址指针进行一次存储;
对所述第二存储空间进行存储时,在不改变本地机器JVM堆内存大小的前提下,确认所述地址指针所指向的堆外内存并将存储于堆外内存的所述对账数据进行二次存储。
JVM的对象可以以序列化二进制字节流的方式存储,本质上可以理解为将非连续空间的链式存储转化为连续空间或块存储,在访问时则需要进行序列化的逆过程——反序列化,将字节流转化为对象,序列化的方式可以节省存储空间。中间存储模块同所有的key-value缓存框架一样,对key和value提供了泛型支持,在创建对象时,需要确定key和value的类型。存储的高效依赖于序列化的设计。序列化协议是否高效,主要从两方面考虑:序列化后的二进制序列大小和序列化、反序列化的速率。序列化是将各种数据类型序列化成byte数组的过程,反序列化是将byte数组转成各种数据类型的反过程。
具体地,所述将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间包括:
基于key-value堆外缓存框架在Java项目中引入,将堆外内存的坐标添加到项目的对象模型中通过实现类来序列化和反序列化对象存储于堆外内存;key-value堆外缓存框架可以是VOC全称为jvm-off-cache,即堆外缓存。
获取java对象类型并对java对象进行序列化操作,根据java对象类型获取类的注册关系,返回相应的序列化器,序列化该类型的value值;
如果序列化自定义类型,则返回值序列化器,逐个字段对类型、数据进行序列化操作来循环递归调用;
当JVM处于未开机状态时,将所述临时存储数据进行一次序列化操作,转换成第一临时存储对象待下一次JVM启动;当所述临时存储数据执行数据调整操作的情况下,将各种数据类型的java对象序列化成字节数据;
当JVM处于启动状态时,将所述第一临时存储对象进行反序列化操作转换成原始存储对象,并将所述原始存储对象进行二次序列化操作转换成第二临时存储对象;当所述临时存储数据执行读取操作的情况下,将所述字节数组反序列化成原始数据类型的java对象;
其中,所述第一临时存储对象为字节流,所述第二临时存储对象为java对象数据类型,所述数据调整操作包括写入、修改、删除操作。
可以理解为,上述中间存储模块序列化步骤的优点如下:将对象转为字节流存储到硬盘上,当JVM处于停机状态时,字节流存储在硬盘上待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间。序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。通过序列化可以在进程间传递对象。
序列化原理如下:序列化的对象,由于是字节流的形式,其占用的内存大小可直接计算;非序列化的对象,其占用的内存是通过周期性地采样近似估算而得,这种方法降低了时间开销但是有可能误差较大,导致某一时刻的实际内存有可能远远超出预期;本实施在被Spark标记为释放的对象实例,很有可能在实际上并没有被JVM回收,导致实际可用的内存小于Spark记录的可用内存。所以Spark并不能准确记录实际可用的堆内内存,从而也就无法完全避免内存溢出(OOM,OutofMemory)的异常。虽然不能精准控制堆内内存的申请和释放,但Spark通过对存储内存和执行内存各自独立的规划管理,决定是否要在存储内存里缓存新的分布式数据集(RDD),以及是否为新的任务分配执行内存,在一定程度上可以提升内存的利用率,减少异常的出现。
举例说明如下,Int类型来说明序列化编码规则:
采用变长字节来做存储,并且在正常场景中,使用的int数据都不会很大,并且在在一个字节8位中,高位是用来当作标记位使用,可以标识是否还需要读取下一个字节,其中1:表示需要,0:表示不需要,集数据读取结束,所以在变长int存储中个,一个字节可以用来存储数字的有效位是7位。因为有标记位的存在,而java中int是4字节表示,所以在序列化流中的大小,都是尽量按需分配,采用1-5个字节来存储int数据。
如一个数据value范围在0-127,则用一个字节表示即可,高位标记位为0,在操作缓存区时,需要申请1字节的空间,进行赋值后,返回本次申请的存储空间。
如果一个数据在0-2^14-1范围之间,则需要申请两个字节空间,低8位组成为低7位i字节+高位标记位设置为1,表示还需要读取下一个字节,高8位组成为无符号为左移7位,保留高6位+第一个字节剩余的1位,并且高位标记位置为0,表示无需在读取字节,数据读取保存完毕。
Int类型的反序列化过程:从上可以看出,varint是按小端序列存放,先读到的位在整个int序列中是越靠近低位的。主要过程为一个一个字节的读取,读到第一个字节buffer[0]后,先获取有效存储为的数据,&0x7F,然后判断高位的标记位是否为1,如果为0,直接返回,如果为1,则继续读取第二个字节,同样先提取低7位的有效数据位,然后作揖7位,与buffer[0]进行或运算。
对象序列化过程:1、序列化对象过程中,如果对象类型为null,则会使用变长int来存储标记0,会占用1个字节;2、Type不为null,根据type获取类的注册信息,如果不存在注册信息,则将类型的全类名写入;如果存在注册关系,则会将注册类id使用变长int写入字节流中。这里用数字替代全类名,序列化的字节流会更小。3、在写入类全路径名时,首先会使用变长int编码写入一个标记,记录是存储类名;如果存在class和nameId的映射关系不为空,则根据type去获取nameId,存在则直接写入流中,这里针对一次序列化过程,同一个类名只写入一次,会分配一个nameId进行缓存;每次有新的type序列化都会分配一个全局递增的nameId,将type和nameId进行缓存,并将nameId和type全路径名写入流中。
同理,对象反序列化则是一个逆过程:1、首先读取一个变长int数据,2、如果是0,表示null,3、如果是1,则表示存储的类的全路径名。从字节流中读取classnameId,因为在序列化类时,如果序列化字符串时,首先先用变长int存储类型的nameId,然后再序列化类的全路径名,这样在一次反序列化时,第一次序列化时,将全列的全路径使用Class.forName实例化对象后,然后存储在局部方法缓存中(IntMap)中,在这一次序列化时再碰到同类型时,则根据id则可以找到对象。4、如果不为0或1,则说明存储的是类型对应的Id值,使用了类的注册机制,可以直接获取。上述过程是先序列化对象类型,然后根据类型返回相应的序列化器,之后,序列化该类型的具体value;如果自定义类型,则返回的值序列化器,然后逐个字段对类型,数据序列化,递归调用消除了循环依赖的序列化,对于以序列化的对象,在循环引用时,用一个int类型来表示该对象值。关注有效的数据,减少需要序列化的元数据信息。
上述对各种数据类型的序列化机制,其再降低序列化大小方面做了如下优化方案:1、Kryo序列化的“对象”是数据以及少量元信息,这和JAVA默认的序列化的本质区别,java默认的序列化的目的是语言层次的,将类,对象的所有信息都序列化了,也就是就算是不加载类的定义,也可以根据序列化后的信息动态生成类的所有信息。而Kryo反序列化时,必须能加载类的定义,这样Kryo可以节省大量的字节空间。2、使用变长int,变长long存储int,long类型,大大节省空间。3、元数据(字符串类型)使用缓存机制,重复出现的字符串使用int来存储,节省存储空间。4、字符串类型使用UTF-8存储,但会使用ascii码进一步优化空间。
本实施例中所述重新对账模式启动的具体步骤包括:
获取重新对账请求参数生成对账任务列表进行重对账任务分发,并对所述重对账任务进行锁定操作并在任务锁定后进行重新对账操作;此处的重对账任务为单一对账任务,与锁定操作结合更进一步避免重复操作。
判断所述重对账任务在预设对账账期中是否存在已对账数据,若存在已对账数据,则进行重对账复原操作,若不存在已对账数据,则直接进行重新对账操作;
根据重对账复原操作下对应的重新对账任务获取初始账期批次号,根据所述初始账期批次号查询并获取异常信息关联表;
根据异常关联表信息将当前重新对账任务按照重对账内外范围划分为第一重对账数据和第二重对账数据,对所述第一重对账数据和所述第二重对账数据分别进行关联数据复原操作;
对所述第一重对账数据根据预设的数据复原关联表执行复原操作,并对所述第二重对账数据执行删除操作,在关联数据复原结束后对历史复原过程产生的数据进行过滤,得到原始对账数据;
输入获取到的原始对账数据,触发正常对账模式执行直至重新对账操作结束,释放该重对账任务的锁定;
其中,所述第一重对账数据为重对账任务范围外的数据,第二重对账数据为重对账任务范围内的数据,所述数据复原关联表内容包括异常池,异常关联表,对账明细,对账结果及相关动态业务数据。
上述步骤具体说明如下:1.清结算运营人员在清结算管理后台发起重新对账请求;2.根据请求参数获取对账任务列表后进行单一任务分发对账;3.单一任务对账前会进行锁定操作,避免重复触发;4.判断该任务在对账账期内是否存在已对账数据;4.1如存在则进行重对账复原操作跳转至步骤5;4.2如不存在则直接进行对账操作跳转至步骤10;5.重对账复原事务内,获取到该任务重对前涉及的账期批次号;6.根据获取到的批次号查询差错信息关联表;7.根据关联表信息对此次重对账范围外的数据重新复原操作,对范围内的数据会进行删除,无需复原;8.数据复原关联表进行数据复原范围:差错池,差错关联表,对账明细,对账结果及动态业务数据,如银行侧资金已发生,因日切或者风控审核等等原因业务线还未给客户账户进行加款或者减款的在途资金的状态;9.关联数据复原结束后,删除重对账期内的历史相关数据,复原结束;10.进行正常重对账操作;11.重对账结束,释放任务锁定;避免重复触发重对账任务,减少资源的浪费,有利于海量场景下提高对账的准确率。
参见图8所示,使用实践效果:在进行压测的结果中可以看出,通过中间存储模块来代替远程三方存储模块,时效提升明显。并且模拟在数据量集中的情况下,两个对账类型一起跑一个月的数据,流水对账100w/day/31days,单据对账50w/day/31days,每个对账类型8个线程并发,总数据量达到千万级别情况下,堆外内存的使用峰值为5G左右,不到6G,中间存储模块使用的成本很低,有利于提高系统性能。
在另一实施例中,对于离线数据,其更新周期比较长,非常适合使用VOC缓存到服务所在服务器本地。比如,在进行排序时,item的历史点击率是非常重要的特征数据,特别是其最近几天的点击率。这种以天为单位更新的离线特征,如果使用VOC缓存到本地,则可以避免读取Redis的网络开销,节省排序阶段耗时。
对于实时数据,其更新受用户实时行为影响,下次更新时间是不确定的。比如用户对某个目的地的偏好程度,这种数据随着用户在App端不断进行点击而更新。这种实时数据不会使用VOC缓存到本地,否则可能会导致本地缓存和主库的数据不一致。即使进行缓存,也应该设置较小的过期时间,比如秒级或者分钟级,尽量保证数据的实时性和准确性。其他数据,比如站内的高热数据和兜底数据,其数据量较小且可能频繁使用,这种数据使用Guava缓存到堆内,以便于快速读取。
实施例二
基于相同的发明构思,本发明提供了一种基于jvm堆外内存的对账系统优化装置,包括:
采集模块,用于响应于对账请求生成对账任务并从本地数据库获取对账数据,所述对账数据为与对账请求订单关联流水数据;
调用模块,用于在应用程序启动的情况下,基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对所述中间存储模块进行调用;
执行模块,用于将获取到的所述对账数据输入中间存储模块并进行存取操作,将所述对账数据转换成以缓存形式下的临时存储数据;将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间;
对账模块,用于在正常对账模式下,基于高并发对账请求从所述中间存储模块对所述临时存储数据进行对应的读取操作和写入操作,并按照预设的对账逻辑进行初始对账操作,生成最终的对账结果;
重新对账模块,用于在重新对账模式下,执行大批量数据实时对账操作,将最终的对账结果进行逆变换操作复原成未对账时的原始数据后,输入所述原始数据并按照正常对账模式下的对账逻辑进行最终对账操作,输出重新对账的最终结果。
上述采集模块、调用模块、执行模块、对账模块及重新对账模块的原理内容及实现方法,均如实施例一中所述,在此不再赘述。
实施例三
在本申请的一些实施例中,还提供了一种电子设备。该种电子设备中包含存储器和处理器,其中存储器用于对处理程序进行存储,处理器则根据指令对处理程序进行执行。当处理器对处理程序进行执行时,使得前述实施例中的基于jvm堆外内存的对账系统优化方法得以实现。
在本申请的一些实施例中,还提供了一种可读存储介质,该可读存储介质可以为非易失性可读存储介质,也可以为易失性可读存储介质。该可读存储介质中存储有指令,当该指令在计算机上运行时,使得包含该种可读存储介质的电子设备执行前述的基于jvm堆外内存的对账系统优化方法。
可以理解的是,对于前述所提及的基于jvm堆外内存的对账系统优化方法,如果均以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-onlymemory,ROM)、随机存取存储器(Randomaccessmemory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读存储介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请所公开的技术方案所涉及的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如C语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种基于jvm堆外内存的对账系统优化方法,其特征在于,包括:
响应于对账请求生成对账任务并从本地数据库获取对账数据,所述对账数据为与对账请求订单关联流水数据;
在应用程序启动的情况下,基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对所述中间存储模块进行调用;
将获取到的所述对账数据输入中间存储模块并进行存取操作,将所述对账数据转换成以缓存形式下的临时存储数据;
将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间;
在正常对账模式下,基于高并发对账请求从所述中间存储模块对所述临时存储数据进行对应的读取操作和写入操作,并按照预设的对账逻辑进行初始对账操作,生成最终的对账结果;
在重新对账模式下,执行大批量数据实时对账操作,将最终的对账结果进行逆变换操作复原成未对账时的原始数据后,输入所述原始数据并按照正常对账模式下的对账逻辑进行最终对账操作,输出重新对账的最终结果。
2.如权利要求1所述的基于jvm堆外内存的对账系统优化方法,其特征在于,对所述中间存储模块进行调用包括:
根据所述对账数据确定对主机内存的目标需求,根据所述目标需求对所述堆外内存进行第一次划块,得到与所述目标需求对应的第一内存块;
根据所述对账任务对所述第一内存块进行第二次划块,得到所述对账任务所占的子内存块;
在批量对账业务场景下,根据所述对账任务向所述子内存块执行写入操作以完成所述对账任务,在所述对账任务完成后按照预设批次向所述子内存块的空间进行批量写入操作和删除操作,其中,所述删除操作通过直接释放所述子内存块以获得数据清空后的内存空间。
3.如权利要求1所述的基于jvm堆外内存的对账系统优化方法,其特征在于,所述基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存包括:
根据所述对账数据将内存对象按照预设存储需求划分第一存储空间和第二存储空间,确认所述第一存储空间和第二存储空间的映射关系;
对所述第一存储空间进行存储时,基于JVM虚拟机的内存管理机制,通过垃圾回收器GC对堆内内存进行统一管理,并对堆内内存中存储的指向堆外内存的地址指针进行一次存储;
对所述第二存储空间进行存储时,在不改变本地机器JVM堆内存大小的前提下,确认所述地址指针所指向的堆外内存并将存储于堆外内存的所述对账数据进行二次存储。
4.如权利要求1所述的基于jvm堆外内存的对账系统优化方法,其特征在于,所述中间存储模块进行调用进一步包括:
响应于目标对象的查询请求,计算待查询目标对象的hash值;
根据所述hash值结合对应数组长度计算所在对应存储桶的编号,得到目标对象所在的目标存储桶;
从堆内内存中获取地址指针,获取所述目标存储桶对应的起始地址即第一元素;
基于桶排序算法沿所述第一元素按顺序线性查找,对第一元素及所述第一元素映射的数据进行访问并判断是否命中,将查询的元素与所述目标对象进行第一次对比;
若对比结果相同则处于命中状态,返回命中所述目标对象的结果,若对比结果不同则处于在未命中状态,对下一个next地址指针进行访问;
对第二元素及所述第二元素映射的数据进行访问并判断是否命中,将查询的元素与所述目标对象进行第二次对比;
若对比结果相同则处于命中状态,返回命中所述目标对象的结果,若对比结果不同则处于在未命中状态,则对下一个next地址指针进行访问直至返回命中结果;
其中,所述存储桶为链表结构,所述链表中的元素即缓存条目的堆外地址指针。
5.如权利要求1所述的基于jvm堆外内存的对账系统优化方法,其特征在于,所述中间存储模块包括堆内内存和堆外内存,所述堆内内存通过指针引用至所述堆外内存,
所述堆内内存空间包括Cache存储体和多个分段数组,用于仅保留堆外内存的地址指针;
所述堆外内存空间包括多个存储桶,用于存储所述地址指针所指向的数据,对账过程中批量输入和删除数据;
每个所述分段数组通过指针引用至多个所述存储桶;
其中,每个桶对应一个链表,每个段对象用分段数组表示。
6.如权利要求1所述的基于jvm堆外内存的对账系统优化方法,其特征在于,所述将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间包括:
基于key-value堆外缓存框架在Java项目中引入,将堆外内存的坐标添加到项目的对象模型中通过实现类来序列化和反序列化对象存储于堆外内存;
获取java对象类型并对java对象进行序列化操作,根据java对象类型获取类的注册关系,返回相应的序列化器,序列化该类型的value值;
如果序列化自定义类型,则返回值序列化器,逐个字段对类型、数据进行序列化操作来循环递归调用;
当JVM处于未开机状态时,将所述临时存储数据进行一次序列化操作,转换成第一临时存储对象待下一次JVM启动;
当所述临时存储数据执行数据调整操作的情况下,将各种数据类型的java对象序列化成字节数据;
当JVM处于启动状态时,将所述第一临时存储对象进行反序列化操作转换成原始存储对象,并将所述原始存储对象进行二次序列化操作转换成第二临时存储对象;
当所述临时存储数据执行读取操作的情况下,将所述字节数组反序列化成原始数据类型的java对象;
其中,所述第一临时存储对象为字节流,所述第二临时存储对象为java对象数据类型,所述数据调整操作包括写入、修改、删除操作。
7.如权利要求1所述的基于jvm堆外内存的对账系统优化方法,其特征在于,所述重新对账模式启动包括:
获取重新对账请求参数生成对账任务列表进行重对账任务分发,并对所述重对账任务进行锁定操作并在任务锁定后进行重新对账操作;
判断所述重对账任务在预设对账账期中是否存在已对账数据,若存在已对账数据,则进行重对账复原操作,若不存在已对账数据,则直接进行对账操作;
根据重对账复原操作下对应的重新对账任务获取初始账期批次号,根据所述初始账期批次号查询并获取异常信息关联表;
根据异常关联表信息将当前重新对账任务按照重对账内外范围划分为第一重对账数据和第二重对账数据,对所述第一重对账数据和所述第二重对账数据分别进行关联数据复原操作;
对所述第一重对账数据根据预设的数据复原关联表执行复原操作,并对所述第二重对账数据执行删除操作,在关联数据复原结束后对历史复原过程产生的数据进行过滤,得到原始对账数据;
输入获取到的原始对账数据,触发正常对账模式执行直至重新对账操作结束,释放该重对账任务的锁定;
其中,所述第一重对账数据为重对账任务范围外的数据,第二重对账数据为重对账任务范围内的数据,所述数据复原关联表内容包括异常池,异常关联表,对账明细,对账结果及相关动态业务数据。
8.一种基于jvm堆外内存的对账系统优化装置,其特征在于,包括:
采集模块,用于响应于对账请求生成对账任务并从本地数据库获取对账数据,所述对账数据为与对账请求订单关联流水数据;
调用模块,用于在应用程序启动的情况下,基于jvm堆外内存将存储于堆内内存的对象映射至进程的地址堆外内存构成中间存储模块,并对所述中间存储模块进行调用;
执行模块,用于将获取到的所述对账数据输入中间存储模块并进行存取操作,将所述对账数据转换成以缓存形式下的临时存储数据;将所述临时存储数据按照预设的序列化编码规则进行相应对象状态转换的序列化操作和反序列化操作以压缩所述临时存储数据所占用的内存容量从而优化数据存储空间;
对账模块,用于在正常对账模式下,基于高并发对账请求从所述中间存储模块对所述临时存储数据进行对应的读取操作和写入操作,并按照预设的对账逻辑进行初始对账操作,生成最终的对账结果;
重新对账模块,用于在重新对账模式下,执行大批量数据实时对账操作,将最终的对账结果进行逆变换操作复原成未对账时的原始数据后,输入所述原始数据并按照正常对账模式下的对账逻辑进行最终对账操作,输出重新对账的最终结果。
9.一种电子设备,其特征在于,包括:
存储器,所述存储器用于存储处理程序;
处理器,所述处理器执行所述处理程序时实现如权利要求1至7中任意一项所述的基于jvm堆外内存的对账系统优化方法。
10.一种可读存储介质,其特征在于,所述可读存储介质上存储有处理程序,所述处理程序被处理器执行时实现如权利要求1至7中任意一项所述的基于jvm堆外内存的对账系统优化方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311533727.1A CN117251120B (zh) | 2023-11-17 | 2023-11-17 | 基于jvm堆外内存的对账系统优化方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311533727.1A CN117251120B (zh) | 2023-11-17 | 2023-11-17 | 基于jvm堆外内存的对账系统优化方法、装置、设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117251120A true CN117251120A (zh) | 2023-12-19 |
CN117251120B CN117251120B (zh) | 2024-03-01 |
Family
ID=89126799
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311533727.1A Active CN117251120B (zh) | 2023-11-17 | 2023-11-17 | 基于jvm堆外内存的对账系统优化方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117251120B (zh) |
Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103782273A (zh) * | 2011-09-09 | 2014-05-07 | 国际商业机器公司 | 存储器分配方法、程序和系统 |
CN104219064A (zh) * | 2013-05-30 | 2014-12-17 | 华为技术有限公司 | 计费方法和装置 |
CN107729553A (zh) * | 2017-11-07 | 2018-02-23 | 北京京东金融科技控股有限公司 | 系统数据对账方法及装置、存储介质、电子设备 |
CN109034993A (zh) * | 2018-09-29 | 2018-12-18 | 深圳前海微众银行股份有限公司 | 对账方法、设备、系统及计算机可读存储介质 |
CN109101554A (zh) * | 2018-07-12 | 2018-12-28 | 厦门中控智慧信息技术有限公司 | 用于java平台的数据缓存系统、方法以及计算机终端 |
CN110515703A (zh) * | 2019-08-29 | 2019-11-29 | 上海携程商务有限公司 | Jvm缓存系统和方法 |
CN111104347A (zh) * | 2019-12-23 | 2020-05-05 | 北京东土军悦科技有限公司 | 堆内存块查找方法、装置、设备及存储介质 |
CN112631504A (zh) * | 2019-09-24 | 2021-04-09 | 北京京东尚科信息技术有限公司 | 利用堆外内存实现本地缓存的方法和装置 |
WO2021068728A1 (zh) * | 2019-10-10 | 2021-04-15 | 深圳前海微众银行股份有限公司 | 一种区块的状态树的生成和链上数据验证的方法及装置 |
CN113205402A (zh) * | 2021-05-29 | 2021-08-03 | 长沙市到家悠享家政服务有限公司 | 对账方法、装置、电子设备及计算机可读介质 |
CN114020716A (zh) * | 2021-09-18 | 2022-02-08 | 宝付网络科技(上海)有限公司 | 对账系统中的大文件分布式处理方法及装置 |
CN115981867A (zh) * | 2023-01-30 | 2023-04-18 | 深圳前海微众银行股份有限公司 | 分片数据的处理方法及装置 |
CN116012178A (zh) * | 2022-12-15 | 2023-04-25 | 广西电网有限责任公司 | 一种基于人工智能的自动化财务对账方法 |
CN116664139A (zh) * | 2023-07-26 | 2023-08-29 | 福建喜购宝信息科技股份有限公司 | 一种整合多平台商城的结算管理系统 |
CN116993523A (zh) * | 2023-08-09 | 2023-11-03 | 中国联合网络通信集团有限公司 | 配置化对账方法、装置、设备及存储介质 |
-
2023
- 2023-11-17 CN CN202311533727.1A patent/CN117251120B/zh active Active
Patent Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103782273A (zh) * | 2011-09-09 | 2014-05-07 | 国际商业机器公司 | 存储器分配方法、程序和系统 |
CN104219064A (zh) * | 2013-05-30 | 2014-12-17 | 华为技术有限公司 | 计费方法和装置 |
CN107729553A (zh) * | 2017-11-07 | 2018-02-23 | 北京京东金融科技控股有限公司 | 系统数据对账方法及装置、存储介质、电子设备 |
CN109101554A (zh) * | 2018-07-12 | 2018-12-28 | 厦门中控智慧信息技术有限公司 | 用于java平台的数据缓存系统、方法以及计算机终端 |
CN109034993A (zh) * | 2018-09-29 | 2018-12-18 | 深圳前海微众银行股份有限公司 | 对账方法、设备、系统及计算机可读存储介质 |
CN110515703A (zh) * | 2019-08-29 | 2019-11-29 | 上海携程商务有限公司 | Jvm缓存系统和方法 |
CN112631504A (zh) * | 2019-09-24 | 2021-04-09 | 北京京东尚科信息技术有限公司 | 利用堆外内存实现本地缓存的方法和装置 |
WO2021068728A1 (zh) * | 2019-10-10 | 2021-04-15 | 深圳前海微众银行股份有限公司 | 一种区块的状态树的生成和链上数据验证的方法及装置 |
CN111104347A (zh) * | 2019-12-23 | 2020-05-05 | 北京东土军悦科技有限公司 | 堆内存块查找方法、装置、设备及存储介质 |
CN113205402A (zh) * | 2021-05-29 | 2021-08-03 | 长沙市到家悠享家政服务有限公司 | 对账方法、装置、电子设备及计算机可读介质 |
CN114020716A (zh) * | 2021-09-18 | 2022-02-08 | 宝付网络科技(上海)有限公司 | 对账系统中的大文件分布式处理方法及装置 |
CN116012178A (zh) * | 2022-12-15 | 2023-04-25 | 广西电网有限责任公司 | 一种基于人工智能的自动化财务对账方法 |
CN115981867A (zh) * | 2023-01-30 | 2023-04-18 | 深圳前海微众银行股份有限公司 | 分片数据的处理方法及装置 |
CN116664139A (zh) * | 2023-07-26 | 2023-08-29 | 福建喜购宝信息科技股份有限公司 | 一种整合多平台商城的结算管理系统 |
CN116993523A (zh) * | 2023-08-09 | 2023-11-03 | 中国联合网络通信集团有限公司 | 配置化对账方法、装置、设备及存储介质 |
Non-Patent Citations (3)
Title |
---|
ANATOLE LEFORT等: "J-NVM: Off-heap Persistent Objects in Java", SOSP \'21: PROCEEDINGS OF THE ACM SIGOPS 28TH SYMPOSIUM ON OPERATING SYSTEMS PRINCIPLES, 26 October 2021 (2021-10-26), pages 408 - 423, XP058910639, DOI: 10.1145/3477132.3483579 * |
白鸽呀: "堆外缓存是什么? OHC 堆外缓存使用简介", Retrieved from the Internet <URL:https://blog.csdn.net/qq_44787816/article/details/126939521> * |
陈胜杰: "基于堆外内存的Java应用服务器缓存框架设计与实现", 中国优秀硕士学位论文全文数据库 信息科技辑, no. 12, pages 137 - 201 * |
Also Published As
Publication number | Publication date |
---|---|
CN117251120B (zh) | 2024-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11593337B2 (en) | Data processing method, device, and a storage medium | |
US11625501B2 (en) | Masking sensitive information in records of filtered accesses to unstructured data | |
US9767131B2 (en) | Hierarchical tablespace space management | |
US10296498B2 (en) | Coordinated hash table indexes to facilitate reducing database reconfiguration time | |
US7680791B2 (en) | Method for sorting data using common prefix bytes | |
JP6356675B2 (ja) | 集約/グループ化動作:ハッシュテーブル法のハードウェア実装 | |
US20050050058A1 (en) | Direct loading of opaque types | |
US7734581B2 (en) | Vector reads for array updates | |
US11789923B2 (en) | Compression units in an index block | |
US20130111151A1 (en) | Software translation lookaside buffer for persistent pointer management | |
CN109710668B (zh) | 一种多源异构数据访问中间件构建方法 | |
US10394811B2 (en) | Tail-based top-N query evaluation | |
US11645281B1 (en) | Caching query plans in database systems | |
CN107562804B (zh) | 数据缓存服务系统及方法、终端 | |
EP3961461B1 (en) | Method and apparatus for obtaining number for transaction-accessed variable in blockchain in parallel | |
CN109951541A (zh) | 一种流水号生成方法及服务器 | |
US20100161668A1 (en) | Method and system for index serialization | |
CN115114335A (zh) | 一种软件应用多级缓存及流量过滤的方法 | |
CN102567419B (zh) | 基于树结构的海量数据存储装置及方法 | |
US8024374B2 (en) | Computer object conversion using an intermediate object | |
CN118250206A (zh) | 基于流量回放的高并发压测试方法及相关装置 | |
CN117251120B (zh) | 基于jvm堆外内存的对账系统优化方法、装置、设备及介质 | |
US20120254133A1 (en) | Method for binary persistence in a system providing offers to subscribers | |
US7251660B2 (en) | Providing mappings between logical time values and real time values in a multinode system | |
CN113986937A (zh) | 一种客户端数据更新的方法、系统和介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |