CN109828966A - 渐进式重哈希方法、装置、计算机设备及存储介质 - Google Patents
渐进式重哈希方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN109828966A CN109828966A CN201910042787.0A CN201910042787A CN109828966A CN 109828966 A CN109828966 A CN 109828966A CN 201910042787 A CN201910042787 A CN 201910042787A CN 109828966 A CN109828966 A CN 109828966A
- Authority
- CN
- China
- Prior art keywords
- hash
- hash table
- data
- former
- target
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 238000003860 storage Methods 0.000 title claims abstract description 54
- 230000005540 biological transmission Effects 0.000 claims abstract description 18
- 230000006870 function Effects 0.000 claims description 84
- 230000005012 migration Effects 0.000 claims description 20
- 238000013508 migration Methods 0.000 claims description 20
- 238000004590 computer program Methods 0.000 claims description 19
- 230000008569 process Effects 0.000 description 17
- 238000013507 mapping Methods 0.000 description 7
- 238000004422 calculation algorithm Methods 0.000 description 5
- 238000009826 distribution Methods 0.000 description 4
- 230000001965 increasing effect Effects 0.000 description 4
- 239000000523 sample Substances 0.000 description 4
- 238000013500 data storage Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000007620 mathematical function Methods 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 230000010485 coping Effects 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000005192 partition Methods 0.000 description 2
- 230000000737 periodic effect Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000000151 deposition Methods 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012067 mathematical method Methods 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000006641 stabilisation Effects 0.000 description 1
- 238000011105 stabilization Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000004083 survival effect Effects 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 238000005303 weighing Methods 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种渐进式重哈希方法、装置、计算机设备及存储介质,所述方法包括:定期从预设应用程序编程接口中获取哈希冲突数量;若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表;若接收到客户端发送的数据操作请求,则将所述数据操作请求对应的数据记录从原哈希表迁移到所述目标哈希表中,并将所述数据记录从原哈希表中删除;若所述原哈希表中的数据全部迁移到所述目标哈希表中,则删除所述原哈希表。本发明的技术方案解决重哈希过程中,因瞬时压力大,系统不能稳定运行的问题。
Description
技术领域
本发明涉及信息处理领域,尤其涉及渐进式重哈希方法、装置、计算机设备及存储介质。
背景技术
哈希(hash)运算,又称为散列运算,是一种压缩映射的数学方法,即通过哈希算法或哈希函数,将任意长度的输入数据映射成固定长度的输出数据,并且使得输出数据的数据空间远小于输入数据的数据空间。其中,哈希函数是能实现哈希运算的数学函数;哈希算法是结合哈希函数而形成的能实现哈希运算的算法,例如,常见的哈希算法有MD5、SHA-1等;用以表示输入数据与输出数据之间的映射关系的表称为哈希表(hash table)。哈希运算被广泛应用在诸如数据存储、数据加密、数据校验等计算机技术领域。
Rehash,中文译为重哈希或重散列,是指因哈希表的大小不能满足需求、造成过多哈希冲突(Hash Collisions)时,对输入数据与输出数据进行重新映射的操作。例如,在数据存储过程中采用了哈希运算,当随着存储数据的增多,哈希冲突也越来越多,此时,数据存储失败的情况也将逐渐增多。为此,需要进行rehash操作,使得减少哈希冲突,保证数据的顺利存储。
其中,若需要重新映射的输入数据和输出数据的数据量庞大,且系统需要同时处理其他任务,则系统在rehash时,可能导致服务器在一段时间内停止服务,这对系统的稳定运行有重大影响。
发明内容
本发明实施例提供一种渐进式重哈希方法、装置、计算机设备及存储介质,以解决重哈希过程中,因瞬时压力大导致系统不能稳定运行的问题。
一种渐进式重哈希方法,包括:
定期从预设应用程序编程接口中获取哈希冲突数量;
若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表;
若接收到客户端发送的数据操作请求,则将所述数据操作请求对应的数据记录从原哈希表迁移到所述目标哈希表中,并将所述数据记录从原哈希表中删除;
若所述原哈希表中的数据全部迁移到所述目标哈希表中,则删除所述原哈希表。
一种渐进式重哈希装置,包括:
冲突统计模块,用于定期从预设应用程序编程接口中获取哈希冲突数量;
哈希表建立模块,用于若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表;
数据迁移模块,用于若接收到客户端发送的数据操作请求,则将所述数据操作请求对应的数据记录从原哈希表迁移到所述目标哈希表中,并将所述数据记录从原哈希表中删除;
空间释放模块,用于若所述原哈希表中的数据全部迁移到所述目标哈希表中,则删除所述原哈希表。
一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述渐进式重哈希方法。
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述渐进式重哈希方法。
上述渐进式重哈希方法、装置、计算机设备及存储介质,定期检测哈希冲突数量是否超过预设阈值;若哈希冲突数量超过预设阈值,则建立目标哈希表;在接收到客户端发送的数据操作请求时,将数据操作请求中对应的数据记录迁移到目标哈希表中,并将其从原哈希表中删除,使得重哈希的过程是伴随着客户端的数据操作请求进行的,数据迁移过程的数据量小,不影响系统的稳定运行;当原哈希表中的数据全部迁移到目标哈希表中,则删除原哈希表,从而完成数据迁移。整个重哈希的动作不是一次性、集中式完成的,而是分多次、渐进式的完成,让系统无需停止系统服务,在保证系统正常运行的同时,实现了对客户端透明的数据迁移过程,分摊了系统的瞬时压力,保证系统的稳定性。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一实施例中渐进式重哈希方法的一应用环境示意图;
图2是本发明一实施例中渐进式重哈希方法的流程图;
图3是本发明一实施例中渐进式重哈希方法中步骤S2的流程图;
图4是本发明一实施例中渐进式重哈希方法中步骤S22的流程图;
图5是本发明一实施例中渐进式重哈希方法中步骤S3的流程图;
图6是本发明一实施例中渐进式重哈希方法中若未接收到客户端发送的数据操作请求,将原哈希表中的数据迁移到目标哈希表中的一流程图;
图7是本发明一实施例中渐进式重哈希装置的示意图;
图8是本发明一实施例中计算机设备的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供的渐进式重哈希方法,可应用在如图1的应用环境中,其中,服务端是提供渐进式重哈希服务的计算机设备,服务端可以是服务器或服务器集群;客户端具体可以是计算机终端设备,客户端通过浏览器、手机APP等向服务端发起数据操作请求,数据操作请求包括客户端对数据库中的数据记录进行增加、删除、查找以及更新的操作;数据库存储了客户端需要的数据,数据库具体可以是各种关系型或非关系型数据库,如MS-SQL、Oracle、MySQL、Sybase、DB2、Redis、MongodDB、Hbase等;客户端与服务端之间通过网络连接,网络可以是有限网络或无线网络;数据库可以部署在服务端本地,也可以通过有线网络或无线网络与服务端相连。本发明实施例提供的渐进式重哈希方法应用于服务端。
在一实施例中,如图2所示,提供了一种渐进式重哈希方法,其具体实现流程包括如下步骤:
S1:定期从预设应用程序编程接口中获取哈希冲突数量。
哈希冲突(Hash Collisions)即当要将一个数据通过哈希运算插入到哈希表中时,所要插入的位置已经存储了之前插入的数据,这种情况称为哈希冲突。
遇到哈希冲突,通常有多种解决方式。例如,线性探测法、二次方探测法等。线性探测法,即若遇到哈希冲突,则对输入值先进行线性运算,如加上一个固定的常量,再进行哈希运算;若哈希运算之后没有哈希冲突,则冲突问题被解决;若仍存在哈希冲突,则可以继续进行线性运算,直到解决问题或触发某个终止条件。二次方探测法是在线性探测法的基础上将线性运算改成了二次方运算。
这些解决哈希冲突的方式通常被内置于如数据库管理系统等应用系统中,并且在解决哈希冲突的同时,对哈希冲突数量进行统计。预设应用程序接口就是应用程序内用于提供哈希冲突数量查询的接口。以Redis数据库为例,Redis中的字典数据类型,其底层实现采用了哈希技术,即字典中每条记录的键与值是通过哈希表关联起来的。每当向字典中新增一条记录,数据库将通过哈希运算计算出存储位置,并检测该存储位置是否为空,若存储位置为空,则将新记录添加到字典中;若存储位置不为空,即代表有哈希冲突,数据库将通过内置的解决哈希冲突的算法进行寻址,计算出存储位置空闲的存储地址,直至将新记录添加到字典中为止。其中,Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种内置应用程序编程接口(API接口,Application Programming Interface接口);数据库内置的解决冲突的算法包括但不限于线性探测法、二次方探测法等,且当Redis解决哈希冲突时,同时记录了哈希冲突数量,并对外提供了可以查询哈希冲突数量的API接口,以提醒数据库管理员注意。
服务端启动定时任务,定时任务用于通过数据库提供的API接口监测数据库中每次存储数据时遇到哈希冲突的次数。具体地,以Java服务端为例,服务端通过调用thread类启动线程对象,该线程对象以一定的时间间隔检测对数据库的日志文件进行读取,从而获取哈希冲突次数,其中,时间间隔可以根据实际应用需要进行确定,例如,若数据库的存储容量接近饱和,则可以将时间间隔设置的更短,如每隔24小时;若数据库的存储容量还很富余,则可以将时间间隔设置的相对长,如每隔一个月。
S2:若哈希冲突数量超过第一预设阈值,则建立目标哈希表。
第一预设阈值是一个用于判断哈希冲突数量的临界值,即根据哈希冲突数量与第一预设阈值之间的大小关系确定是否进行下一步操作。第一预设阈值代表成功存储一条数据记录,需要解决哈希冲突的次数。即第一预设阈值的取值越低,代表存储过程中遇到的哈希冲突次数越少;反之,则代表存储过程中遇到的哈希冲突次数越多。优选地,第一预设阈值的取值范围为30以内。
目标哈希表是与原哈希表相对而言的,为解决原哈希表不能满足存储需要而建立的新哈希表。其中,目标哈希表的大小要大于原哈希表,即目标哈希表的地址空间大于原哈希表的地址空间,这样使得有足够空间既满足原哈希表中存储内容的存续需求,同时也能保证新的存储需求。
举例来说,若第一预设阈值为3,且在数据存储过程中,新增一条数据记录时遇到的哈希冲突数量为5次数,即数据库解决5次哈希冲突才完成一条数据记录的存储,则代表哈希表的容量将不能满足逐渐增长的存储需要,此时,建立目标哈希表。
S3:若接收到客户端发送的数据操作请求,则将数据操作请求对应的数据记录从原哈希表迁移到目标哈希表中,并将数据记录从原哈希表中删除。
客户端发送的数据操作请求即客户端向服务端发起的,通过服务端对数据库中的数据记录进行增加、删除、查找以及更新的操作。
客户端发送的数据操作请求对应的数据记录即数据库的哈希表中的某条数据记录。对于客户端发送的数据操作请求,服务端可以通过数据记录的id(identification,身份标识信息)号从哈希表中查找获取到该条数据记录,其中,此处所述哈希表即为原哈希表;数据记录的id号为数据库中每条数据记录的唯一标识。
服务端在将数据记录从原哈希表迁移到目标哈希表时,所采用的哈希函数仍然是原哈希表对应的哈希函数。
具体地,以客户端发送的数据操作请求为查询请求为例,服务端接收到客户端发送的数据查询请求,则服务端可以通过JDBC从数据库中获取到查询请求对应的数据记录,将数据记录返回给客户端,并由此获取数据记录对应的id号;然后,服务端以数据记录id号为输入,利用原哈希表对应的哈希函数计算出该条数据记录对应的哈希地址,即在目标哈希表中的存储位置;将数据记录复制到目标哈希表中的存储位置之后从原哈希表中删除,从而完成一条数据记录的重哈希过程。其中,JDBC(Java DataBase Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。数据库开发人员通过JDBC编写的接口程序能适用于不同的数据库,而不再需要为不同的数据库分别编写接口程序,极大提高了开发效率。
可以理解地,若客户端发送的数据操作请求为更新或删除请求,则服务端处理过程与之类似,先利用数据记录id号和原哈希表对应的哈希函数计算出目标哈希表中的存储位置;然后将数据记录迁移到目标哈希表,并从原哈希表中删除;最后在目标哈希表中更新数据记录或删除数据记录,以实现对客户端的响应,使得在重哈希过程中,客户端对数据记录的操作能够被全程记录下,而不会因为原哈希表的删除而失去操作记录。若客户端发送的数据操作请求为新增请求,则服务端只需为新增的数据分配一个新的数据记录id,并利用原哈希表对应的哈希函数计算出新增条数据记录在目标哈希表中的存储地址,而无需对原哈希表中的记录做操作。
进一步地,若接收到客户端发送的数据操作请求,服务端以预设时间间隔对数据操作请求的数量进行统计;若数据操作请求的数量超过预设警戒值,则服务端将超出预设警戒值数量的数据操作请求对应的数据记录的标识信息缓存到预设缓存池中;在预设时间将超出预设警戒值数量的数据操作请求对应的数据记录从原哈希表迁移到目标哈希表中,并将所述数据记录从原哈希表中删除,利用了预设警戒值和缓存空间对大量数据操作请求进行分流,保证了系统在应对数量庞大的数据操作请求时的稳定性。
其中,预设时间间隔可以以分钟、秒、毫秒等为单位,例如,预设时间间隔为1分钟;数据操作请求的数量是在某个时间点,服务端接收到的数据操作请求的次数,例如,在19:30这个时间点,服务端接收到的包括新增、删除、查询、修改的数据操作请求的数量为10万次;预设警戒值是一个临界值,服务端根据实际数据操作请求的数量和预设警戒值之间的大小关系确定是否需要进行缓存处理;预设缓存池是用于存储数据操作请求对应的数据记录的标识信息的数据结构,例如,可以是服务端临时分配的存储空间;预设时间是在服务端已经做出缓存处理之后,并且数据操作请求的数量低于预设警戒值的某个时间点。
举例来说,若在19:30这个时间点,服务端获取到数据操作请求的数量为10万次,预设警戒值为8万次,则服务端将超出的2万个数据操作请求对应的数据记录的标识信息缓存到本地的临时存储空间中,同时,对8万个数据操作请求对应的数据记录进行迁移操作;若在19:45这个时间点,服务端获取到数据操作请求的数量为1万次,则服务端可以在19:45之后的根据临时存储空间中的数据记录的标识信息将对应的数据记录从原哈希表迁移到目标哈希,并将所述数据记录从原哈希表中删除。
S4:若原哈希表中的数据全部迁移到目标哈希表中,则删除原哈希表。
具体地,服务端可以设置一个指示索引,指示索引用于记录从原哈希表中迁移出的数据记录的条数。例如,服务端建立一个临时变量,每当服务端完成一条数据记录的重哈希,则临时变量的值加一;若指示索引的值等于数据库中字典的总记录数相等,则代表字典中所有的数据记录均已被迁移到目标哈希表中,则此时原哈希表可以被安全的删除了。若服务端的运行环境为Java,则服务端可以调用HashMap类中的remove()方法删除原哈希表。
在本实施例中,定期检测哈希冲突数量是否超过预设阈值;若哈希冲突数量超过预设阈值,则建立目标哈希表;在接收到客户端发送的数据操作请求时,将数据操作请求中对应的数据记录迁移到目标哈希表中,并将其从原哈希表中删除,使得重哈希的过程是伴随着客户端的数据操作请求进行的,数据迁移过程的数据量小,不影响系统的稳定运行;当原哈希表中的数据全部迁移到目标哈希表中,则删除原哈希表,从而完成数据迁移。整个重哈希的动作不是一次性、集中式完成的,而是分多次、渐进式的完成,让系统无需停止系统服务,在保证系统正常运行的同时,实现了对客户端透明的数据迁移过程,分摊了系统的瞬时压力,保证系统的稳定性。
进一步地,在一实施例中,如图3所示,针对步骤S2,即若哈希冲突数量超过第一预设阈值,则建立目标哈希表,具体包括如下步骤:
S21:获取数据库中当前的数据记录总数。
数据库中当前的数据记录总数即当需要进行重哈希时,所涉及到需要重哈希的数据记录的总数,即原哈希表中所包含的键(key)的数量,若涉及到几个哈希表,则是几个哈希表中所包含的键数量的总和。
具体地,若服务端运行环境为Java,则可以通过Hashmap类中的size()方法获取哈希表键的数量;若服务端运行环境为Python,则可以通过len()函数获取字典的长度,即为哈希表键的数量。
S22:若数据记录总数未超过第二预设阈值,并且哈希冲突数量超过第一预设阈值,则建立目标哈希表,其中,第二预设阈值大于第一预设阈值。
第二预设阈值是服务端用于判断是否建立目标哈希表的临界值。具体地,第二预设阈值的取值至少为一千万。
具体地,服务端在比较哈希冲突数量与第一预设阈值的同时,比较数据记录总数与第二预设阈值的大小关系,若同时满足数据记录总数未超过第二预设阈值,并且哈希冲突数量超过第一预设阈值,两个条件,则服务端才建立目标哈希表。
S23:若数据记录的总数超过第二预设阈值,则发出告警信息。
当数据记录的总数超过第二预设阈值,则代表继续建立目标哈希表、进行重哈希操作将对系统服务器产生影响。此时,服务端发出告警信息已提醒系统管理员。其中,对系统服务器产生的影响主要是指产生内存抖动问题,即由于涉及重哈希的数据量太过庞大,内存与虚拟内存或硬盘之间的数据交互过于频繁,对系统的稳定运行产生风险。服务端发出告警信息具体可以在服务端界面发出弹窗消息,或写入告警日志,或触发报警铃声等形式实现,此处不作限制。
在本实施例中,服务端通过设置第二预设阈值,增加了触发重哈希的条件,保证了在不会发生内存抖动的情况下,才建立目标哈希表,并进一步执行以后的步骤,提高了服务端自动进行重哈希时的安全性。
进一步地,在一实施例中,如图4所示,针对步骤S22,即若数据记录总数未超过第二预设阈值,并且哈希冲突数量超过第一预设阈值,则建立目标哈希表,具体包括如下步骤:
S221:若数据记录的总数未超过第二预设阈值,并且哈希冲突数量超过第一预设阈值,则获取原哈希表的大小。
原哈希表的大小即原哈希表所占的字节数。举例来说,若数据库中有一个数据字典,该数据字典是通过哈希运算保存数据的,即数据字典即可看作是一个基于哈希表的数据结构,数据字典所占的字节数即为哈希表的大小。
具体地,若服务端运行环境为Python,则服务端可以调用系统函数sys.getsizeof()获取数据字典所占的字节数,即可获取哈希表的大小。
S222:根据原哈希表的大小确定目标哈希表需要分配的存储空间大小,并根据存储空间大小建立目标哈希表。
具体地,服务端根据原哈希表的大小的倍数来确定目标哈希表需要分配的存储空间大小。例如,目标哈希表需要分配的存储空间大小可以为原哈希表大小的110%、125%、130%、150%、175%、200%等等。优选地,目标哈希表分配的存储空间大小为原哈希表的两倍。
例如,若服务端获取的原哈希表大小为1000,则定义目标哈希表大小为2000,并通过调用方法new()创建一个新HashMap类作为目标哈希表。
在本实施例中,服务端根据原哈希表的大小来确定为目标哈希表分配的存储空间大小,优选地,建立为原哈希表大小两倍的目标哈希表,采用了空间换效率方式,使得重哈希过程中有足够的内存空间,进一步保证重哈希处理的稳定性。
进一步地,在一实施例中,如图5所示,针对步骤S3,即若接收到客户端发送的数据操作请求,则将数据操作请求对应的数据记录从原哈希表迁移到目标哈希表中,并将数据记录从原哈希表中删除,具体包括如下步骤:
S31:从预设配置文件中选取第一目标哈希函数。
第一目标哈希函数是进行哈希运算时的数学函数,即线性或非线性的数学函数。通过哈希函数可以将自变量映射到不同的数据空间。例如,对于一个数字数组,数组元素包括0到9中的任一数字,如“12345”,经过哈希函数A映射后得到的数据空间为A’;经过哈希函数B映射后得到的数据空间为B’,由于哈希函数A和B不同,因此,数据空间A’可能只是B’的一个子集。
可以理解地,将这种映射关系应用到数据存储领域,经过哈希函数B得到的数据空间B’,比经过哈希函数A得到的数据空间A’代表更广阔的存储空间。
预设配置文件是用于存储哈希函数的文本文件,预设配置文件可以部署在服务端本地,也可以在服务端之外。预设配置文件中包括一组哈希函数,服务端每次从这组哈希函数中选取一个作为第一目标哈希函数。
例如,在预设配置文件中有一组均是随机数法的哈希函数{F1,F2,F3,F4,F5},其中,随机数法,即选择一个随机函数,取关键字的随机函数值作为哈希地址;F1到F5分别代表不同的随机数法哈希函数,每个哈希函数代表的数据空间逐渐变大。若原哈希表使用的是随机函数F1,则服务端将从其他4个哈希函数中选取一个作为构建目标哈希表的哈希函数。
具体地,服务端在第一次重哈希时,可以选取哈希函数F2作为目标哈希函数;若系统运行一段时间后需要再次重哈希,则服务端可以选取哈希函数F3作为目标哈希函数,以此类推。
此外,影响哈希函数性能的因素包括但不限于:哈希函数的执行时间、输入关键字的长度、哈希表的大小、哈希表中键的分布情况、记录的查找频率等等。因此,可以理解地,预设配置文件中的哈希函数也可以根据以上因素进行分组,例如,在一组哈希函数中,从第一个哈希函数到最后一个哈希函数,每个哈希函数对应的哈希表大小由小到大;在一组哈希函数中,从第一个哈希函数到最后一个哈希函数,每个哈希函数的执行时间由少到多;等等。
S32:接收客户端发送的数据操作请求,根据第一目标哈希函数将数据操作请求对应的数据记录从原哈希表迁移到目标哈希表中,并将数据记录从原哈希表中删除。
具体地,服务端将数据记录作为输入,代入选取的第一目标哈希函数中,计算得到的值作为当前数据记录的目标存储地址。
例如,若当前数据记录中包括数据记录id为“100092”,字段名“姓名”的值为“小明”,字段名“手机号”的值为“13312345678”,第一目标哈希函数为:
Addr=F2(key)
其中,F2代表第一目标哈希函数;key代表第一目标哈希函数的输入值,即由组成的值;Addr代表根据第一目标哈希函数计算得到的目标存储地址;在本例中,经过计算得到的目标存储地址可以为0x235468,即服务端通过调用JDBC,对目标存储地址进行寻址,将数据记录id为“100092”的这条数据记录存储到目标存储地址0x235468上,即完成从原哈希表迁移到目标哈希表中。进而,将数据记录id为“100092”的这条数据记录从原哈希表中删除。
在本实施例中,服务端从预设配置文件中选取第一目标哈希函数,并根据选取的第一目标哈希函数确定数据记录迁移到目标哈希表中的存储地址,使得重哈希过程可以通过更改哈希函数实现,并且预设配置文件中的哈希函数可以根据存储空间大小的进行梯度排列,从而满足逐步扩容的需要。
进一步地,在一实施例中,如图6所示,在步骤S2之后,并且在步骤S4之前,即在若哈希冲突数量超过第一预设阈值,则建立目标哈希表之后,并且在若原哈希表中的数据全部迁移到目标哈希表中,则删除原哈希表之前,具体包括如下步骤:
S5:若未接收到客户端发送的数据操作请求,则从预设配置文件中选取第二目标哈希函数。
若未接收到客户端发送的数据操作请求,则代表此时服务端处于空闲状态,服务端仍然可以对数据记录进行重哈希操作。
第二目标哈希函数即预设配置文件中的任一哈希函数。第二目标哈希函数可以与第一目标哈希函数相同,也可以与第一目标哈希函数不同。若第二目标哈希函数与第一目标哈希函数相同,则代表服务端在接收客户端发送的数据操作请求时,以及服务端处于空闲状态时,均按照同一目标哈希函数进行迁移,新增的数据和原哈希表中的数据保存在同一映射空间;若第二目标哈希函数与第一目标哈希函数不同,则代表服务端对新、旧数据采用不同的目标哈希函数,将新增的数据和原哈希表中的数据保存在不同的映射空间中。具体地,服务端可以根据实际应用的需要进行选择。
S6:根据第二目标哈希函数将原哈希表中的数据迁移到目标哈希表。
服务端根据第二目标哈希函数计算原哈希表中数据记录的目标存储地址,并寻址将数据存储到目标存储地址,从而实现将原哈希表中的数据迁移到目标哈希表,其具体实现过程如步骤S32所述,此处不再赘述。
在本实施例中,若未接收到客户端发送的数据操作请求,即服务端处于空闲状态时,服务端可以从预设配置文件中选取第二目标哈希函数,并利用第二目标哈希函数实现将原哈希表中的数据迁移到目标哈希表,让服务端不仅可以在接收到客户端发送的数据操作请求时进行重哈希操作,也可以在服务端空闲期间进行,以减少对用户的影响,提高服务端的资源利用率。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
在一实施例中,提供一种渐进式重哈希装置,该渐进式重哈希装置与上述实施例中渐进式重哈希方法一一对应。如图7所示,该渐进式重哈希装置包括冲突统计模块71、哈希表建立模块72、数据迁移模块73和空间释放模块74。
各功能模块详细说明如下:
冲突统计模块71,用于定期从预设应用程序编程接口中获取哈希冲突数量;
哈希表建立模块72,用于若哈希冲突数量超过第一预设阈值,则建立目标哈希表;
数据迁移模块73,用于若接收到客户端发送的数据操作请求,则将数据操作请求对应的数据记录从原哈希表迁移到目标哈希表中,并将数据记录从原哈希表中删除;
空间释放模块74,用于若原哈希表中的数据全部迁移到目标哈希表中,则删除原哈希表。
进一步地,哈希表建立模块72,包括:
数据记录获取子模块721,用于获取数据库中当前的数据记录总数;
哈希表建立子模块722,用于若数据记录总数未超过第二预设阈值,并且哈希冲突数量超过第一预设阈值,则建立目标哈希表,其中,第二预设阈值大于第一预设阈值;
告警子模块723,用于若数据记录的总数超过第二预设阈值,则发出告警信息。
进一步地,哈希表建立子模块722,包括:
存储空间获取子单元7221,用于若数据记录的总数未超过第二预设阈值,并且哈希冲突数量超过第一预设阈值,则获取原哈希表的大小;
哈希表建立子单元7222,用于根据原哈希表的大小确定目标哈希表需要分配的存储空间大小,并根据存储空间大小建立目标哈希表。
进一步地,数据迁移模块73,包括:
哈希函数获取子模块731,用于从预设配置文件中选取第一目标哈希函数;
数据迁移子模块732,用于接收客户端发送的数据操作请求,根据第一目标哈希函数将数据操作请求对应的数据记录从原哈希表迁移到目标哈希表中,并将数据记录从原哈希表中删除。
进一步地,渐进式重哈希装置,还包括:
函数获取模块75,用于若未接收到客户端发送的数据操作请求,则从预设配置文件中选取第二目标哈希函数;
数据移动模块76,用于根据第二目标哈希函数将原哈希表中的数据迁移到目标哈希表中。
关于渐进式重哈希装置的具体限定可以参见上文中对于渐进式重哈希方法的限定,在此不再赘述。上述渐进式重哈希装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图8所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种渐进式重哈希方法。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述实施例中渐进式重哈希方法的步骤,例如图2所示的步骤S1至步骤S4。或者,处理器执行计算机程序时实现上述实施例中渐进式重哈希装置的各模块/单元的功能,例如图7所示模块71至模块74的功能。为避免重复,这里不再赘述。
在一实施例中,提供一计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述方法实施例中渐进式重哈希方法,或者,该计算机程序被处理器执行时实现上述装置实施例中渐进式重哈希装置中各模块/单元的功能。为避免重复,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本发明所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。
Claims (10)
1.一种渐进式重哈希方法,其特征在于,所述渐进式重哈希方法包括:
定期从预设应用程序编程接口中获取哈希冲突数量;
若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表;
若接收到客户端发送的数据操作请求,则将所述数据操作请求对应的数据记录从原哈希表迁移到所述目标哈希表中,并将所述数据记录从原哈希表中删除;
若所述原哈希表中的数据全部迁移到所述目标哈希表中,则删除所述原哈希表。
2.如权利要求1所述的渐进式重哈希方法,其特征在于,所述若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表,包括:
获取数据库中当前的数据记录总数;
若所述数据记录总数未超过第二预设阈值,并且所述哈希冲突数量超过所述第一预设阈值,则建立所述目标哈希表,其中,所述第二预设阈值大于所述第一预设阈值;
若所述数据记录的总数超过所述第二预设阈值,则发出告警信息。
3.如权利要求2所述的渐进式重哈希方法,其特征在于,所述若所述数据记录总数未超过第二预设阈值,并且所述哈希冲突数量超过所述第一预设阈值,则建立所述目标哈希表,包括:
若所述数据记录的总数未超过第二预设阈值,并且所述哈希冲突数量超过所述第一预设阈值,则获取所述原哈希表的大小;
根据所述原哈希表的大小确定所述目标哈希表需要分配的存储空间大小,并根据所述存储空间大小建立所述目标哈希表。
4.如权利要求1所述的渐进式重哈希方法,其特征在于,所述若接收到客户端发送的数据操作请求,则将所述数据操作请求对应的数据记录从原哈希表迁移到所述目标哈希表中,并将所述数据记录从原哈希表中删除,包括:
从预设配置文件中选取第一目标哈希函数;
接收所述客户端发送的所述数据操作请求,根据所述第一目标哈希函数将所述数据操作请求对应的数据记录从所述原哈希表迁移到所述目标哈希表中,并将所述数据记录从所述原哈希表中删除。
5.如权利要求1所述的渐进式重哈希方法,其特征在于,在所述若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表之后,并且在所述若所述原哈希表中的数据全部迁移到所述目标哈希表中,则删除所述原哈希表之前,所述渐进式重哈希方法,还包括:
若未接收到所述客户端发送的所述数据操作请求,则从所述预设配置文件中选取第二目标哈希函数;
根据所述第二目标哈希函数将所述原哈希表中的数据迁移到所述目标哈希表中。
6.一种渐进式重哈希装置,其特征在于,所述渐进式重哈希装置,包括:
冲突统计模块,用于定期从预设应用程序编程接口中获取哈希冲突数量;
哈希表建立模块,用于若所述哈希冲突数量超过第一预设阈值,则建立目标哈希表;
数据迁移模块,用于若接收到客户端发送的数据操作请求,则将所述数据操作请求对应的数据记录从原哈希表迁移到所述目标哈希表中,并将所述数据记录从原哈希表中删除;
空间释放模块,用于若所述原哈希表中的数据全部迁移到所述目标哈希表中,则删除所述原哈希表。
7.如权利要求6所述的渐进式重哈希装置,其特征在于,所述哈希表建立模块,包括:
数据记录获取子模块,用于获取数据库中当前的数据记录总数;
哈希表建立子模块,用于若所述数据记录总数未超过第二预设阈值,并且所述哈希冲突数量超过所述第一预设阈值,则建立所述目标哈希表,其中,所述第二预设阈值大于所述第一预设阈值;
告警子模块,用于若所述数据记录的总数超过所述第二预设阈值,则发出告警信息。
8.如权利要求7所述的渐进式重哈希装置,其特征在于,所述哈希表建立子模块,包括:
存储空间获取子单元,用于若所述数据记录的总数未超过第二预设阈值,并且所述哈希冲突数量超过所述第一预设阈值,则获取所述原哈希表的大小;
哈希表建立子单元,用于根据所述原哈希表的大小确定所述目标哈希表需要分配的存储空间大小,并根据所述存储空间大小建立所述目标哈希表。
9.一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至5任一项所述渐进式重哈希方法。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述渐进式重哈希方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910042787.0A CN109828966A (zh) | 2019-01-17 | 2019-01-17 | 渐进式重哈希方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910042787.0A CN109828966A (zh) | 2019-01-17 | 2019-01-17 | 渐进式重哈希方法、装置、计算机设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109828966A true CN109828966A (zh) | 2019-05-31 |
Family
ID=66860250
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910042787.0A Pending CN109828966A (zh) | 2019-01-17 | 2019-01-17 | 渐进式重哈希方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109828966A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110334251A (zh) * | 2019-07-01 | 2019-10-15 | 南京邮电大学 | 一种有效解决rehash冲突的元素序列生成方法 |
CN110727663A (zh) * | 2019-09-09 | 2020-01-24 | 光通天下网络科技股份有限公司 | 数据清洗方法、装置、设备及介质 |
CN110752996A (zh) * | 2019-10-24 | 2020-02-04 | 杭州迪普信息技术有限公司 | 一种报文转发方法及装置 |
CN112148738A (zh) * | 2020-09-24 | 2020-12-29 | 盛科网络(苏州)有限公司 | 哈希冲突处理方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102147798A (zh) * | 2010-02-10 | 2011-08-10 | 华为技术有限公司 | 处理哈希查找冲突问题的方法和装置 |
US20120203745A1 (en) * | 2011-02-08 | 2012-08-09 | Wavemarket Inc. | System and method for range search over distributive storage systems |
CN106844706A (zh) * | 2017-02-06 | 2017-06-13 | 广东神马搜索科技有限公司 | 更新网页存储的方法、设备、网页存储系统和搜索系统 |
WO2018120109A1 (zh) * | 2016-12-30 | 2018-07-05 | 华为技术有限公司 | 数据处理的方法和装置 |
-
2019
- 2019-01-17 CN CN201910042787.0A patent/CN109828966A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102147798A (zh) * | 2010-02-10 | 2011-08-10 | 华为技术有限公司 | 处理哈希查找冲突问题的方法和装置 |
US20120203745A1 (en) * | 2011-02-08 | 2012-08-09 | Wavemarket Inc. | System and method for range search over distributive storage systems |
WO2018120109A1 (zh) * | 2016-12-30 | 2018-07-05 | 华为技术有限公司 | 数据处理的方法和装置 |
CN106844706A (zh) * | 2017-02-06 | 2017-06-13 | 广东神马搜索科技有限公司 | 更新网页存储的方法、设备、网页存储系统和搜索系统 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110334251A (zh) * | 2019-07-01 | 2019-10-15 | 南京邮电大学 | 一种有效解决rehash冲突的元素序列生成方法 |
CN110334251B (zh) * | 2019-07-01 | 2021-10-19 | 南京邮电大学 | 一种有效解决rehash冲突的元素序列生成方法 |
CN110727663A (zh) * | 2019-09-09 | 2020-01-24 | 光通天下网络科技股份有限公司 | 数据清洗方法、装置、设备及介质 |
CN110752996A (zh) * | 2019-10-24 | 2020-02-04 | 杭州迪普信息技术有限公司 | 一种报文转发方法及装置 |
CN112148738A (zh) * | 2020-09-24 | 2020-12-29 | 盛科网络(苏州)有限公司 | 哈希冲突处理方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109828966A (zh) | 渐进式重哈希方法、装置、计算机设备及存储介质 | |
US9767131B2 (en) | Hierarchical tablespace space management | |
CN103473239B (zh) | 一种非关系型数据库数据更新方法和装置 | |
US10275489B1 (en) | Binary encoding-based optimizations at datastore accelerators | |
US10831736B2 (en) | Fast multi-tier indexing supporting dynamic update | |
CN107533551A (zh) | 数据块级别的大数据统计 | |
US9235590B1 (en) | Selective data compression in a database system | |
CN105183394A (zh) | 一种数据存储处理方法和装置 | |
CN107247778A (zh) | 用于实施可扩展数据存储服务的系统和方法 | |
CN105824723B (zh) | 一种对公有云存储账户的数据进行备份的方法及系统 | |
CN104035925B (zh) | 数据存储方法、装置和存储系统 | |
CN106570113B (zh) | 一种海量矢量切片数据云存储方法及系统 | |
US20120317339A1 (en) | System and method for caching data in memory and on disk | |
US11080207B2 (en) | Caching framework for big-data engines in the cloud | |
CN107463610B (zh) | 一种数据入库方法及装置 | |
US20200242118A1 (en) | Managing persistent database result sets | |
CN108932256A (zh) | 分布式数据重分布控制方法、装置及数据管理服务器 | |
US20220027381A1 (en) | System and method for real time data aggregation in a virtual cube in a multidimensional database environment | |
CN106055622A (zh) | 一种数据搜索方法及系统 | |
CN106960011A (zh) | 分布式文件系统元数据管理系统及方法 | |
CN113111038B (zh) | 文件存储方法、装置、服务器及存储介质 | |
CN102810108A (zh) | 重复数据的处理方法 | |
WO2023231339A1 (zh) | 区块链系统中的交易执行方法、节点和区块链系统 | |
CN110399096A (zh) | 分布式文件系统元数据缓存重删的方法、装置以及设备 | |
CN108268614A (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 |