一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据存储方法、装置、电子设备及存储介质与流程

2022-12-26 08:03:13 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种数据存储方法、装置、电子设备及存储介质。


背景技术:

2.哈希表是根据关键码值直接访问的数据结构,通过“数组 链表”的二层结构来存储相关数据。具体的,可以把关键码值映射到哈希表中一个内存位置来直接访问记录,以加快查找的速度。
3.在游戏业务中,多个玩家账号的游戏数据均可以通过哈希表来存储。而整个哈希表则被存储在内存中。当需要对一个新的玩家账号的游戏数据进行存储时,可以先根据新玩家账号的账号信息来生成一个内存单元地址,然后在该内存单元地址指向的链表中新增节点,最后在新增的节点中存储该玩家账号的游戏数据即可。
4.随着玩家账号数量的不断增加,哈希表所占用的存储空间将不断增大,这将很容易导致内存存储空间不足的问题发生。由于游戏玩家经常出现回流(玩家在未登录游戏半年后又回来重新登录)现象,所以哈希表里中的数据还不能随意删除。那么如何解决在不删除数据的前提下解决哈希表的存储,成为亟需解决的问题。


技术实现要素:

5.有鉴于此,本技术提供了一种数据存储方法、装置、电子设备即存储介质。根据更新时间将活跃的链表存储在内存中,将不活跃的链表存储在硬盘中。这样,内存中始终存储有一定量的链表。在不删除存储数据的同时保证内存中存储的都是当前活跃的数据,同时还避免了内存不够用的情况发生。
6.本技术实施例第一方面提供了一种数据存储方法,在存储包含有第一历史数据及第二历史数据的存储数据时,通过哈希表存储针对第一历史数据生成的内存单元地址,通过内存单元地址指向的链表以数据对的方式存储第一历史数据及第二历史数据,该方法包括:
7.接收包含有第一数据及第二数据的待存储数据的存储请求,响应存储请求生成针对第一数据的第一内存单元地址。
8.当哈希表中已经存在的内存单元地址的数量等于预设地址数量时,确定哈希表对应的链表中满足指定条件的非活跃链表。其中,非活跃链表为预设时长内未被访问的链表。
9.将非活跃链表存储的数据存储在硬盘中,并在内存中删除非活跃链表。
10.删除哈希表中指向非活跃链表的内存单元地址。
11.将第一内存单元地址存储至哈希表中,并在第一内存单元地址指向的目标链表中以数据对的方式存储第一数据及第二数据。
12.在一个可选的实施方式中,该方法还包括:
13.当哈希表中已经存在的内存单元地址的数量小于预设地址数量时,判断哈希表中
是否存储有第一内存单元地址。
14.若哈希表中存储有第一内存单元地址,则在第一内存单元指向的目标链表中以数据对的方式存储第一数据及第二数据。
15.在一个可选的实施方式中,该方法还包括:
16.若哈希表中未存储有第一内存单元地址,则将第一内存单元地址存储在哈希表中。
17.在内存中建立第一内存单元地址所指向的目标链表,并在目标链表中以数据对的方式存储第一数据及第二数据。
18.在一个可选的实施方式中,在内存中建立目标链表之前,该方法还包括:
19.查询硬盘中是否存储有第一数据及第二数据。
20.若硬盘中存储有第一数据及第二数据,则将硬盘中存储有第一数据及第二数据的链表确定为目标链表。
21.在内存中建立目标链表,包括:
22.将目标链表从硬盘恢复至内存中。
23.在一个可选的实施方式中,确定哈希表对应的链表中满足指定条件的非活跃链表,包括:
24.分别获取哈希表对应的所有链表对应的最后一次访问时刻。
25.根据最后一次访问时刻,对所有链表进行优先级排序。
26.根据优先级排序结果,确定最后一次访问时刻最早的链表为非活跃链表。
27.在一个可选的实施方式中,该方法还包括:
28.当在目标链表中存储完第一数据及第二数据后,更新目标链表的最后一次访问时刻。
29.或当将目标链表从硬盘恢复至内存中后,更新目标链表的最后一次访问时刻。
30.在一个可选的实施方式中,第一数据包括账号标识和服务器标识。生成针对第一数据的第一内存单元地址,包括:
31.对账号标识别进行哈希运算,得到初始哈希值。
32.根据初始哈希值和服务器标识,得到第一数据的第一内存单元地址。
33.在一个可选的实施方式中,当多个待存储数据对应的服务器标识相同时,多个待存储数据对应的多个第一内存单元地址所指向的目标链表相同。
34.在一个可选的实施方式中,该方法还包括:
35.接收包含有第一数据的待查询数据的查询请求,响应查询请求确定针对第一数据的第一内存单元地址。
36.当哈希表中不存在第一内存单元地址时,查询硬盘中是否存储有包含第一数据的数据对。
37.当硬盘中存储有包含第一数据的数据对的目标链表时,根据查询请求反馈数据对包括的第二数据。
38.将目标链表恢复至内存中,并将第一内存单元地址存储至哈希表中。
39.在一个可选的实施方式中,该方法还包括:
40.当哈希表中存在第一内存单元地址时,在内存中确定第一内存单元地址指向的目
标链表。
41.根据目标链表中包含的数据对,确定第一数据对应的第二数据。
42.响应查询请求,发送第二数据。
43.在一个可选的实施方式中,当发送第二数据后,该方法还包括:
44.根据第二数据的发送时刻更新目标链表的最后一次访问时刻。
45.本技术实施例第二方面提供了一种数据存储装置,在存储包含有第一历史数据及第二历史数据的存储数据时,通过哈希表存储针对第一历史数据生成的内存单元地址,通过内存单元地址指向的链表以数据对的方式存储第一历史数据及第二历史数据。该数据存储装置包括:
46.接收单元,用于接收包含有第一数据及第二数据的待存储数据的存储请求。
47.生成单元,用于响应存储请求生成针对第一数据的第一内存单元地址。
48.确定单元,用于当哈希表中已经存在的内存单元地址的数量等于预设地址数量时,确定哈希表对应的链表中满足指定条件的非活跃链表。其中,非活跃链表为预设时长内未被访问的链表。
49.存储单元,用于将非活跃链表存储的数据存储在硬盘中。
50.处理单元,用于在内存中删除非活跃链表;并删除哈希表中指向非活跃链表的内存单元地址。
51.存储单元,还用于将第一内存单元地址存储至哈希表中,并在第一内存单元地址指向的目标链表中以数据对的方式存储第一数据及第二数据。
52.在一个可选的实施方式中,该数据存储单元还包括判断单元。
53.判断单元,用于当哈希表中已经存在的内存单元地址的数量小于预设地址数量时,判断哈希表中是否存储有第一内存单元地址。
54.存储单元,还用于若判断单元判断哈希表中存储有第一内存单元地址,则在第一内存单元指向的目标链表中以数据对的方式存储第一数据及第二数据。
55.在一个可选的实施方式中,存储单元,还用于若哈希表中未存储有第一内存单元地址,则将第一内存单元地址存储在哈希表中。在内存中建立第一内存单元地址所指向的目标链表,并在目标链表中以数据对的方式存储第一数据及第二数据。
56.在一个可选的实施方式中,判断单元,还用于查询硬盘中是否存储有第一数据及第二数据。
57.确定单元,还用于判断单元判断硬盘中存储有第一数据及第二数据时,将硬盘中存储有第一数据及第二数据的链表确定为目标链表。
58.存储单元,具体用于将目标链表从硬盘恢复至内存中。
59.在一个可选的实施方式中,确定单元,具体用于分别获取哈希表对应的所有链表对应的最后一次访问时刻。根据最后一次访问时刻,对所有链表进行优先级排序。根据优先级排序结果,确定最后一次访问时刻最早的链表为非活跃链表。
60.在一个可选的实施方式中,处理单元,还用于当在目标链表中存储完第一数据及第二数据后,更新目标链表的最后一次访问时刻。或当将目标链表从硬盘恢复至内存中后,更新目标链表的最后一次访问时刻。
61.在一个可选的实施方式中,第一数据包括账号标识和服务器标识。生成单元,具体
用于对账号标识别进行哈希运算,得到初始哈希值。根据初始哈希值和服务器标识,得到第一数据的第一内存单元地址。
62.在一个可选的实施方式中,当多个待存储数据对应的服务器标识相同时,多个待存储数据对应的多个第一内存单元地址所指向的目标链表相同。
63.在一个可选的实施方式中,接收单元,还用于接收包含有第一数据的待查询数据的查询请求,响应查询请求确定针对第一数据的第一内存单元地址。
64.处理单元,还用于当哈希表中不存在第一内存单元地址时,查询硬盘中是否存储有包含第一数据的数据对。当硬盘中存储有包含第一数据的数据对的目标链表时,根据查询请求反馈数据对包括的第二数据。
65.存储单元,还用于将目标链表恢复至内存中,并将第一内存单元地址存储至哈希表中。
66.在一个可选的实施方式中,确定单元,还用于当哈希表中存在第一内存单元地址时,在内存中确定第一内存单元地址指向的目标链表。根据目标链表中包含的数据对,确定第一数据对应的第二数据。
67.处理单元,还用于响应查询请求,发送第二数据。
68.在一个可选的实施方式中,处理单元,还用于发送第二数据后,根据第二数据的发送时刻更新目标链表的最后一次访问时刻。
69.本技术实施例第三方面还提供了一种电子设备,包括:存储器和处理器,存储器和处理器耦合。
70.其中,存储器用于存储一条或多条计算机指令。
71.处理器用于执行一条或多条计算机指令,以实现上述第一方面所述的数据存储方法。
72.本技术实施例第四方面还提供了一种计算机可读存储介质,其上存储有一条或多条计算机指令,其特征在于,该指令被处理器执行以实现上述任意一种技术方案所述的数据存储方法。
73.本技术实施例所提供的技术方案,可以在内存和硬盘中混合存储业务数据。首先,存储在内存中的哈希表用于存储内存单元地址,而各内存单元地址分别内存中的不同链表,链表则以数据对的方式存储业务数据(第一数据和第二数据)。当接收到包含有待存储数据的存储请求时,先根据待存储数据中的第一数据生成第一内存单元地址,然后判断哈希表是否还有空间存储该第一内存单元地址。如果哈希表中没有空间的话,就在哈希表对应的多个链表中寻找很久没有被访问的非活跃链表。然后将该非活跃链表存储在硬盘当中,并且删除哈希表中非活跃链表对应的内存单元地址。这样,就会释放一部分内存存储空间。接着在哈希表中存储第一内存单元地址,并且在内存中建立第一内存单元地址指向的目标链表,最后在目标链表中存储待存储数据,实现在内存中存储待存储数据的目的。
74.在上述技术方案中,在内存中建立新目标链表之前将非活跃链表挪至到了硬盘中进行存储,就会避免内存不足的问题出现。而同时使用内存和硬盘来混合存储业务数据,可以在不扩大内存存储空间的前提下,实现对业务数据的完整存储。并且上述方法可以保证内存中存储的业务数据都是被频繁访问或最新更新的数据,不活跃的业务数据将被挪至硬盘中进行存储,因此可以提高内存的有效占用率,避免内存资源的浪费。
附图说明
75.为了更清楚地说明本技术实施例的技术方案,下面将对本技术实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
76.图1是本技术实施例提供的一种数据存储方法的流程示意图;
77.图2为本技术实施例提供的一种数据读取方法的流程示意图;
78.图3是本技术实施例提供的一种数据存储装置的结构示意图;
79.图4是本技术实施例提供的一种电子设备的结构示意图。
具体实施方式
80.本技术提供了一种数据存储方法、装置、电子设备即存储介质。根据更新时间将活跃的链表存储在内存中,将不活跃的链表存储在硬盘中。这样,内存中始终存储有一定量的链表。在不删除存储数据的同时保证内存中存储的都是当前活跃的数据,同时还避免了内存不够用的情况发生。
81.为了使本领域的技术人员能够更好的理解本技术的技术方案,下面结合本技术实施例中的附图,对本技术进行清楚、完整地描述。但本技术能够以很多不同于上述描述的其他方式进行实施,因此,基于本技术提供的实施例,本领域普通技术人员在不经过创造性劳动的情况下,所获得的所有其他实施例,都应属于本技术保护的范围。
82.需要说明的是,本技术的权利要求书、说明书及附图中的术语“第一”、“第二”、“第三”等是用于区别类似的对象,并不用于描述特定的顺序或先后次序。这样使用的数据在适当情况下是可以互换的,以便于本文所描述的本技术的实施例,能够以除了在本文图示或描述的内容以外的顺序实施。此外,术语“包括”、“具有”以及他们的变形形式,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
83.哈希表也被成为散列表,是一种根据关键码值直接进行数据访问的数据结构。也就是说,哈希表通过把关键码值映射到链表中的一个位置来访问数据,这样就可以加快查找的速度。具体的,当给定一个关键码时,可以通过哈希函数对关键码进行计算,其计算结果就是该关键码对应的链表中的存储位置。其中,哈希表的本质就是数组,用于存储各存储数据对应的内存单元地址。哈希表一般采用“数组 链表”的二层结构来进行数据存储,以使得每个数据的访问效率接近o(1)。
84.在网络游戏场景中,可以使用哈希表对各个玩家的游戏数据进行存储。例如,玩家的等级数据、装备数据或者战绩数据等都可以利用哈希表来进行存储。在哈希表中,可以采用key-value键值对(数据对)的方式来记录玩家的游戏数据。其中,玩家的账号数据作为key,与该账号相关的游戏数据作为value。在进行游戏数据查询时,可以根据玩家的账号数据来查询哈希表,通过哈希表来确定游戏数据的存储位置,然后根据该存储位置直接读出游戏数据即可。具体的,可以对玩家的账号数据进行哈希运算,然后根据哈希运算结果来确定该账号的内存单元地址。然后通过查询哈希表获取内存单元地址指向的链表结构,并根
据该内存单元地址找到该链表结构中的目标存储单元,接着读取目标存储单元存储的数据,获得该账号对应的游戏数据。
85.随着玩家账号数量的不断增加,key-value对的数量将不断的增大,整个哈希表所对应的内存存储空间也将不断增大,这势必会导致内存存储空间不足的问题发生。而在游戏业务中,由于游戏玩家经常出现回流(玩家在未登录游戏半年后又回来重新登录)现象,所以哈希表对应的存储数据又不能随意删除。而在内存中存储大量非活跃玩家的游戏数据也将导致内存有效占用率低,严重浪费内存资源。那么如何提高内存的有效占用率,同时解决内存存储空间不足的问题就成为亟需解决的问题。
86.针对上述问题,本技术提供了一种数据存储方法、装置、电子设备即存储介质。可以在不扩充内存存储空间的情况下,对业务数据进行完整的存储。通过根据更新时间将活跃的链表存储在内存中,将不活跃的链表存储在硬盘中的方式,保证内存中存储的都是当前活跃的数据。从而提高了内存的有效占用率,减少内存资源的浪费。下面结合具体实施例及附图对本技术所述的方法、装置、终端以及计算机可读存储介质做进一步详细说明。
87.下面对利用哈希表来存储业务数据的过程以及利用哈希表来读取业务数据过程分别进行介绍:
88.(一)、利用哈希表存储业务数据的过程:
89.图1为本技术实施例提供的一种数据存储方法的流程示意图。需要说明的是,该流程示意图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,同时,在某些情况下,可以以不同于该流程示意图中示出的逻辑顺序执行所示出的步骤。
90.如图1所示,本技术实施例所提供的数据存储方法包括以下几个步骤:
91.101、接收待存储数据的存储请求。
92.当接收到新的待存储数据的存储请求时,就需要在内存中为待存储数据确定一个存储空间,保证新增的待存储数据存储在内存中。这是因为内存的读取速度快,便于用户快速查询存储数据。
93.其中,待存储数据包括第一数据和第二数据,第一数据和第二数据相互对应。示例性的,若待存储数据是游戏数据时,第一数据就可以是玩家账号数据,而第二数据则为该玩家账号对应的游戏数据。具体的,需要运用数据对(键值对)的方式来存储第一数据和第二数据,以方便用户查询。
94.102、根据待存储数据中的第一数据确定第一内存单元地址。
95.而在内存中存储数据时,可以利用哈希表来存储数据。首先需要为待存储数据指定一个内存单元地址,然后在内存中该内存单元地址指向的链表中存储数据。其中,哈希表用来存储内存单元地址和链表的对应关系。示例性的,待存储数据中的第一数据可以作为查询标识。利用第一数据来得到第一内存单元地址。然后在第一内存单元地址对应的目标链表的目标存储单元中存储待存储数据。
96.示例性的,可以先对第一数据进行哈希运算,然后根据哈希运算结果来确定第一内存单元地址。接着建立第一内存单元地址与某一链表的一个存储单元之间的指向关系。该存储单元则可以通过数据对的方式来存储第一数据和与第一数据对应的第二数据。在上述例子中,若第一数据是玩家账号数据,那么就需要对该玩家账号数据进行哈希运算,以此得到该玩家对应的第一内存单元地址。
97.示例性的,在确定第一内存单元地址时,还可以获取该玩家对应的服务器标识,利用哈希运算结果和服务器标识组合的方式来得到第一内存单元地址。即利用哈希函数对玩家账户数据进行哈希计算,得到哈希计算结果,再将哈希计算结果与服务器标识进行组合,得到该待存储数据对应的第一内存单元地址。例如,对于一个玩家账户数据进行哈希计算的结果为1234,如果其对应的服务器的标识为007,那么该账号标识对应的第一内存单元地址则为1234007。然后建立该第一内存单元地址与目标链表的指向关系,根据指向关系在目标链表中存储该玩家账户数据对应的游戏数据。
98.可以理解的,属于同一个服务器的多个玩家账户数据对应的游戏数据可以存储在一个链表中,这样可以提高数据查询的速度。因此,先根据待存储账号的账号信息,确定待存储账号的账号标识以及其对应的服务器的服务器标识。因此,可以根据服务器标识确定一个链表为目标链表,然后分别计算每个玩家账户对应的内存单元地址。在建立内存单元地址对应的指向关系时,使得属于同一个服务器的多个玩家账户的内存单元地址分别指向同一个链表的不同存储单元中。保证这些玩家账户的游戏数据存储在同一个链表中。
99.103、判断哈希表中是否存在第一内存单元地址。若存在则执行步骤104,若不存在则执行步骤105。
100.当确定好待存储数据对应的第一内存单元地址后,首先要确定哈希表是否存在该第一内存单元地址。如果存在,那么直接利用原有的指向关系,在原有的第一内存单元地址指向的目标链表中更新存储数据即可。如果不存在,那么就需要在内存中新增目标链表,再在目标链表中增加节点进行待存储数据的存储。
101.104、在第一内存单元地址指向的目标链表中存储待存储数据。
102.如果第一内存单元地址已经在哈希表中存在,那么说明已经存储过第一数据对应的存储数据了。此时就需要更新第一数据对应的存储数据即可。即在原来存在的第一内存单元地址所指向的链表上存储待存储数据,更新对应的存储单元中的数据。
103.105、判断哈希表中已经存在的内存单元地址的数量是否等于预设地址数量。若等于则执行步骤106,若不等于则执行步骤110。
104.如果哈希表中不存在第一内存单元地址,那么说明待存储数据是新增的业务数据。那么就需要在内存中为待存储单元找寻存储空间,将其存储在内存中。为了防止内存不足的问题发生,可以预先根据内存的存储空间容量以及哈希表的存储容量预设一个数量阈值,即预设地址数量。该预设地址数量用来控制哈希表中存储的内存单元地址的个数,即控制哈希表中存储的内存单元地址的个数不超过预设地址数量,这样就能有效的控制内存占用状态,无需对内存存储空间进行无限制的扩容。
105.可以理解的,对于固定容量的内存空间而言,内存中各链表的节点越多,预设地址数量就越小。这样就可以有效控制内存中存储的数据量大小,保证内存的存储空间一直是够用的。
106.106、确定哈希表对应的链表中满足指定条件的非活跃链表。
107.当哈希表中存储的内存单元地址的个数已经等于预设地址数量时,说明内存中已经存储了大量的数据,若继续再存储新的数据就极有可能导致内存不足的问题。那么此时,就可以对内存中存储的所有链表进行分析,确定其中的非活跃链表。然后将非活跃链表存储在其他的存储空间中,释放非活跃链表所占用的内存空间。然后再利用该部分的内存空
间来存储活跃的新增数据。
108.其中,非活跃用来表征数据被访问的频率以及被访问的时刻。如果某个数据在很长一段时间内未被访问,并且近期也没有被访问,则说明该数据为非活跃数据。而某个数据经常被访问,且近期也常常被访问,那么该数据则为活跃数据。示例性的,可以根据每一个链表的最后一次访问时刻来确定所有链表中的非活跃链表。其中,最后一次访问时刻可以是最后一次被查询的时刻或者最后一次进行数据更新的时刻等,在此不做限定。可以理解的,如果最后一次访问时刻越近,说明该链表中存储的数据正处于被频繁的更新或者访问的状态,那么该链表的活跃度就比较高,应该将其存储在内存中。这样存储在内存中的链表可以被快速查询和更新,提高访问效率。而最后一次访问时刻越远,说明该链表中存储的数据已经很久没有被访问和使用,那么该链表的活跃度较低,无需将其存储在访问速度较快的内存中。可以将其存储在硬盘中,待有查询或者更新请求时,再将其挪至内存中进行存储。
109.示例性的,可以根据内存中每个链表对应的最后一次访问时刻来对各链表进行优先级排序。最后一次访问时刻越早,优先级则越高。然后可以将最后一次访问时刻最早的链表确定为非活跃列表。
110.107、将非活跃链表存储的数据存储在硬盘中,并在内存中删除非活跃链表。
111.可以理解的,非活跃链表中存储的数据不会被频繁的访问和更新。示例性的,在游戏场景中,非活跃链表可以存储很久没有登录游戏的历史用户的游戏数据。因此,非活跃链表无需存储在内存中,而可以为其创建硬盘文件,将其存储在硬盘之中。由于硬盘的存储空间更大,读取速度更慢,所以利用硬盘存储非活跃链表对应的数据,在保证哈希表的数据完整性的前提下,很容易的就可以完成存储量的扩容,同时还可以释放内存,减少内存存储空间的浪费。
112.108、删除哈希表中指向非活跃链表的内存单元地址。
113.同时,当非活跃链表被挪至硬盘中存储后,那么就无法在内存中访问非活跃链表。所以需要将哈希表中指向非活跃链表的内存单元地址进行删除。可以理解的,哈希表中指向非活跃链表的内存单元地址可能有多个,当有多个内存单元地址指向非活跃链表时,需要将其全部删除。
114.109、将第一内存单元地址存储至哈希表中,并在第一内存单元地址指向的目标链表中存储待存储数据。
115.在将非活跃链表对应的数据存储到硬盘之后,就可以释放一部分的内存空间。然后再在该内存空间中新建第一内存单元地址指向的目标链表,并在目标链表中以数据对的方式待存储数据中的第一数据和第二数据。
116.示例性的,在新建目标链表之前,还需要查询硬盘中的存储数据。看硬盘中是否存储有待存储数据。如果硬盘中的某个链表的存储单元中存储有待存储数据,那么说明该链表在此恢复活跃状态,此时直接将该链表恢复至内存当中即可。并且需要重新建立第一内存单元地址与该链表的指向关系。如果硬盘中没有找到待存储数据,则说明该待存储数据是新增的数据,那么就需要在内存中确定目标链表,然后建立第一内存单元地址与目标链表的存储单元的指向关系,最后在目标链表的存储单元中以数据对的方式待存储数据中的第一数据和第二数据。
117.110、在哈希表中直接存储第一内存单元地址,并在第一内存单元地址指向的目标链表中存储待存储数据。
118.而如果哈希表中存储的内存单元地址的个数小于预设地址数量时,说明内存中还能存储一部分数据。那么为了提高数据的访问更新速度,就直接在内存中确定第一内存单元地址指向的目标链表即可。最后在目标链表中增加节点,以数据对的方式待存储数据中的第一数据和第二数据。
119.可以理解的,当内存中的第一内存单元地址指向的目标链表中,存储好第一数据和第二数据后,需要更新目标链表的最后一次访问时间。以供下一次数据存储时确定内存中的非活跃链表。可以理解的,一个链表一旦被查询、被访问或者数据被更新时,都需要根据查询时间、访问时间和更新时间来更新该链表的最后一次访问时间。其中,数据更新的情况包括链表新增节点、链表中任一个节点的数据被修正等,在此不做限定。
120.本技术实施例所提供的技术方案,可以在内存和硬盘中混合存储业务数据。首先,存储在内存中的哈希表用于存储内存单元地址,而各内存单元地址分别内存中的不同链表,链表则以数据对的方式存储业务数据(第一数据和第二数据)。当接收到包含有待存储数据的存储请求时,先根据待存储数据中的第一数据生成第一内存单元地址,然后判断哈希表是否还有空间存储该第一内存单元地址。如果哈希表中没有空间的话,就在哈希表对应的多个链表中寻找很久没有被访问的非活跃链表。然后将该非活跃链表存储在硬盘当中,并且删除哈希表中非活跃链表对应的内存单元地址。这样,就会释放一部分内存存储空间。接着在哈希表中存储第一内存单元地址,并且在内存中建立第一内存单元地址指向的目标链表,最后在目标链表中存储待存储数据,实现在内存中存储待存储数据的目的。
121.在上述技术方案中,在内存中建立新目标链表之前将非活跃链表挪至到了硬盘中进行存储,就会避免内存不足的问题出现。而同时使用内存和硬盘来混合存储业务数据,可以在不扩大内存存储空间的前提下,实现对业务数据的完整存储。并且上述方法可以保证内存中存储的业务数据都是被频繁访问或最新更新的数据,不活跃的业务数据将被挪至硬盘中进行存储,因此可以提高内存的有效占用率,避免内存资源的浪费。
122.(二)利用哈希表读取业务数据的过程:
123.结合图1所示的实施例,下面对利用哈希表读取业务数据的过程进行简单的介绍:
124.图2为本技术实施例提供的一种数据读取方法的流程示意图。如图2所示,该数据读取方法包括以下几个步骤:
125.201、接收待查询数据的查询请求。
126.当接收到包含有第一数据的待查询数据的查询请求时,需要先在哈希表中查找该第一数据对应的第一内存单元地址,看内存中是否存储有该待查询数据。如果有,则直接查询内存,获取第一数据对应的第二数据即可。如果没有,则需要去硬盘中进行查找。
127.202、根据待查询数据中的第一数据确定第一内存单元地址。
128.可以理解的,待查询数据中的第一数据与存储位置相关。而哈希表则用来存储内存单元地址和存储位置的对应关系。那么就需要根据待查询数据中的第一数据先确定待查询数据的第一内存单元地址,看哈希表中是否存在该第一内存单元地址对应的存储位置。
129.203、判断哈希表中是否存在第一内存单元地址。若存在则执行步骤204,若不存在则执行步骤207。
130.可以理解的,利用第一数据确定的第一内存单元地址即为该待查询数据应该存储的存储空间地址。那么在确定好第一内存单元地址后,就需要先判断内存中是否存在该第一内存单元地址指向的链表存储单元,如果有,则直接在内存中访问链表中的存储单元,进行数据读取即可。如果没有,就需要再次查询硬盘,判断硬盘中是否存储有待查询数据。
131.204、确定内存中的第一内存单元地址指向的目标链表。
132.如果在哈希表中存在第一内存单元,那么就根据哈希表确定第一内存单元对应的目标链表,然后直接访问第一内存单元指向的目标链表的目标存储单元,获取待查询数据对应的第二数据。
133.205、根据第一内存单元地址查询目标链表,获取待查询数据对应的第二数据进行读取。
134.可以理解的,目标链表存在有多个存储单元,每一个存储单元都存储有不同的数据。那么在确定完目标链表之后,还需要找到第一内存单元地址指向的目标链表中的存储单元。然后访问存储单元进行数据读取即可。
135.206、响应查询请求,反馈第二数据。
136.在得到第二数据后,就需要响应查询请求,反馈查询到的第二数据。可以理解的,在反馈完第二数据之后,还需要更新目标链表的最后一次访问时刻。该最后一次访问时刻用于表征目标链表的活跃程度。即目标链表的数据被访问过。这样,在后续进行数据存储时,最后一次访问时刻将作为目标链表是存储在内存中,还是存储在硬盘的依据。
137.207、判断硬盘中是否存储有第一数据。若存在,则执行步骤208。若不存在,则结束数据查询过程。
138.如果哈希表中不存在第一内存地址,那么就说明内存中未存储有待查询数据。此时就需要在硬盘中进行二次查找。若硬盘中存储有第一数据,那么就需要访问和查询硬盘中第一数据对应的目标链表,以获取第一数据对应的第二数据。如果硬盘中不存在第一数据,那么就说明并未存储有待查询数据,因此查询失败。
139.208、确定硬盘中第一数据对应的第二数据,并确定第一数据对应的目标链表。
140.如果在硬盘中查找到第一数据时,那么直接对第一数据对应的存储空间进行访问,获得第一数据对应的第二数据即可。同时,硬盘中的存储数据也是以链表的方式来进行存储的,因此,还需要确定第一数据对应的硬盘中的目标链表。当目标链表中的第一数据被查询时,说明目标链表恢复了活跃状态,为了提高目标链表的查询访问速度,就需要将其恢复至内存中。
141.209、响应查询请求,反馈第二数据。
142.在硬盘中得到第二数据后,同样也就需要响应查询请求,反馈查询到的第二数据。可以理解的,在反馈完第二数据之后,也需要更新目标链表的最后一次访问时刻。该最后一次访问时刻用于表征目标链表的活跃程度。即目标链表的数据被访问过。这样,在后续进行数据存储时,最后一次访问时刻将作为目标链表是存储在内存中,还是存储在硬盘的依据。
143.210、在哈希表中存储第一内存单元地址。
144.硬盘中的目标链表被访问查询后,说明目标链表再次被使用,其变成了活跃链表。那么为了提高目标链表的读取速度,就需要将目标链表挪至内存中进行存储。示例性的,需要先在哈希表中存储第一内存地址,然后在将目标链表恢复至内存中,然后在硬盘中删除
目标链表对应的数据。
145.可以理解的,在将目标链表的数据挪至内存时,也需要先判断内存存储空间的是否够用。示例性的,如果哈希表中的内存单元地址的个数小于预设地址个数时,那么就直接将目标链表对应的数据存储在内存中即可。如果哈希表中的内存单元地址的个数等于预设地址个数时,那么说明内存中无法新增一个链表。那么就还是需要根据内存中存储的每一个链表的最后一次访问时间来选择非活跃链表,将该非活跃链表对应的数据存储到硬盘中,在内存中删除非活跃链表对应的业务数据以释放内存空间,最后再利用释放的内存空间来存储目标链表对应的数据。
146.211、将目标链表恢复至内存中,并建立第一内存单元地址与目标链表的指向关系。
147.最后,建立第一内存单元地址与目标链表的指向关系,方便利用第一内存单元地址来查询目标链表。
148.在上述实施例中,由于哈希表是根据内存加硬盘的混合存储方式来进行数据存储的,那么在进行数据读取时,可以先去内存中查找待查询数据对应的目标链表。如果在内存中查找到目标链表时,直接对目标链表的存储单元进行访问,完成数据读取过程。如果内存中未查找到目标链表时,则去硬盘中查找待查询数据对应的目标链表。如果在内存中查找到目标链表,那就需要对硬盘中的目标链表的节点进行访问,完成数据读取。并且需要将目标链表挪至内存中进行存储。这样可以保证活跃链表被存储在内存中,以提高活跃链表的读取速度。
149.图3为本技术实施例提供的一种数据存储装置的结构示意图,以下结合图3对本实施例提供的数据装置进行详细描述。以下描述所涉及的实施例用于解释本技术的技术方案,并不是实际使用的限定。
150.在存储包含有第一历史数据及第二历史数据的存储数据时,通过哈希表存储针对第一历史数据生成的内存单元地址,通过内存单元地址指向的链表以数据对的方式存储第一历史数据及第二历史数据。
151.该数据存储装置包括:
152.接收单元301,用于接收包含有第一数据及第二数据的待存储数据的存储请求。
153.生成单元302,用于响应存储请求生成针对第一数据的第一内存单元地址。
154.确定单元303,用于当哈希表中已经存在的内存单元地址的数量等于预设地址数量时,确定哈希表对应的链表中满足指定条件的非活跃链表。其中,非活跃链表为预设时长内未被访问的链表。
155.存储单元304,用于将非活跃链表存储的数据存储在硬盘中。
156.处理单元305,用于在内存中删除非活跃链表;并删除哈希表中指向非活跃链表的内存单元地址。
157.存储单元304,还用于将第一内存单元地址存储至哈希表中,并在第一内存单元地址指向的目标链表中以数据对的方式存储第一数据及第二数据。
158.在一个可选的实施方式中,该数据存储单元还包括判断单元306。
159.判断单元306,用于当哈希表中已经存在的内存单元地址的数量小于预设地址数量时,判断哈希表中是否存储有第一内存单元地址。
160.存储单元304,还用于若判断单元判断哈希表中存储有第一内存单元地址,则在第一内存单元指向的目标链表中以数据对的方式存储第一数据及第二数据。
161.在一个可选的实施方式中,存储单元304,还用于若哈希表中未存储有第一内存单元地址,则将第一内存单元地址存储在哈希表中。在内存中建立第一内存单元地址所指向的目标链表,并在目标链表中以数据对的方式存储第一数据及第二数据。
162.在一个可选的实施方式中,判断单元306,还用于查询硬盘中是否存储有第一数据及第二数据。
163.确定单元303,还用于判断单元判断硬盘中存储有第一数据及第二数据时,将硬盘中存储有第一数据及第二数据的链表确定为目标链表。
164.存储单元304,具体用于将目标链表从硬盘恢复至内存中。
165.在一个可选的实施方式中,确定单元303,具体用于分别获取哈希表对应的所有链表对应的最后一次访问时刻。根据最后一次访问时刻,对所有链表进行优先级排序。根据优先级排序结果,确定最后一次访问时刻最早的链表为非活跃链表。
166.在一个可选的实施方式中,处理单元305,还用于当在目标链表中存储完第一数据及第二数据后,更新目标链表的最后一次访问时刻。或当将目标链表从硬盘恢复至内存中后,更新目标链表的最后一次访问时刻。
167.在一个可选的实施方式中,第一数据包括账号标识和服务器标识。生成单元302,具体用于对账号标识别进行哈希运算,得到初始哈希值。根据初始哈希值和服务器标识,得到第一数据的第一内存单元地址。
168.在一个可选的实施方式中,当多个待存储数据对应的服务器标识相同时,多个待存储数据对应的多个第一内存单元地址所指向的目标链表相同。
169.在一个可选的实施方式中,接收单元301,还用于接收包含有第一数据的待查询数据的查询请求,响应查询请求确定针对第一数据的第一内存单元地址。
170.处理单元305,还用于当哈希表中不存在第一内存单元地址时,查询硬盘中是否存储有包含第一数据的数据对。当硬盘中存储有包含第一数据的数据对的目标链表时,根据查询请求反馈数据对包括的第二数据。
171.存储单元304,还用于将目标链表恢复至内存中,并将第一内存单元地址存储至哈希表中。
172.在一个可选的实施方式中,确定单元303,还用于当哈希表中存在第一内存单元地址时,在内存中确定第一内存单元地址指向的目标链表。根据目标链表中包含的数据对,确定第一数据对应的第二数据。
173.处理单元305,还用于响应查询请求,发送第二数据。
174.在一个可选的实施方式中,处理单元305,还用于发送第二数据后,根据第二数据的发送时刻更新目标链表的最后一次访问时刻。
175.本技术实施例所提供的哈希表的存储装置,存储单元可以在内存和硬盘中混合存储业务数据。首先,存储在内存中的哈希表用于存储内存单元地址,而各内存单元地址分别内存中的不同链表,链表则以数据对的方式存储业务数据(第一数据和第二数据)。当接收单元接收到包含有待存储数据的存储请求时,生成单元先根据待存储数据中的第一数据生成第一内存单元地址,然后判断单元判断哈希表是否还有空间存储该第一内存单元地址。
如果判断单元确定哈希表中没有空间的话,确定单元就在哈希表对应的多个链表中寻找很久没有被访问的非活跃链表。然后存储单元将该非活跃链表存储在硬盘当中,处理单元删除哈希表中非活跃链表对应的内存单元地址。这样,就会释放一部分内存存储空间。接着存储单元在哈希表中存储第一内存单元地址,并且在内存中建立第一内存单元地址指向的目标链表,最后存储单元在目标链表中存储待存储数据,实现在内存中存储待存储数据的目的。
176.在上述技术方案中,在内存中建立新目标链表之前将非活跃链表挪至到了硬盘中进行存储,就会避免内存不足的问题出现。而同时使用内存和硬盘来混合存储业务数据,可以在不扩大内存存储空间的前提下,实现对业务数据的完整存储。并且上述方法可以保证内存中存储的业务数据都是被频繁访问或最新更新的数据,不活跃的业务数据将被挪至硬盘中进行存储,因此可以提高内存的有效占用率,避免内存资源的浪费。
177.需要说明的是,数据存储装置中各模块/单元之间的信息交互、执行过程等内容,与本技术中图1至图2对应的各个方法实施例基于同一构思,具体内容可参见本技术前述所示的方法实施例中的叙述,此处不再赘述。
178.接下来介绍本技术实施例提供的一种电子设备,请参阅图4,图4为本技术实施例提供的存储设备的一种结构示意图,电子设备400具体可以表现为虚拟现实vr设备、手机、平板、笔记本电脑、智能穿戴设备、监控数据处理设备或者雷达数据处理设备等,此处不做限定。其中,存储设备400上可以部署有图3对应实施例中所描述的数据存储装置,用于实现图1至图2对应实施例中的功能。具体的,电子设备400包括:接收器801、发射器802、处理器803和存储器804(其中执行设备800中的处理器803的数量可以一个或多个,图4中以一个处理器为例),其中,处理器803可以包括应用处理器8031和通信处理器8032。在本技术的一些实施例中,接收器801、发射器802、处理器803和存储器804可通过总线或其它方式连接。
179.存储器804可以包括只读存储器和随机存取存储器,并向处理器803提供指令和数据。存储器804的一部分还可以包括非易失性随机存取存储器(non-volatile random access memory,nvram)。存储器804存储有处理器和操作指令、可执行模块或者数据结构,或者它们的子集,或者它们的扩展集,其中,操作指令可包括各种操作指令,用于实现各种操作。
180.处理器803控制执行设备的操作。具体的应用中,执行设备的各个组件通过总线系统耦合在一起,其中总线系统除包括数据总线之外,还可以包括电源总线、控制总线和状态信号总线等。但是为了清楚说明起见,在图中将各种总线都称为总线系统。
181.上述本技术实施例揭示的方法可以应用于处理器803中,或者由处理器803实现。处理器803可以是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器803中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器803可以是通用处理器、数字信号处理器(digital signal processing,dsp)、微处理器或微控制器,还可进一步包括专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。该处理器803可以实现或者执行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本技术实施例所公开的方法的步骤可以直接体
现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器804,处理器803读取存储器804中的信息,结合其硬件完成上述方法的步骤。
182.接收器801可用于接收输入的数字或字符信息,以及产生与执行设备的相关设置以及功能控制有关的信号输入。发射器802可用于通过第一接口输出数字或字符信息;发射器802还可用于通过第一接口向磁盘组发送指令,以修改磁盘组中的数据;发射器802还可以包括显示屏等显示设备。
183.本技术实施例中,处理器803中的应用处理器8031,用于执行图1至图2对应实施例中的数据存储方法。需要说明的是,应用处理器8031执行各个步骤的具体方式,与本技术中图1至图2对应的各个方法实施例基于同一构思,其带来的技术效果与本技术中图1至图2对应的各个方法实施例相同,具体内容可参见本技术前述所示的方法实施例中的叙述,此处不再赘述。
184.本技术第七实施例提供了一种计算机可读存储介质,计算机可读存储介质包括计算机指令,计算机指令在被处理器执行时用于实现本技术实施例中任意一种数据存储方法或数据读取方法的技术方案。
185.本技术虽然以较佳实施例公开如上,但其并不是用来限定本技术,任何本领域技术人员在不脱离本技术的精神和范围内,都可以做出可能的变动和修改,因此本技术的保护范围应当以本技术权利要求所界定的范围为准。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献