一种多线程的加锁方法及服务器与流程

文档序号:15076530发布日期:2018-08-01 01:51阅读:199来源:国知局

本发明涉及计算机领域,尤其涉及一种多线程的加锁方法及服务器。



背景技术:

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。使用多线程技术,提升响应速度以及用户体验等。但是多线程技术难免就会碰到数据同步的问题,而常用的一种解决方案就是加锁。例如,原子自增,原子自减,即使是多个线程同时访问,来保证数据的一致性。

传统的方法中,使用单一锁进行线程控制。例如,通过单一锁的方式来统计访问量,采用redis内存数据库进行访问量的统计,redis提供了一种原子级别的自增操作,也就是无论并发访问用户有多少,都会一一进行统计,不会造成数据丢失,即只有当用户设备获取到锁对象后才能进行数据操作(例如读取操作),如果无法获取锁对象,则进行等待,直到获取锁为止。请结合图1进行理解,图1为传统方法中多线程的加锁方法的场景示意图,当用户访问不同的数据(例如,该不同的数据为两篇不同的文章)的时候,需要逐一加锁,增加访问量,释放锁,极其浪费时间(此时的操作和串行执行无异)。

综上所述,传统方法中,对于多线程访问,尤其是并发访问不同的数据时,传统方式的加锁方式导致数据访问效率低下。



技术实现要素:

本发明实施例提供了一种多线程的加锁方法及服务器,用于提高访问数据的响应速度。

第一方面,本发明实施例提供了一种多线程的加锁方法,包括:

接收待访问的目标数据的访问请求,所述访问请求携带所述目标数据的标识;

根据所述标识确定数组对象集合中的目标对象,所述标识与所述目标对象具有对应关系,所述数组对象集合中包括预置数量的对象;

使用所述目标对象对所述目标数据进行加锁;

当所述目标数据访问结束时,释放所述目标数据。

在一种可能的实现方式中,所述根据所述标识确定数组对象集合中的目标对象包括:

对所述标识进行哈希散列计算,得到散列值;

对所述散列值与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量值;

根据所述结果值确定所述目标对象。

在一种可能的实现方式中,所述接收待访问的目标数据的访问请求之后,所述方法还包括:

确定所述目标数据的类别;

若所述目标数据的类别为热点数据,则为所述目标数据分配目标预置对象,所述热点数据的标识与预置对象具有映射关系,所述热点数据为历史访问量大于或者等于预设阈值的数据;

使用所述目标预置对象对所述目标数据进行加锁。

在一种可能的实现方式中,若所述目标数据的类别为非热点数据,则触发执行根据所述标识确定数组对象集合中的目标对象的步骤,所述非热点数据为历史访问量小于预设阈值的数据。

在一种可能的实现方式中,所述标识为数值,所述根据所述标识确定数组对象集合中的目标对象,包括:

对所述标识与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量。

第二方面,本发明实施例提供了一种服务器,包括:

接收模块,用于接收待访问的目标数据的访问请求,所述访问请求携带所述目标数据的标识;

第一确定模块,用于根据所述接收模块接收的所述标识确定数组对象集合中的目标对象,所述标识与所述目标对象具有对应关系,所述数组对象集合中包括预置数量的对象;

加锁模块,用于使用所述第一确定模块确定所述目标对象对所述目标数据进行加锁;

释放模块,用于当所述目标数据访问结束时,释放所述目标数据。

在一种可能的实现方式中,所述确定模块包括第一计算单元,第二计算单元和确定单元;

所述第一计算单元,用于对所述接收模块接收的所述标识进行哈希散列计算,得到散列值;

所述第二计算单元,用于对所述第一计算单元计算的所述散列值与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量值;

所述确定单元,用于根据所述第二计算单元计算的所述结果值确定所述目标对象。

在一种可能的实现方式中,还包括第二确定模块和分配模块;

所述第二确定模块,用于确定所述接收模块接收的所述目标数据的类别;

所述分配模块,用于当所述目标数据的类别为热点数据时,为所述目标数据分配目标预置对象,所述热点数据的标识与预置对象具有映射关系;

所述加锁模块,还用于使用所述目标预置对象对所述目标数据进行加锁。

在一种可能的实现方式中,还包括触发模块;

所述触发模块,用于当所述第二确定模块确定所述目标数据的类别为非热点数据,触发执行根据所述标识确定数组对象集合中的目标对象的步骤。

在一种可能的实现方式中,所述标识为数值,

所述第一确定模块,还用于对所述标识与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量。

从以上技术方案可以看出,本发明实施例具有以下优点:

本发明实施例中,当发生多线程访问时,服务器可以根据目标数据的标识确定数组对象集合中的目标对象,该数组对象集合中包括多个目标对象,使用该目标对象作为锁,也就是说当发生多线程访问时,访问不同的数据可以获取到不同的锁,当访问多个目标数据时,可以对不同的目标数据进行并行的加锁处理,提高响应速度。

附图说明

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

图1为传统方法中多线程的加锁方法的场景示意图;

图2为本发明实施例中一种服务器的一个实施例的结构示意图;

图3为本发明实施例中一种多线程的加锁方法的一个实施例的步骤示意图;

图4为本发明实施例中一种多线程的加锁方法的场景示意图;

图5为本发明实施例中一种多线程的加锁方法的另一个实施例的步骤示意图;

图6为本发明实施例中一种服务器的另一个实施例的结构示意图;

图7为本发明实施例中一种服务器的另一个实施例的结构示意图;

图8为本发明实施例中一种服务器的另一个实施例的结构示意图。

具体实施方式

本发明实施例提供了一种多线程的加锁方法及服务器,用于提高了访问数据的响应速度。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本发明保护的范围。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

本发明实施例提供了一种多线程的加锁方法,该方法应用于一种服务器,请参阅图2所示,图2为该服务器的结构示意图,图2是本发明实施例提供的一种服务器结构示意图,该服务器200可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(centralprocessingunits,cpu)222(例如,一个或一个以上处理器)和存储器232,一个或一个以上存储应用程序242或数据244的存储介质230(例如一个或一个以上海量存储设备)。其中,存储器232和存储介质230可以是短暂存储或持久存储。存储在存储介质230的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器222可以设置为与存储介质230通信,在服务器200上执行存储介质230中的一系列指令操作。

服务器200还可以包括一个或一个以上电源226,一个或一个以上有线或无线网络接口250,一个或一个以上输入输出接口258,和/或,一个或一个以上操作系统241,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm等等。

需要说明的是,上述图2中的结构只是本发明实施例中服务器的一个示例性结构,并不造成对本发明服务器中结构的限定性说明。

该服务器可以通过有线或无线网络接口250接收用户设备发送的待访问目标数据的访问请求,所述访问请求携带所述目标数据的标识,该标识可以为服务器为数据分配的唯一标识,服务器可以通过该标识索引到该目标数据;中央处理器222根据所述标识确定数组对象集合中的目标对象,所述标识与所述目标对象具有对应关系;然后,使用所述目标对象对所述目标数据进行加锁;当所述目标数据访问结束时,释放所述目标数据。

本发明实施例中,当发生多线程访问时,服务器可以根据目标数据的标识确定数组对象集合中的目标对象,该数组对象集合中包括预置数量的目标对象,使用该目标对象作为锁,也就是说当发生多线程访问时,访问不同的数据可以获取到不同的锁,当访问多个目标数据时,可以对不同的目标数据进行并行的加锁处理,提高响应速度。

需要说明的是,本发明实施例中服务器可以同时接收到多个访问请求,同时确定多个目标数据的锁,对多个访问请求进行并行处理,对不同的目标数据确定不同的锁。下面对多个访问请求中的一个访问请求的处理过程为例进行说明。

请参阅图3所示,本发明实施例提供了一种多线程的加锁方法的一个实施例包括:

步骤301、接收待访问的目标数据的访问请求,所述访问请求携带所述目标数据的标识。

接收待访问的目标数据的访问请求,该访问请求携带了该目标数据的标识,该标识可以为该目标数据进行存储时,由服务器进行分配的唯一标识。也就是说每个数据的标识均不相同。

可选的,该标识可以为数值,编号,索引等。本发明实施例中,该标识可以以数值为例进行说明,在实际应用中,对于该标识的具体形式并不限定。

步骤302、根据所述标识确定数组对象集合中的目标对象,所述标识与所述目标对象具有对应关系,所述数组对象集合中包括多个对象。

该数组对象集合可以为预先创建的一个数组集合,该数组对象集合中包括预置数量的对象。例如,该数组对象集合中包括2000个对象,该2000个对象为0至1999的数值。

在一种可能的实现方式中,当该标识为一个数值时,可以对所述标识与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量,在本实施例中,数组对象集合的数量为2000。

例如,当该标识为“1999”时,则对“1999”和“2000”进行求余计算,得到的余数为“1”,则将数组对象集合的中“1”号对象作为锁。需要说明是,本实施例中对于标识的数值仅是为了方便说明而举的例子,并不造成对本发明的限定性说明。

在另一种可能的实现方式中,通过哈希算法对该标识进行哈希散列计算,得到散列值;然后,对所述散列值与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量值;根据所述结果值确定所述目标对象。本实施例中该预置值为2000。

散列的意义在于,能够快速的通过一个对象(本实施例中为标识)查找到另一个对象,存储一组元素最快的数据结构是数组,因此使用了数组来存储目标对象的信息,该数组形成的表又称散列表,哈希表。数组可以并不保存对象本身,而是保存通过算法将对象转换过来的一个数字,而该数字对应到目标对象,进而可以确定目标对象。

本实施例中,通过哈希算法对该标识进行哈希散列计算,对所述散列值与预置值进行求余运算,得到的结果值可以平均的分散到“0至1999”这2000个连续的数值上,即可以平均分散到2000个目标对象(对应2000个锁)上,也就是说,当同时有1000个用户同时向服务器发送访问请求时,通过哈希算法可以最大可能性的确定出1000个目标对象,对1000个目标对象不会出现重复,同时用不同的锁对这1000个目标数据进行加锁,极大的提高了响应速度。

步骤303、使用所述目标对象对所述目标数据进行加锁。

例如,确定的结果值60,则将60号对象作为锁,对该目标数据进行加锁。

步骤304、当所述目标数据访问结束时,释放所述目标数据。

上述实施例可以应用到如下场景中:一个网站有大量的文章提供给访问者,服务器需要统计每一篇文章的访问量,通过访问量的统计可以知道读者当前关注的内容,进而可以增加访问量较高的文章的相关内容。请结合图4所示,图4为多线程的加锁方法的场景示意图。

在实际应用中访问者数量大,服务器可以并行处理访问请求,为了方便说明,本实施例中,以用户同时访问两篇文章为例进行说明。

当两篇文章被访问的时候,对每一篇文章的唯一标识进行哈希散列计算,得到散列值,然后根据得到的散列值和预置值进行求余计算,得到每一篇文章对应的结果值,例如,对第一篇文章的标识进行计算的结果值为20,对第二篇文章的标识进行计算的结果值为60,然后将20号目标对象作为锁对第一篇文章进行加锁,增加第一篇文章的访问量;同时将60号目标对象作为锁对第一篇文章进行加锁,增加第二篇文章的访问量。

当并发访问不同的数据(如文章)时,本发明实施例中的方案的性能提升明显。在如下的测试情形下,如,并发访问数据2万次,每次访问的数据不相同,也就是说每次访问的不同文章,使用传统的方式统计访问量,响应的时间约14秒,而采用本发明实施例中的方案约7秒。本发明实施例中的方法比传统的方法的响应时间减少了50%。本发明实施例中,在多线程并发访问,尤其是针对不同的数据进行访问的情况下,本发明实施例可以在保证数据一致性的前提下,性能(响应时间)得到极大的提升。

需要说明的是,本发明实施例中,数组对象集合中包括的对象的数量(也就是预置值)只是举例说明,并非限定性说明,在实际应用中对于该预置值并不限定。但是在实际应用中,该预置值可以有一个合适的范围,例如,该优选的范围可以为1800到2500。

当访问量大的情况下,数组对象集合中的对象的数量越大,其响应的时间越短,例如,服务器接收到2001个访问请求,假设每个访问请求所访问的目标数据都不相同(如访问2001篇文章),2000篇文章都获得对应的锁,也就是说,可以同时对2000篇文章同时加锁,如果第一篇文章获得的锁为第1号目标对象,而第2001篇文章同样获得第1号目标对象为锁的话,那么第2001篇文章需要等待第一篇文章被访问完,在获得第1号目标对象作为锁。在这种情况下,如果数据对象集合中的对象的数量为2500的话,则出现等待情况的概率会低的多。但是,并不是数组对象集合中对象的数量越大性能越高,因为进行散列运算后,找到数组中对应的对象也需要一定的操作和时间,因此,在实际应用中可以对服务器的访问量进行评估后,根据实际情况确定数组对象中的对象的预置数量。

请参阅图5所示,在图3对应的实施例的基础上,本发明实施例中提供了一种多线程的加锁方法的另一个实施例包括:

步骤501与图3对应的实施例中的步骤301相同,此处不赘述。

步骤502、确定所述目标数据的类别。

目标数据的类别包括热点数据和非热点数据,热点数据指历史访问量大于或者等于预设阈值的数据。非热点数据指历史访问量小于预设阈值的数据。例如,根据该目标数据的标识可以获取到该目标数据的历史访问量大于或者等于10万次,则该目标数据的类别为热点数据,若该目标数据的历史访问量小于10万次,则该目标数据的类别为非热点数据。需要说明的,对于预设阈值的数值本发明实施例中只是举例说明,并不造成对本发明的限定性说明。

步骤503、若所述目标数据的类别为热点数据,则为所述目标数据分配目标预置对象,所述热点数据的标识与预置对象具有映射关系。

例如,若某一篇文章访问量超过了预设阈值,该文章为热点文章,服务器可以预先为热点数据确定对应的目标预置对象。如当数据对象集合中的对象的数量为2000,且对象为0至1999这2000个连续数值。

该热点文章的标识对应的目标对象为2100,也就是说,该热点数据的标识对应的目标对象并不在数据对象集合中,而是为该热点数据分配与该标识具有映射关系的目标预置对象,本实施例中,若该目标数据为热点数据,则单独为热点数据分配预置目标对象作为锁,不需要在数组对象集合中查找目标对象,以减少响应时间,提高响应效率。

步骤504、使用所述目标预置对象对所述目标数据进行加锁。

若所述目标数据的类别为非热点数据,则触发执行步骤505。

步骤505至步骤507与图3对应的实施例中的步骤302至步骤304相同,此处不赘述。

本发明实施例中,在多线程并发访问,尤其是针对不同的数据进行访问的情况下,本发明实施例可以在保证数据一致性的前提下,性能(响应时间)得到极大的提升。

上面对一种多线程的加锁方法进行了描述,下面对该多线程的加锁方法所应用的服务器进行描述。请参阅图6所示,本发明实施例提供了一种服务器的一个实施例包括:

接收模块601,用于接收待访问的目标数据的访问请求,所述访问请求携带所述目标数据的标识;

第一确定模块602,用于根据所述接收模块601接收的所述标识确定数组对象集合中的目标对象,所述标识与所述目标对象具有对应关系;

加锁模块603,用于使用所述第一确定模块602确定所述目标对象对所述目标数据进行加锁;

释放模块604,用于当所述目标数据访问结束时,释放所述目标数据。

在图6对应的实施例的基础上,请参阅图7所示,本发明实施例提供了一种服务器的另一个实施例包括:

所述确定模块包括第一计算单元6021,第二计算单元6022和确定单元6023;

所述第一计算单元6021,用于对所述接收模块601接收的所述标识进行哈希散列计算,得到散列值;

所述第二计算单元6022,用于对所述第一计算单元6021计算的所述散列值与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量值;

所述确定单元6023,用于根据所述第二计算单元6022计算的所述结果值确定所述目标对象。

在图6对应的实施例的基础上,请参阅图8所示,本发明实施例提供了一种服务器的另一个实施例包括:

还包括第二确定模块605和分配模块;

所述第二确定模块605,用于确定所述接收模块601接收的所述目标数据的类别;

所述分配模块,用于当所述目标数据的类别为热点数据时,为所述目标数据分配目标预置对象,所述热点数据的标识与预置对象具有映射关系,所述热点数据为历史访问量大于或者等于预设阈值的数据;

所述加锁模块603,还用于使用所述目标预置对象对所述目标数据进行加锁。

可选的,还包括触发模块606;

所述触发模块606,用于当所述目标数据的类别为非热点数据,触发执行根据所述标识确定数组对象集合中的目标对象的步骤,所述非热点数据为历史访问量小于预设阈值的数据。

可选的,当所述标识为数值时,所述第一确定模块602,还用于对所述标识与预置值进行求余运算,得到结果值,所述预置值为所述数组对象集合中对象的数量。

进一步的,图6至图8中的服务器是以功能模块的形式来呈现。这里的“模块”可以指特定应用集成电路(application-specificintegratedcircuit,asic),电路,执行一个或多个软件或固件程序的处理器和存储器,集成逻辑电路,和/或其他可以提供上述功能的器件。在一个简单的实施例中,图6至图8中中的服务器可以采用图2所示的形式。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1