掌桥专利:专业的专利平台
掌桥专利
首页

基于哈希算法的内存结构持久化方法、装置、设备及介质

文献发布时间:2024-04-18 19:52:40


基于哈希算法的内存结构持久化方法、装置、设备及介质

技术领域

本公开涉及数据处理技术领域,尤其涉及一种基于哈希算法的内存结构持久化方法、装置、设备及介质。

背景技术

对于如今大规模、高性能的计算机系统,基于键值对(k-v)的数据结构发挥着重要作用,HashMap是其典型代表,它能提供O(1)级别的查询时间复杂度。

在一些典型应用中,HashMap中的数据不能丢失,需要持久化存储。如果HashMap的数据经常发生变动,还需要不停地进行持久化,并且在系统启动时,能将持久化的数据快速地恢复为HashMap以支撑上层业务快速查询。

相关技术中,可以直接使用Java原生的序列化方式将HashMap对象序列化到磁盘上,但是如果HashMap的k-v键值对非常多,达到千万量级时,这种(反)序列化方式非常缓慢,超出一般系统的要求。

需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。

发明内容

本公开提供一种基于哈希算法的内存结构持久化方法、装置、设备及介质,至少在一定程度上克服由于相关技术中因HashMap的k-v键值对非常多,达到千万量级时所导致的序列化方式非常缓慢,超出一般系统要求的问题。

本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。

根据本公开的一个方面,提供了一种基于哈希算法的内存结构持久化方法,包括:

将基于哈希算法的内存结构HashMap分成多个子HashMap,每个子HashMap对应一个用于保存键值对的文件;

使用内存映射,将每个子HashMap对应的文件映射到页高速缓冲存储器中。

在本公开的一个实施例中,方法还包括:

在新增键值对时,根据子HashMap的个数,使用哈希算法定位到相应的子HashMap;

将键值对增补到子HashMap对应的内存映射文件尾部;

记录键值对在内存映射文件中的起始位置;

将起始位置作为新的value值,与原始的key放入子HashMap对应的文件中。

在本公开的一个实施例中,方法还包括:

在查询一个key时,从子HashMap中查询到内存映射文件的位置;

从内存映射文件的位置处解析得到value值。

在本公开的一个实施例中,方法还包括:

在反序列化时,使用多线程并发地从内存映射文件中读取键值对;

将读取到的键值对,插入到对应的子HashMap中。

在本公开的一个实施例中,将HashMap分成多个子HashMap,包括:

预测HashMap的数据量;

根据HashMap的数据量,规划子HashMap的数量;

基于子HashMap的数量,将HashMap分为子HashMap。

根据本公开的另一个方面,提供一种基于哈希算法的内存结构持久化装置,包括:

拆分模块,用于将基于哈希算法的内存结构HashMap分成多个子HashMap,每个子HashMap对应一个用于保存键值对的文件;

内存映射模块,用于使用内存映射,将每个子HashMap对应的文件映射到页高速缓冲存储器中。

在本公开的一个实施例中,装置还包括:

定位模块,用于在新增键值对时,根据子HashMap的个数,使用哈希算法定位到相应的子HashMap;

增补模块,用于将键值对增补到子HashMap对应的内存映射文件尾部;

记录模块,用于记录键值对在内存映射文件中的起始位置;

存储模块,用于将起始位置作为新的value值,与原始的key放入子HashMap对应的文件中。

在本公开的一个实施例中,装置还包括:

查询模块,用于在查询一个key时,从子HashMap中查询到内存映射文件的位置;

解析模块,用于从内存映射文件的位置处解析得到value值。

在本公开的一个实施例中,装置还包括:

键值对读取模块,用于在反序列化时,使用多线程并发地从内存映射文件中读取键值对;

键值对插入模块,用于将读取到的键值对,插入到对应的子HashMap中。

在本公开的一个实施例中,拆分模块,包括:

数据量预测单元,用于预测HashMap的数据量;

数量规划单元,用于根据HashMap的数据量,规划子HashMap的数量;

拆分单元,用于基于子HashMap的数量,将HashMap分为子HashMap。

根据本公开的又一个方面,提供一种电子设备,包括:存储器,用于存储指令;处理器,用于调用所述存储器中存储的指令,实现上述的基于哈希算法的内存结构持久化方法。

根据本公开的又一个方面,提供一种计算机可读存储介质,其上存储有计算机指令,所述计算机指令被处理器执行时实现上述的基于哈希算法的内存结构持久化方法。

根据本公开的又一个方面,提供一种计算机程序产品,计算机程序产品存储有指令,所述指令在由计算机执行时,使得计算机实施上述的基于哈希算法的内存结构持久化方法。

根据本公开的又一个方面,提供一种芯片,包括至少一个处理器和接口;

接口,用于为至少一个处理器提供程序指令或者数据;

至少一个处理器用于执行程序指令,以实现上述的基于哈希算法的内存结构持久化方法。

本公开实施例所提供的基于哈希算法的内存结构持久化方法,将基于哈希算法的内存结构HashMap分成多个子HashMap,每个子HashMap对应一个用于保存键值对的文件;然后,使用内存映射,将每个子HashMap对应的文件映射到页高速缓冲存储器中。本公开实施例充分利用内存映射的优势,将HashMap的数据实时新增到页高速缓冲存储器中,有效保障数据的安全性。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。

显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出本公开实施例中一种基于哈希算法的内存结构持久化方法流程图;

图2示出本公开实施例中新增键值对的流程图;

图3示出本公开实施例中键值对新增、查询和更新过程的流程图;

图4示出本公开实施例的一种应用场景示意图;

图5示出本公开实施例中一种基于哈希算法的内存结构持久化装置示意图;

图6示出本公开实施例中一种电子设备的结构框图。

具体实施方式

下面将参考附图更全面地描述示例实施方式。

需要说明的是,示例实施方式能够以多种形式实施,不应被理解为限于在此阐述的范例。

下面结合附图及实施例对本示例实施方式进行详细说明。

图1示出本公开实施例中一种基于哈希算法的内存结构持久化方法流程图,如图1所示,本公开实施例中提供的基于哈希算法的内存结构持久化方法包括步骤S102-S104。

在S102中,将基于哈希算法的内存结构HashMap分成多个子HashMap,每个子HashMap对应一个用于保存键值对的文件。

HashMap,基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get和put)提供稳定的性能。迭代collection视图所需的时间与HashMap实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。

本公开实施例中将HashMap分成若干个较小的HashMap,也就是子HashMap;每个小的HashMap会对应一个文件,用于保存里面的k-v键值对。

在一些实施例中,将HashMap分成多个子HashMap,可以包括预测HashMap的数据量;根据HashMap的数据量,规划子HashMap的数量;基于子HashMap的数量,将HashMap分为子HashMap。

在S104中,使用内存映射,将每个子HashMap对应的文件映射到页高速缓冲存储器中。

页高速缓冲存储器(page cache),又称pcache,简称页高缓。page cache的大小为一页,通常为4K。在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问。

对一个包含千万量级k-v的HashMap,且其value在不停地变化时,本公开实施例能实时得将变化的value进行持久化保存,以保证系统崩溃时HashMap的数据不丢失,且在系统启动时能较快的进行恢复。

在一些实施例中,在新增键值对时,如图2所示,可以包括如下步骤:

S201,在新增键值对时,根据子HashMap的个数,使用哈希算法定位到相应的子HashMap;

S202,将键值对增补到子HashMap对应的内存映射文件尾部;

S203,记录键值对在内存映射文件中的起始位置;

S204,将起始位置作为新的value值,与原始的key放入子HashMap对应的文件中。

本公开实施例中,put(新增)一个k-v键值对时,根据子HashMap的个数,使用hash算法定位到相应的子HashMap;将k-v append到相应的内存映射文件尾部并记录该k-v的起始位置;将该起始位置作为新的value,与原始的key放入子HashMap中。

在一些实施例中,更新(update)过程与上述新增(put)过程类似。

在一些实施例中,在查询一个key时,可以包括如下步骤:在查询一个key时,从子HashMap中查询到内存映射文件的位置;从内存映射文件的位置处解析得到value值。

在一些实施例中,在反序列化时,可以包括如下步骤:在反序列化时,使用多线程并发地从内存映射文件中读取键值对;将读取到的键值对,插入到对应的子HashMap中。

本公开实施例中操作系统允许应用程序把一个文件映射到一块内存进行读写,这种方式与普通的文件读写方式相比,有如下好处:普通的文件读写方式会进行多次的拷贝直到数据到达应用态的内存空间,应用程序才能读写;而内存映射文件的拷贝次数较少,因此比普通的文件读写方式性能高。

另外一点,映射的内存区域在page cache,这个cache不受上层应用的影响,当上层应用异常退出时,只要系统不断电,里面的脏数据会完整的保留而不会随着应用的退出而被操作系统释放删除;因此本公开实施例采用了内存映射的方式。

将原本的HashMap拆分成若干个较小的HashMap,能够提高恢复的速度:为了充分利用现代计算机多核并发的优势,在系统启动时,使用多个线程同时读取内存映射文件进行HashMap的恢复无疑是比较快的;尽管也可以使用多个线程对同一个映射文件的不同段同时进行读取,但这种方式增加了工程上实现的难度。

图3示出了本公开实施例中键值对新增(apped)过程、查询过程和更新(update)过程的流程示意图,图4示出了本公开实施例的一种应用场景示意图,下面结合图3和图4说明本公开实施例提供的基于哈希算法的内存结构持久化方法。

如图3所示,本公开实施例中将HashMap分成若干个较小的HashMap,每个小的HashMap会对应一个文件,用于保存里面的k-v,其中,小的HashMap也可以称为子HashMap。使用内存映射,将各个文件映射到page cache中。

在一些实施例中,可以预测HashMap的数据量,规划HashMap拆分成的小的HashMap的数量;规划磁盘目录,用于保存内存映射文件;每个HashMap对应一个内存映射文件。

put一个k-v键值对时,根据HashMap的个数,使用hash算法定位到相应的HashMap;将k-v append到相应的内存映射文件尾部并记录该k-v的起始位置;将该起始位置作为新的value,与原始的key放入HashMap中。

在一些实施例中,写入key-value,通过hash(key)运算,选择目标HashMap;将key-value append到目标HashMap对应的内存映射文件,并获取该key-value的位置pos;将key-pos写入HashMap。系统重启时,根据内存映射文件的数量,启动对应的线程数,并发读取内存映射文件恢复HashMap

查询一个key时,从HashMap中查询到内存映射文件的位置,从内存映射文件该位置处解析得到value。

update过程与put类似。

反序列化时,可以使用多线程并发地从内存映射文件中读取k-v键值对,插入到对应的HashMap中。

此外,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。

在一些实施例中,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。

基于同一发明构思,本公开实施例中还提供了一种基于哈希算法的内存结构持久化装置,如下面的实施例所述。由于该装置实施例解决问题的原理与上述方法实施例相似,因此该装置实施例的实施可以参见上述方法实施例的实施,重复之处不再赘述。

图5示出本公开实施例中一种基于哈希算法的内存结构持久化装置示意图,如图5所示,该基于哈希算法的内存结构持久化装置500,包括:

拆分模块502,用于将基于哈希算法的内存结构HashMap分成多个子HashMap,每个子HashMap对应一个用于保存键值对的文件;

内存映射模块504,用于使用内存映射,将每个子HashMap对应的文件映射到页高速缓冲存储器中。

在一些实施例中,该基于哈希算法的内存结构持久化装置500,还可以包括:

定位模块,用于在新增键值对时,根据子HashMap的个数,使用哈希算法定位到相应的子HashMap;

增补模块,用于将键值对增补到子HashMap对应的内存映射文件尾部;

记录模块,用于记录键值对在内存映射文件中的起始位置;

存储模块,用于将起始位置作为新的value值,与原始的key放入子HashMap对应的文件中。

在一些实施例中,该基于哈希算法的内存结构持久化装置500,还可以包括:

查询模块,用于在查询一个key时,从子HashMap中查询到内存映射文件的位置;

解析模块,用于从内存映射文件的位置处解析得到value值。

在一些实施例中,该基于哈希算法的内存结构持久化装置500,还可以包括:

键值对读取模块,用于在反序列化时,使用多线程并发地从内存映射文件中读取键值对;

键值对插入模块,用于将读取到的键值对,插入到对应的子HashMap中。

在一些实施例中,拆分模块502,包括:

数据量预测单元,用于预测HashMap的数据量;

数量规划单元,用于根据HashMap的数据量,规划子HashMap的数量;

拆分单元,用于基于子HashMap的数量,将HashMap分为子HashMap。

本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。

关于上述实施例中的基于哈希算法的内存结构持久化装置,其中各个模块执行操作的具体方式已经在有关该基于哈希算法的内存结构持久化方法的实施例中进行了详细描述,此处将不做详细阐述说明。

综上所述,在本申请实施例提供的基于哈希算法的内存结构持久化装置中,能实时得将变化的value进行持久化保存,以保证系统崩溃时HashMap的数据不丢失,且在系统启动时能较快的进行恢复。

应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。

实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。

附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

下面参照图6来描述本公开实施例提供的电子设备。图6显示的电子设备600仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

图6示出本本公实施例提供的一种电子设备600的架构示意图。如图6所示,该电子设备600包括但不限于:至少一个处理器610、至少一个存储器620。

存储器620,用于存储指令。

在一些实施例中,存储器620可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)6201和/或高速缓存存储单元6202,还可以进一步包括只读存储单元(ROM)6203。

在一些实施例中,存储器620还可以包括具有一组(至少一个)程序模块6205的程序/实用工具6204,这样的程序模块6205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。

在一些实施例中,存储器620可存储操作系统。该操作系统可以是实时操作系统(Real Time eXecutive,RTX)、LINUX、UNIX、WINDOWS或OS X之类的操作系统。

在一些实施例中,存储器620中还可以存储有数据。

作为一个示例,处理器610可以读取存储器620中存储的数据,该数据可以与指令存储在相同的存储地址,该数据也可以与指令存储在不同的存储地址。

处理器610,用于调用存储器620中存储的指令,实现本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施方式的步骤。例如,所述处理器610可以执行上述方法实施例的如下步骤:

将基于哈希算法的内存结构HashMap分成多个子HashMap,每个子HashMap对应一个用于保存键值对的文件;

使用内存映射,将每个子HashMap对应的文件映射到页高速缓冲存储器中。

需要说明的是,上述处理器610可以是通用处理器或者专用处理器。处理器610可以包括一个或者一个以上处理核心,处理器610通过运行指令执行各种功能应用以及数据处理。

在一些实施例中,处理器610可以包括中央处理器(central processing unit,CPU)和/或基带处理器。

在一些实施例中,处理器610可以根据各个控制指令中携带的优先级标识和/或功能类别信息确定一个指令。

本公开中,处理器610和存储器620可以单独设置,也可以集成在一起。

作为一个示例,处理器610和存储器620可以集成在单板或者系统级芯片(systemon chip,SOC)上。

如图6所示,电子设备600以通用计算设备的形式表现。电子设备600还可以包括总线630。

总线630可以为表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器、外围总线、图形加速端口、处理器或者使用多种总线结构中的任意总线结构的局域总线。

电子设备600也可以与一个或多个外部设备640(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备600交互的设备通信,和/或与使得该电子设备600能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口650进行。

并且,电子设备600还可以通过网络适配器660与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。

如图6所示,网络适配器660通过总线630与电子设备600的其它模块通信。

应当明白,尽管图中未示出,可以结合电子设备600使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。

可以理解的是,本公开实施例示意的结构并不构成对电子设备600的具体限定。在本公开另一些实施例中,电子设备600可以包括比图6所示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图6所示的部件可以以硬件,软件或软件和硬件的组合实现。

本公开还提供了一种计算机可读存储介质,其上存储有计算机指令,计算机指令被处理器执行时实现上述方法实施例描述的基于哈希算法的内存结构持久化方法。

本公开实施例中计算机可读存储介质,为可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的计算机指令。

作为一个示例,计算机可读存储介质是非易失性存储介质。

在一些实施例中,本公开中的计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、U盘、移动硬盘或者上述的任意合适的组合。

本公开实施例中,计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机指令(可读程序代码)。

这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。

在一些示例中,计算机可读存储介质上包含的计算指令可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。

本公开实施例还提供一种计算机程序产品,计算机程序产品存储有指令,指令在由计算机执行时,使得计算机实施上述方法实施例描述的基于哈希算法的内存结构持久化方法。

上述指令可以是程序代码。在具体实施时,程序代码可以由一种或多种程序设计语言的任意组合来编写。

程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。

程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。

在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。

本公开实施例还提供了一种芯片,包括至少一个处理器和接口;

接口,用于为至少一个处理器提供程序指令或者数据;

至少一个处理器用于执行程序指令,以实现上述方法实施例描述的基于哈希算法的内存结构持久化方法。

在一些实施例中,该芯片还可以包括存储器,该存储器,用于保存程序指令和数据,存储器位于处理器之内或处理器之外。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。

本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由所附的权利要求指出。

技术分类

06120116332464