一种分布式锁的实现方法、系统、设备及存储介质
技术领域
本发明涉及软件工程
技术领域
,尤其涉及一种分布式锁的实现方法、系统、设备及存储介质。背景技术
目前大型网站及应用都是分布式部署的,而分布式场景中的数据一致性问题一直是比较重要的话题。在大多数场景中为了保证数据的最终一致性,需要很多技术方案的支持,例如分布式事务、分布式锁等。其中,分布式锁是为了保证一个方法在同一时间内只能被一个线程执行。
现有分布式锁的实现方式有:基于数据库的实现方式、基于zookeeper的实现方式和基于Redis的实现方式。其中,基于数据库实现分布式锁的方式,存在使用分布式锁的效率较低,容易造成死锁的问题;基于zookeeper实现分布式锁的方式效率较高,但是需要zookeeper的第三方插件;而基于Redis实现分布式锁的方式,性能较好,且不需要应用第三方插件,因此,目前大多数企业也都是采用Redis实现分布式锁。
但是在现有技术中,使用Redis实现分布式锁的过程中,需要在代码中多次重复地添加获取分布式锁和释放分布式锁的代码,导致获取锁和释放锁的过程较为繁琐,效率低,且不便于后期维护。
发明内容
基于此,有必要针对上述技术问题,提供一种分布式锁的实现方法、系统、设备及存储介质。
一种分布式锁的实现方法,包括以下步骤:设置目标注解,通过同步枚举定义分布式锁的属性信息;在Redis操作类上定义获取分布式锁和释放分布式锁;定义切面类,在所述切面类中依次添加声明注解、切面注解和命令注解,配合Spring框架中的事务性注解,并设置所述切面类和事务性注解的执行顺序;在待加锁的方法中添加所述目标注解。
在其中一个实施例中,所述设置目标注解,通过同步枚举定义分布式锁的属性信息,具体包括:所述属性信息包括分布式锁的字符串类型、轮询次数、轮询间隔时间和超时时间。
在其中一个实施例中,所述在Redis操作类上定义获取分布式锁和释放分布式锁,具体包括:定义获取分布式锁时,根据获取用户发出的请求识别请求标识,根据所述请求标识获取分布式锁,设置分布式锁的获取超时时长;若未超过所述获取超时时长,则通过UUID方法随机生成字符串作为所述分布式锁的value值,并返回获取分布式锁的业务代码;若超过所述获取超时时长,则返回获取失败的提示。
在其中一个实施例中,所述在Redis操作类上定义获取分布式锁和释放分布式锁,具体包括:定义释放分布式锁时,根据释放用户发出的释放请求识别请求标识,根据所述请求标识判断所述释放用户是否与所述获取用户一致;若释放用户与所述获取用户一致,则根据释放用户发出的value值与所述分布式锁携带的value值是否相同,判断是否释放所述分布式锁;若释放用户与所述获取用户不一致,则返回拒绝释放所述分布式锁的提示。
在其中一个实施例中,所述若为获取分布式锁的请求,则根据请求中携带的value值与释放分布式锁的value值是否相同确定是否释放所述分布式锁,具体包括:若释放用户发出的value值与所述分布式锁携带的value值相同,则释放所述分布式锁,并返回释放分布式锁的业务代码;若释放用户发出的value值与所述分布式锁携带的value值不相同,则重复请求释放分布式锁,至超过释放超时时长后,停止请求操作,继续下一进程或返回释放失败的提示。
在其中一个实施例中,所述定义切面类,在所述切面类中依次添加声明注解、切面注解和命令注解,配合Spring框架中的事务性注解,并设置所述切面类和事务性注解的执行顺序,具体包括:设置所述切面类的执行顺序为1,所述事务性注解的执行顺序为2;在执行完所述切面类后,执行所述事务性注解。
在其中一个实施例中,所述在待加锁的方法中添加所述目标注解,具体包括:在多个用户访问所述待加锁的方法时,在所述待加锁的方法中添加所述目标注解,通过所述目标注解在所述待加锁的方法中自动加锁。
一种分布式锁的实现系统,包括:注解设置模块,用于设置目标注解,通过同步枚举定义分布式锁的属性信息;锁定义模块,用于在Redis操作类上定义获取分布式锁和释放分布式锁;切面类定义模块,用于定义切面类,在所述切面类中依次添加声明注解、切面注解和命令注解,配合Spring框架中的事务性注解,并设置所述切面类和事务性注解的执行顺序;注解添加模块,用于在待加锁的方法中添加所述目标注解。
一种设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述各个实施例中所述的一种分布式锁的实现方法的步骤。
一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述各个实施例中所述的一种分布式锁的实现方法的步骤。
相比于现有技术,本发明的优点及有益效果在于:通过设置目标注解,采用同步枚举定义分布式锁的属性信息,在Redis操作类上定义获取分布式锁和释放分布式锁,定义切面类,并在切面类中添加声明注解、切面注解和命令注解,与Spring框架的事务性注解混用,设置切面类和事务性注解的执行顺序,最后在待加锁的方法中添加目标注解,从而简化了加锁和释放锁的步骤,提高了工作效率,且便于后期维护。
附图说明
图1为一个实施例中一种分布式锁的实现方法的流程示意图;
图2为一个实施例中一种分布式锁的实现系统的结构示意图;
图3为一个实施例中设备的内部结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,下面通过具体实施方式结合附图对本发明做进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
在一个实施例中,如图1所示,提供了一种分布式锁的实现方法,包括以下步骤:
步骤S101,设置目标注解,通过同步枚举定义分布式锁的属性信息。
具体地,编写目标注解,注解上需要一个参数,可以定义为同步枚举的方式,从而便于控制分布式锁的数据量。通过同步枚举的方式定义分布式锁的属性信息。
其中,属性信息包括分布式锁的key字符串类型、轮询次数、轮询间隔时间、和超时时间。轮询次数设置为整数,避免没有获取到分布式锁的用户无限轮询;轮询时间间隔也设置为整数,即为每次轮询获取分布式锁的间隔时间,间隔时间可以设置的稍长,避免因为轮询过快导致Redis卡死;超时时间为获取分布式锁的总时长,避免不能获取分布式锁的用户一直轮询,导致死锁。
步骤S102,在Redis操作类上定义获取分布式锁和释放分布式锁。
具体地,在Redis操作类上分别添加定义获取分布式锁和释放分布式锁的方法。
步骤S103,定义切面类,在切面类中依次添加声明注解、切面注解和命令注解,配合Spring框架中的事务性注解,并设置切面类和事务性注解的执行顺序。
具体地,定义一个切面类SyncAop,这个类需要加上声明(Component)注解,因而Spring框架才会管理这个切面类;再加上一个切面(Aspect)注解,表明这是一个切面;然后添加命令(Order)注解,控制切面类的执行顺序。因为需要和Spring框架自带的事务性(Transactional)注解混用,因此需要对切面类和事务性注解的执行顺序进行设置。
步骤S104,在待加锁的方法中添加目标注解。
具体地,在待加锁的方法上添加目标注解,且可以和Spring框架中的事务性注解一起使用,由于已经设置好切面类和事务性注解的执行顺序,因此可以在多个用户访问该方法时,自动加锁,从而简化获取锁和释放锁的代码,便于后期维护。
在本实施例中,通过设置目标注解,采用同步枚举定义分布式锁的属性信息,在Redis操作类上定义获取分布式锁和释放分布式锁,定义切面类,并在切面类中添加声明注解、切面注解和命令注解,与Spring框架的事务性注解混用,设置切面类和事务性注解的执行顺序,最后在待加锁的方法中添加目标注解,从而简化了加锁和释放锁的步骤,提高了工作效率,且便于后期维护。
其中,步骤S102具体包括:定义获取分布式锁时,根据获取用户发出的请求识别请求标识,根据请求标识获取分布式锁,设置分布式锁的获取超时时长;若未超过获取超时时长,则通过UUID方法随机生成字符串,作为分布式锁的value值,并返回获取分布式锁的业务代码;若超过获取超时时长,则返回获取失败的提示。
具体地,在定义获取分布式锁时,根据获取用户发出的请求识别请求标识,根据请求标识获取分布式锁,设置分布式锁的获取超时时长;在获取分布式锁的时长超过获取超时时长时,返回获取失败的提示;在获取分布式锁的时长未超过获取超时时长时,则通过UUID(Universally Unique Identifier,通用唯一识别码)方法随机生成字符串,作为分布式锁的value值,并返回获取分布式锁的业务代码。采用UUID方法能够使得每个分布式锁都具有唯一的辨识码。
在一个实施例中,获取分布式锁的代码如下:
其中,步骤S102具体包括:定义释放分布式锁时,根据释放用户发出的释放请求识别请求标识,根据请求标识判断释放用户是否与获取用户一致;若释放用户与获取用户一致,则根据释放用户发出的value值与分布式锁携带的value值是否相同,判断是否释放所述分布式锁;若释放用户与获取用户不一致,则返回拒绝释放分布式锁的提示。
具体地,定义释放分布式锁时,根据请求标识确定释放用户是否与获取用户一致,若一致,则根据释放用户发出的value值与分布式锁携带的value值判断是否释放分布式锁;若不一致,则返回拒绝释放分布式锁的提示。
其中,若释放用户发出的value值与分布式锁携带的value值相同,则释放分布式锁,并返回释放分布式锁的业务代码;若释放用户发出的value值与分布式锁携带的value值不相同,则重复请求释放分布式锁,至超过释放超时时长后,停止请求释放分布式锁,继续下一进程或返回释放失败的提示。
在一个实施例中,释放分布式锁的代码如下:
其中,步骤S103具体包括:设置切面类的执行顺序为1,事务性注解的执行顺序为2;在执行完切面类后,执行事务性注解。
具体地,将切面类的执行顺序设置为1,事务性注解的执行顺序设置为2,执行完切面类后,再执行事务性注解,从而确保事务是在分布式锁里面执行的。其中,切面类的执行顺序依次为声明注解、切面注解和命令注解。
其中,步骤S104具体包括:在多个用户访问待加锁的方法时,在待加锁的方法中添加目标注解,通过目标注解在待加锁的方法中自动加锁。
具体地,在同时具有多个用户访问待加锁的方法时,可以在该方法中添加目标注解,通过目标注解在待加锁的方法中实现自动加锁,避免编写大量重复代码,提高工作效率。在执行完这个方法之后,释放锁,继续下一进程。
如图2所示,提供了一种分布式锁的实现系统20,包括:注解设置模块21、锁定义模块22、切面类定义模块23和注解添加模块24,其中:
注解设置模块21,用于设置目标注解,通过同步枚举定义分布式锁的属性信息;
锁定义模块22,用于在Redis操作类上定义获取分布式锁和释放分布式锁;
切面类定义模块23,用于定义切面类,在切面类中依次添加声明注解、切面注解和命令注解,配合Spring框架中的事务性注解,并设置切面类和事务性注解的执行顺序;
注解添加模块24,用于在待加锁的方法中添加目标注解。
在一个实施例中,锁定义模块22具体用于:在定义获取分布式锁时,根据获取用户发出的请求识别请求标识,根据请求标识获取分布式锁,设置分布式锁的获取超时时长;若未超过获取超时时长,则通过UUID方法随机生成字符串作为分布式锁的value值,并返回获取分布式锁的业务代码;若超过所述获取超时时长,则返回获取失败的提示。
在一个实施例中,锁定义模块22具体用于:在定义释放分布式锁时,根据释放用户发出的释放请求识别请求标识,根据请求标识判断所述释放用户是否与获取用户一致;若释放用户与获取用户一致,则根据释放用户发出的value值与分布式锁携带的value值是否相同,判断是否释放所述分布式锁;若释放用户与获取用户不一致,则返回拒绝释放分布式锁的提示。
在一个实施例中,切面类定义模块23具体用于:设置切面类的执行顺序为1,事务性注解的执行顺序为2;在执行完切面类后,执行事务性注解。
在一个实施例中,注解添加模块24具体用于:在多个用户访问待加锁的方法时,在待加锁的方法中添加目标注解,通过目标注解在待加锁的方法中自动加锁。
在一个实施例中,提供了一种设备,该设备可以是服务器,其内部结构图可以如图3所示。该设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该设备的处理器用于提供计算和控制能力。该设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该设备的数据库用于存储配置模板,还可用于存储目标网页数据。该设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种分布式锁的实现方法。
本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的设备的限定,具体的设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还可以提供一种存储介质,所述存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被计算机执行时使所述计算机执行如前述实施例所述的方法,所述计算机可以为上述提到的一种分布式锁的实现系统的一部分。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(RandomAccessMemory,RAM)等。
显然,本领域的技术人员应该明白,上述本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在计算机存储介质(ROM/RAM、磁碟、光盘)中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。所以,本发明不限制于任何特定的硬件和软件结合。
以上内容是结合具体的实施方式对本发明所做的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。
- 上一篇:石墨接头机器人自动装卡簧、装栓机
- 下一篇:数据处理方法、装置、电子设备及存储介质