分布式锁处理方法、装置、电子设备和存储介质与流程

未命名 07-12 阅读:63 评论:0


1.本技术涉及计算机技术领域,具体涉及分布式锁处理方法、装置、电子设备和存储介质。


背景技术:

2.在日常开发中,存在一个进程中的多个线程去竞争某一资源,通过给方法、代码块加锁的方式,来确保只有一个线程获取到资源。redis是一个单独的非业务服务,不会受到其他业务服务的限制,所有的业务服务都可以向redis发送写入命令,且只有一个业务服务可以写入命令成功,那么,写入命令成功的服务则获得了锁,可以进行后续对资源的操作,其他未写入成功的服务,则进行其他处理,以此实现分布式锁。
3.但是这种方式的开发成本高,需要在业务代码中同时添加加锁、释放的代码逻辑,难以高效地实现分布式锁。


技术实现要素:

4.本技术实施例提供业务代码执行的方法、装置、电子设备和存储介质,可以降低开发成本,高效地实现分布式锁。
5.本技术实施例提供一种分布式锁处理方法,包括:
6.获取注解参数,所述注解参数包括锁类型和锁失效时长;
7.根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;
8.根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;
9.利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;
10.若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。
11.本技术实施例还提供一种分布式锁处理装置,包括:
12.获取模块,用于获取注解参数,所述注解参数包括锁类型和锁失效时长;
13.生成模块,用于根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;
14.添加模块,用于根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;
15.续时模块,用于利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;
16.释放模块,用于若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。
17.本技术实施例还提供一种电子设备,包括存储器存储有多条指令;所述处理器从
所述存储器中加载指令,以执行本技术实施例所提供的任一种分布式锁处理方法中的步骤。
18.本技术实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本技术实施例所提供的任一种分布式锁处理方法中的步骤。
19.本技术实施例可以从注解参数获取到锁类型和锁失效时长,并根据锁类型生成具有锁标识的分布式锁,基于注解无需在业务代码中添加额外的代码逻辑。然后再将分布式锁添加给执行业务代码的目标线程,以确保目标线程可以访问目标对象,并对分布式锁进行续时处理,避免在的业务代码执行完之前释放分布式锁,在业务代码执行完毕时,正常释放分布式锁。基于注解的方式实现分布式锁,且可对分布式锁进行续时和正常释放,降低了开发成本,从而可以高效地实现分布式锁。
附图说明
20.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
21.图1是本技术实施例提供的分布式锁处理方法的场景示意图;
22.图2是本技术实施例提供的分布式锁处理方法的流程示意图;
23.图3是本技术实施例提供的分布式锁处理方法的整体框架示意图;
24.图4本技术实施例提供的分布式锁处理装置的结构示意图;
25.图5是本技术实施例提供的电子设备的结构示意图。
具体实施方式
26.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
27.本技术实施例提供分布式锁处理方法、装置、电子设备和存储介质。
28.其中,该分布式锁处理装置具体可以集成在电子设备中,该电子设备可以为终端、服务器等设备。其中,终端可以为手机、平板电脑、智能蓝牙设备、笔记本电脑、或者个人电脑(personal computer,pc)等设备;服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群。
29.在一些实施例中,该分布式锁处理装置还可以集成在多个电子设备中,比如,分布式锁处理装置可以集成在多个服务器中,由多个服务器来实现本技术的分布式锁处理方法。
30.在一些实施例中,服务器也可以以终端的形式来实现。
31.例如,参考图1,示出了本技术实施例提供的分布式锁处理方法的场景示意图。
32.该场景可以包括至少一个用户终端1000,至少一个服务器2000,至少一个数据库
3000,以及网络4000。用户持有的用户终端1000可以通过网络4000连接到服务器2000。其中,用户终端1000是具有计算硬件的任何设备,该计算硬件能够运行业务代码对应的软件产品;服务器2000可以是单一服务器,可以是服务器集群;网络4000可以是无线网络或者有线网络,比如无线网络为无线局域网(wlan)、局域网(lan)、蜂窝网络、2g网络、3g网络、4g网络、5g网络等。另外,不同的用户终端1000之间也可以使用自身的蓝牙网络或者热点网络连接到其他终端或者连接到服务器2000。另外,该场景还可以包括至少一个数据库3000,该数据库3000用于存储分布式锁处理时所产生的日志数据。
33.在用户终端1000上执行业务代码,即可实现对分布式锁的处理,用户终端1000可以是获取注解参数,注解参数包括锁类型和锁失效时长;根据锁类型生成具有锁标识的分布式锁,分布式锁用于访问目标对象;根据锁标识和锁失效时长,为目标线程添加分布式锁,目标线程为执行业务代码的线程,业务代码用于对目标对象进行处理;利用锁失效时长,对续时队列中的续时资源进行续时处理,续时资源包括分布式锁对应的资源;若业务代码执行完毕,删除分布式锁,并从续时队列中删除分布式锁对应的资源。
34.需要说明的是,在日常开发中,一个进程中的多个线程去就竞争某一资源时,通常可以使用synchronize关键字或reentrantlock锁等操作给方法或代码块加锁,当某个方法或代码块使用锁,在同一时刻仅有一个线程执行该方法或该代码块,由于线程锁的实现本质上是依靠线程之间共享内存,由此线程锁通常只在同一jvm中有效果。进程具有独立性,各个进程无法访问其他进程的资源,为了控制同一操作系统中多个进程访问某个共享资源,可以通过redis实现分布式锁。但是常规的方式对业务代码存在入侵,且开发成本高,由此,可以采用本技术实施例提供的方法高效地实现分布式锁。以下分别进行详细说明。
35.在本实施例中,提供了一种分布式锁处理方法,如图2所示,该分布式锁处理方法的具体流程可以如下:
36.s110、获取注解参数,所述注解参数包括锁类型和锁失效时长。
37.注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰,注解对于它所修饰的代码并没有直接的影响。通俗而言,注解是一种标记,可以在程序代码中的关键节点(类、方法、变量、参数、包)上打上标记,然后在程序代码编译或运行时可以检测到这些标记从而执行一些特殊操作。
38.在本技术实施例中,可以新建自定义注解,该自定义注解可以包括第一注解和第二注解。其中,第一注解可用于标记入口,标记在什么地方执行第一注解对应的特殊操作。第二注解是指用于从业务代码中提取对应的参数,以实现对应的特殊操作。
39.在一些实施方式中,第一注解里可以设定锁失效时长以及锁对应的业务类型,即锁类型;第二注解用于结合锁对应的业务类型,生成具有锁标识的分布式锁。例如,第一注解可以是@myredidslock,elementtype为type,然后在注解里设定锁失效时长、锁对应的业务类型,其中,elementtype为type是第一注解的作用目标是接口、类、枚举、注解。
40.第二注解可以是@myrediskey,elementtype为parameter,用于结合锁对应的业务类型生成分布式锁,其中,elementtype为parameter是指第二注解的作用目标为方法参数。
41.从而,在业务代码执行时,可以基于注解获取到对应的注解参数,此处的注解参数可以包括锁类型和锁失效时长。
42.s120、根据所述锁类型生成具有锁标识的分布式锁。
43.可以理解的是,基于前述第二注解,可以从业务代码中提取出业务类型,即锁类型,然后基于锁类型可生成具有锁标识的分布式锁。其中,锁标识可以是按照预设规则生成的,在一些实施方式中,可以是获取业务类型对应的第一子标识,根据当前时间获取第二子标识,将所述第一子标识和所述第二子标识组合为所述锁标识。
44.作为一种实施方式,可以预先建立预设业务类型和预设标识之间的映射关系,其中,预设业务类型可以包括所有的业务类型。在获取到业务类型时,可以根据预设业务类型和预设标识之间的映射关系,将该业务类型对应的预设标识确定为第一子标识。例如,预设业务类型包括类型1,类型2和类型3,其中,类型1对应的预设标识为a,类型2对应的预设标识为b,类型3对应的预设标识为c。若获取到的业务类型为类型2,则可以确定出第一子标识为b。
45.第二子标识可以是基于当前时间获取到的,例如,在确定出第一子标识后,可以获取当前时间,以得到第二子标识。例如,当前时间为13点14分52秒,则第二子标识可记为131452。
46.然后将第一子标识和第二子标识组合,则可以得到锁标识。作为一种实施方式,可以是以按照第一子标识、第二子标识的顺序拼接,得到锁标识。若第一子标识为b,第二子标识为131452,由此,锁标识可以是b131452。作为另一种实施方式,可以是按照第二子标识、第一子标识的顺序拼接,得到锁标识,若第一子标识为b,第二子标识为131452,锁标识可以是131452b。
47.在一些实施方式中,还可以是对第一子标识和第二子标识进行哈希处理,以得到最终的锁标识。从而可知,按照上述锁标识的生成规则,生成的每个分布式锁都具有其唯一的锁标识,可用于为唯一指代某一分布式锁。
48.分布式锁可用于访问目标对象,即获取到分布式锁,则获取到目标对象的访问权限。也就是说,仅有持有分布式锁线程可以访问目标对象,其他线程若想要访问目标对象,则需要等待该分布式锁被释放后,由其他线程获取,以访问目标对象。
49.s130、根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁。
50.线程是指操作系统能够进行运算调度的最小单元,可被包含在进程之中,是进程中的实际运作单位。一条线程是指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。目标线程是指执行业务代码的线程,业务代码可用于对目标对象进行处理,由此可知,要执行业务代码则需要获取到目标对象的访问权限,则需要给业务代码进行加锁,以便目标线程可以获取到分布式锁。
51.在生成分布式锁后,可以为目标线程添加分布式锁。作为一种实施方式,可以是基于预设时间参数,设置所述锁失效时长;确定所述目标线程的标识信息以及所述分布式锁的重入次数;根据所述标识信息、所述重入次数以及所述锁标识,为所述目标线程添加具有所述锁标识的所述分布式锁。
52.其中,为目标线程添加分布式锁可包括两个步骤,一是为分布式锁设置锁失效时长,二是设置redis缓存信息。
53.为分布式锁设置锁失效时长时,可以是直接根据预设时间参数,将该时间参数设置为锁失效时长。其中,预设时间参数可以是指预先设置好的时间参数,可以直接将预设时间参数作为锁失效时长使用。通常,锁失效时长可以是指一个时间段,例如,锁失效时长可
以是3s,即3s后自动释放分布式锁。
54.在设置redis缓存信息时,可以是根据目标线程的信息和分布式锁的信息设置redis缓存信息。目标线程的标识信息可用于唯一表征目标线程,分布式锁的重入次数是指该分布式锁被重入的次数。其中,重入是指分布式锁具有可重入性,即一个线程不用释放锁,可以重复的获取一个锁n次。例如,目标线程获取到了分布式锁,当目标线程想要再次获取分布式锁时,由于分布式锁已经被目标线程占用,则目标线程可以直接再次获取该分布式锁,而无需等待释放分布式锁后再获取。
55.在一些实施方式中,在根据标识信息、重入次数和锁标识添加分布式锁时,可以是将所述锁标识、所述标识信息以及所述重入次数关联存储,得到初始缓存信息;将所述初始缓存信息设置为预设类型,以为所述目标线程添加具有所述锁标识的所述分布式锁。
56.例如,目标线程的标识信息为x,用于表征目标线程x,该目标线程x的重入次数为1,即仅获取一次分布式锁,对应线程的标识信息和重入次数可以记为“x-1”,并和分布式锁的锁标识关联存储,得到初始缓存信息。再将初始缓存信息设置为map类型,则可以得到缓存信息,即redis缓存。其中map类型是由键值对组成的无序集合,map有多种实现类,可以包括hashmap、treemap等,在本技术实施例中,可以使用hashmap。
57.在一些实施方式中,为了将设置redis缓存信息和锁失效时长变为原子操作,可以采用lua脚本执行。其中,原子操作是指不会被线程调度机制打断的操作,该操作一旦开始执行,就一直运行到结束,中间不会切换到另一个线程,由此可保证代码执行的准确性。lua脚本可以将脚本内命令一次执行保证原子性,即前述的设置锁失效时长和设置redis缓存信息均是一次执行。若其中一个失败,则认为添加分布式锁失败,例如,设置锁失效时长失败或设置redis缓存失败,则可以认为为目标线程添加分布式锁失败。
58.在实际的应用中,可以自定义切面,对myredislock注解的类进行around环绕通知增强。其中,自定义切面是指自定义切面类,切面类是用来给业务代码方法增加功能的类,在这个类中有切面的功能代码。around环绕通知是指通过拦截某方法的方式,在某方法前后增强功能的通知。在环绕增强中,即可以实现上述s110至s130的步骤,也即在业务代码执行时先进行分布式锁的获取。
59.s140、利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源。
60.在为目标线程添加分布式锁之后,还可以获取添加反馈信息,并基于添加反馈信息进行后续处理。例如,可以是获取添加反馈信息,所述添加反馈信息包括添加成功或添加失败;若所述添加反馈信息为添加成功,生成所述分布式锁对应的资源,并将所述分布式锁对应的资源添加至所述续时队列;若所述添加反馈信息为添加失败,获取日志信息。
61.其中,添加反馈信息是指为目标线程添加分布式锁的添加结果,可以包括添加成功或添加失败。添加成功是指分布式锁添加成功,分布式锁添加成功则表明目标线程可以访问目标对象,并对目标对象进行处理。添加失败是指分布式锁添加失败,分布式锁添加失败表明目标线程不能的访问目标对象,则无法对目标对象进行处理。在一些实施方式中,可以定义第一字符表示添加成功,定义第二字符表示添加失败,其中,第一字符和第二字符可以根据实际的需要进行设置。例如,第一字符为1,第二字符为0,获取到添加反馈信息为1时,表明添加成功;获取到添加反馈信息为0时,表明添加失败。
62.若分布式锁添加成功,可以生成分布式锁对应的资源,并将该资源添加到续时队列中,以便后续处理。若分布式锁添加失败,则可以获取对应的日志信息,以便进行异常处理。
63.在添加分布式锁成功后,可以生成分布式锁对应的资源,并加入续时队列中,由此,续时队列的续时资源,均是添加成功的分布式锁对应的资源。
64.由于每个分布式锁都设置有对应的锁失效时长,若到达锁失效时长,则可以自动释放分布式锁,从而目标线程无法继续访问目标对象。
65.在一些实施方式中,业务代码的执行时长可能大于锁失效时长,例如,业务代码执行完毕需要20s,而锁失效时长为10s,则会出现在业务代码还在执行时,分布式锁就释放了,从而导致业务代码无法正常进行。为了确保业务代码的正常执行,可以对续时队列中的续时资源进行续时操作,避免提前释放分布式锁。
66.在一些实施方式中,对续时队列中的续时资源进行续时处理,可以是创建续时线程,并控制所述续时线程按照预设间隔扫描所述续时队列中的每个续时资源;针对每个续时资源,根据对应的锁失效时长对所述续时资源进行续时处理。
67.被添加至续时队列中的资源可以被称为续时资源,在进行续时处理时,可以是对每个续时资源均进行续时处理。可选的,可以是创建续时线程,由续时线程执行续时处理。作为一种实施方式,该续时线程可以是按照预设间隔扫描续时队列中的每个续时资源,对于扫描到的每个续时资源,进行续时处理。
68.预设间隔可以是预先设置的时间间隔,可以根据实际的需要进行设置,例如,可以设置为1s,则每间隔1s续时线程则扫描一次。需要说明的是,续时队列中的续时资源可能随时发生变化,则每次扫描到的续时资源可能均是不同的。例如,在一次扫描中,扫描到的续时资源为2个,分别为续时资源a和续时资源b,在经过1s后再次扫描时,扫描到的续时资源为3个,分别为续时资源b、续时资源c和续时资源d。
69.针对扫描到的每个续时资源,续时线程可以先确定续时资源是否满足续时条件;若满足续时条件,则对续时资源进行续时处理;若不满足续时条件,则继续判断下一续时资源是否满足续时条件。
70.在一些实施方式中,在确定续时资源是否满足续时条件时,可以是获取所述续时资源加入所述续时队列的加入时间;根据所述锁失效时长、所述加入时间和当前时间,计算锁剩余时长;若所述锁剩余时长小于预设值,延长所述续时资源对应的锁失效时长。
71.加入时间是指续时资源加入至续时队列中的时刻,具体可以是在每个资源加入至续时队列成为续时资源时,将其加入时间作为时间戳携带在续时资源中。从而根据续时资源携带的时间戳,可以直接获取到续时资源的加入时间。
72.锁剩余时长是指分布式锁生效的剩余时长,例如,剩下1s,在1s后该分布式锁则会自动释放。作为一种实施方式,在计算锁剩余时长时,可以是先基于加入时间和锁失效时长,计算失效时间;再计算失效时间和当前时间之间的差值,得到锁剩余时长。例如,加入时间为12点12分12秒,锁失效时长为4s,则可以计算出锁失效时间为12点12分16秒,若当前时间为12点12分10秒,则可以计算得到锁剩余时长为6s。
73.在计算得到锁剩余时长后,可以比较锁剩余时长和预设值的大小,若锁剩余时长大于预设值,表明续时资源对应的分布式锁具体释放还有一定的时间;若锁剩余时长小于
预设值,表明续时资源对应的分布式锁即将释放,需要进行续时处理,即延长续时资源对应的锁失效时长。
74.在一些实施方式中,预设值可以和锁失效时长相关,例如,预设值可以是锁失效时长的三分之一。当然,预设值还可以设置为其他值,可根据实际的需要进行设置。
75.在一些实施方式中,延长续时资源对应的锁失效时长时,可以是对锁失效时长进行延长。例如,锁失效时长原本为3秒,可以将其延长至6秒,9秒等,则下次判断是否进行续时处理时,使用延长后的锁失效时长进行锁剩余时长的计算。
76.在一些实施方式中,还可以是利用锁失效时长对加入时间进行更新。例如,若所述锁剩余时长小于预设值,根据所述锁失效时长和所述加入时间,计算目标加入时间;基于所述目标加入时间对所述续时资源的加入时间进行更新处理。
77.例如加入时间为12点14分02秒,锁失效时长为3s,则可以在加入时间的基础上加上3秒,计算得到目标加入时间为12点14分05s;再利用目标加入时间对该续时资源的加入时间进行更新,即将目标加入时间作为该续时资源的加入时间,可知续时资源的加入时间变化为12点14分05s,则后续可利用更新后的加入时间确定是否满足续时调条件,实现延长续时资源对应的分布式锁的锁失效时长。
78.通过延长锁失效时长,可有效避免在业务代码未执行完毕时,分布式锁提前释放的情况,可有效确保业务代码的正常执行。
79.s140、若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。
80.可以理解的是,执行业务代码的目标线程是获取到分布式锁的线程,而进行续时处理的线程是续时线程,两个线程可同时执行。当业务代码执行完毕后,目标线程则可以释放分布式锁,以便其他线程访问目标对象。
81.如前述内容中,在为目标线程添加分布式锁时,设置了分布式锁对应的缓存信息,且分布式锁添加成功后,在续时队列中生成了对应的续时资源。从而,在释放分布式锁时,可以是该分布式锁对应的缓存信息,并将分布式锁对应的续时资源从续时队列中删除,当分布式锁的缓存信息和续时资源均被删除时,可认为释放分布式锁。释放分布式锁后,目标线程则不能继续访问目标对象。
82.需要说明的是,前述内容中分布式锁具有可重入性,当目标线程再次添加分布式锁,目标线程的重入次数会增加,当重入次数不为1时,则需要多次释放锁,才能完全释放分布式锁。例如,重入次数为2,表明目标线程获取2次分布式锁,释放一次分布式锁时,重入次数变化为1,再释放一次分布式锁,分布式锁完全释放。
83.为了详细说明上述分布式锁处理过程,可参阅图3,示出了分布式锁处理方法的整体框架示意图。其中,业务代码上添加了@myredidslock注解,在方法参数上添加@myrediskey注解,并根据实际的需要在注解中设置相应的值。在执行业务代码时,可以解析@myredidslock注解和@myrediskey注解,获取到对应的注解参数;并通过注解参数生成具有锁标识的分布式锁。
84.然后在分布式锁生成之后,可以通过lua脚本为执行业务代码的目标线程添加分布式锁。具体可以是通过jedis执行lua脚本,在redis中设置缓存信息,即将锁标识和目标线程的标识信息、重入次数关联存储在redis中,并设置为hmap类型。同时还可以基于lua脚
本根据时间参数设置锁失效时长。基于lua脚本可以将设置缓存信息和锁失效时长变为原子操作。
85.然后可以根据添加反馈信息确定添加分布式锁是否成功;若失败,则获取日志信息,并基于日志信息抛出异常,以便后续进行异常处理;若成功,则生成和分布式锁对应的资源,并加入续时队列中,定时对续时队列中的续时资源进行续时处理。
86.其中,续时处理可以是指通过续时线程按照预设间隔扫描续时队列中的每个资源,即续时资源;然后根据续时资源的锁剩余时长和预设值,确定续时资源是否满足续时条件;若满足续时条件,则进行续时处理;若不满足续时条件,则继续查找续时队列中的下一个资源。
87.执行业务代码的目标线程在成功添加分布式锁后,则可以继续执行业务代码,并在业务代码执行完成时,释放分布式锁。其中,释放分布式锁可以包括将分布式锁对应的缓存信息删除,以及在续时队列中将分布式锁对应的资源删除。
88.其中,当多个进程不再同一个系统中,就需要用分布式锁控制多个进程对目标对象的访问,通过自定义注解集合切面的方式,无需在业务代码中增加对分布式锁的相关代码,不会对入侵业务代码,且使用方式灵活,可在任意方法上添加自定义注解实现加锁,并且开发人员仅需定义生成的分布式锁即可,避免了繁琐的分布式锁加锁、解锁、续时等操作的代码编写,可高效实现分布式锁。
89.本技术实施例可以从注解参数获取到锁类型和锁失效时长,并根据锁类型生成具有锁标识的分布式锁,基于注解无需在业务代码中添加额外的代码逻辑。然后再将分布式锁添加给执行业务代码的目标线程,以确保目标线程可以访问目标对象,并对分布式锁进行续时处理,避免在的业务代码执行完之前释放分布式锁,在业务代码执行完毕时,正常释放分布式锁。基于注解的方式实现分布式锁,且可对分布式锁进行续时和正常释放,降低了开发成本,从而可以高效地实现分布式锁。
90.为了更好地实施以上方法,本技术实施例还提供一种分布式锁处理装置,该分布式锁处理装置具体可以集成在电子设备中,该电子设备可以为终端、服务器等设备。其中,终端可以为手机、平板电脑、智能蓝牙设备、笔记本电脑、个人电脑等设备;服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群。
91.比如,在本实施例中,将以分布式锁处理装置具体集成在服务器为例,对本技术实施例的方法进行详细说明。
92.例如,如图4所示,该分布式锁处理装置200可以包括获取模块210、生成模块220、添加模块230、续时模块240以及释放模块250。
93.获取模块210,用于获取注解参数,所述注解参数包括锁类型和锁失效时长;
94.生成模块220,用于根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;
95.添加模块230,用于根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;
96.续时模块240,用于利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;
97.释放模块250,用于若所述业务代码执行完毕,删除所述分布式锁,并从所述续时
队列中删除所述分布式锁对应的资源。
98.在一些实施例中,添加模块230还包括:
99.设置单元,用于基于预设时间参数,设置所述锁失效时长;
100.确定单元,用于确定所述目标线程的标识信息以及所述分布式锁的重入次数;
101.生成单元,用于根据所述标识信息、所述重入次数以及所述锁标识,为所述目标线程添加具有所述锁标识的所述分布式锁。
102.在一些实施例中,生成单元还用于:
103.将所述锁标识、所述标识信息以及所述重入次数关联存储,得到初始缓存信息;
104.将所述初始缓存信息设置为预设类型,以为所述目标线程添加具有所述锁标识的所述分布式锁。
105.在一些实施例中,分布式锁处理装置300还包括反馈模块,利用所述锁失效时长,对续时队列中的续时资源进行续时处理之前,反馈模块用于:
106.获取添加反馈信息,所述添加反馈信息包括添加成功或添加失败;
107.若所述添加反馈信息为添加成功,生成所述分布式锁对应的资源,并将所述分布式锁对应的资源添加至所述续时队列;
108.若所述添加反馈信息为添加失败,获取日志信息。
109.在一些实施例中,所述续时模块240还包括:
110.创建单元,用于创建续时线程,并控制所述续时线程按照预设间隔扫描所述续时队列中的每个续时资源;
111.续时单元,用于针对每个续时资源,根据对应的锁失效时长对所述续时资源进行续时处理。
112.在一些实施例中,续时单元还用于:
113.获取所述续时资源加入所述续时队列的加入时间;
114.根据所述锁失效时长、所述加入时间和当前时间,计算锁剩余时长;
115.若所述锁剩余时长小于预设值,延长所述续时资源对应的锁失效时长。
116.在一些实施例中,续时单元还用于:
117.若所述锁剩余时长小于预设值,根据所述锁失效时长和所述加入时间,计算目标加入时间;
118.基于所述目标加入时间对所述续时资源的加入时间进行更新处理。
119.具体实施时,以上各个模块或单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个模块或单元的具体实施可参见前面的方法实施例,在此不再赘述。
120.由上可知,本实施例的分布式锁处理装置可以从注解参数获取到锁类型和锁失效时长,并根据锁类型生成具有锁标识的分布式锁,基于注解无需在业务代码中添加额外的代码逻辑。然后再将分布式锁添加给执行业务代码的目标线程,以确保目标线程可以访问目标对象,并对分布式锁进行续时处理,避免在的业务代码执行完之前释放分布式锁,在业务代码执行完毕时,正常释放分布式锁。基于注解的方式实现分布式锁,且可对分布式锁进行续时和正常释放,降低了开发成本,从而可以高效地实现分布式锁。
121.此外,本发明实施例还提供一种电子设备,该电子设备可以为终端或者服务器,如
图5所示,其示出了本发明实施例所涉及的电子设备的结构示意图,具体来讲:
122.该电子设备可以包括一个或者一个以上处理核心的处理器301、一个或一个以上计算机可读存储介质的存储器302、电源303和输入单元304等部件。本领域技术人员可以理解,图5中示出的电子设备结构并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
123.处理器301是该电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器302内的软件程序和/或模块,以及调用存储在存储器302内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监测。可选的,处理器301可包括一个或多个处理核心;优选的,处理器301可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器301中。
124.存储器302可用于存储软件程序以及模块,处理器301通过运行存储在存储器302的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器302可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据电子设备的使用所创建的数据等。此外,存储器302可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器302还可以包括存储器控制器,以提供处理器301对存储器302的访问。
125.电子设备还包括给各个部件供电的电源303,优选的,电源303可以通过电源管理系统与处理器301逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源303还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
126.该电子设备还可包括输入单元304,该输入单元304可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
127.尽管未示出,电子设备还可以包括显示单元等,在此不再赘述。具体在本实施例中,电子设备中的处理器301会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器302中,并由处理器301来运行存储在存储器302中的应用程序,从而实现各种功能,如下:
128.获取注解参数,所述注解参数包括锁类型和锁失效时长;
129.根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;
130.根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;
131.利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;
132.若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。
133.以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
134.由上可知,本实施例提供的电子设备可以从注解参数获取到锁类型和锁失效时长,并根据锁类型生成具有锁标识的分布式锁,基于注解无需在业务代码中添加额外的代码逻辑。然后再将分布式锁添加给执行业务代码的目标线程,以确保目标线程可以访问目标对象,并对分布式锁进行续时处理,避免在的业务代码执行完之前释放分布式锁,在业务代码执行完毕时,正常释放分布式锁。基于注解的方式实现分布式锁,且可对分布式锁进行续时和正常释放,降低了开发成本,从而可以高效地实现分布式锁。
135.本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
136.为此,本技术实施例提供一种计算机可读存储介质,其中存储有多条计算机程序,该计算机程序能够被处理器进行加载,以执行本技术实施例所提供的任一种分布式锁处理方法中的步骤。例如,该计算机程序可以执行如下步骤:
137.获取注解参数,所述注解参数包括锁类型和锁失效时长;
138.根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;
139.根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;
140.利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;
141.若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。
142.以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
143.其中,该存储介质可以包括:只读存储器(rom,read only memory)、随机存取记忆体(ram,random access memory)、磁盘或光盘等。
144.由于该存储介质中所存储的计算机程序,可以执行本技术实施例所提供的任一种分布式锁处理方法中的步骤,因此,可以实现本技术实施例所提供的任一种分布式锁处理方法所能实现的有益效果,详见前面的实施例,在此不再赘述。
145.以上对本技术实施例所提供的一种分布式锁处理方法、装置、电子设备及存储介质进行了详细介绍,本文中应用了具体个例对本技术的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本技术的方法及其核心思想;同时,对于本领域的技术人员,依据本技术的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本技术的限制。

技术特征:
1.一种分布式锁处理方法,其特征在于,所述方法包括:获取注解参数,所述注解参数包括锁类型和锁失效时长;根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。2.根据权利要求1所述的方法,其特征在于,所述根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,包括:基于预设时间参数,设置所述锁失效时长;确定所述目标线程的标识信息以及所述分布式锁的重入次数;根据所述标识信息、所述重入次数以及所述锁标识,为所述目标线程添加具有所述锁标识的所述分布式锁。3.根据权利要求2所述的方法,其特征在于,所述根据所述标识信息、所述重入次数以及所述锁标识,为所述目标线程添加具有所述锁标识的所述分布式锁,包括:将所述锁标识、所述标识信息以及所述重入次数关联存储,得到初始缓存信息;将所述初始缓存信息设置为预设类型,以为所述目标线程添加具有所述锁标识的所述分布式锁。4.根据权利要求1所述的方法,其特征在于,所述利用所述锁失效时长,对续时队列中的续时资源进行续时处理之前,还包括:获取添加反馈信息,所述添加反馈信息包括添加成功或添加失败;若所述添加反馈信息为添加成功,生成所述分布式锁对应的资源,并将所述分布式锁对应的资源添加至所述续时队列;若所述添加反馈信息为添加失败,获取日志信息。5.根据权利要求4所述的方法,其特征在于,所述利用所述锁失效时长,对续时队列中的续时资源进行续时处理,包括:创建续时线程,并控制所述续时线程按照预设间隔扫描所述续时队列中的每个续时资源;针对每个续时资源,根据对应的锁失效时长对所述续时资源进行续时处理。6.根据权利要求5所述的方法,其特征在于,所述针对每个续时资源,根据对应的锁失效时长对所述续时资源进行续时处理,包括:获取所述续时资源加入所述续时队列的加入时间;根据所述锁失效时长、所述加入时间和当前时间,计算锁剩余时长;若所述锁剩余时长小于预设值,延长所述续时资源对应的锁失效时长。7.根据权利要求6所述的方法,其特征在于,若所述锁剩余时长小于预设值,延长所述续时资源对应的锁失效时长,包括:若所述锁剩余时长小于预设值,根据所述锁失效时长和所述加入时间,计算目标加入
时间;基于所述目标加入时间对所述续时资源的加入时间进行更新处理。8.一种分布式锁处理装置,其特征在于,所述装置包括:获取模块,用于获取注解参数,所述注解参数包括锁类型和锁失效时长;生成模块,用于根据所述锁类型生成具有锁标识的分布式锁,所述分布式锁用于访问目标对象;添加模块,用于根据所述锁标识和所述锁失效时长,为目标线程添加所述分布式锁,所述目标线程为执行业务代码的线程,所述业务代码用于对所述目标对象进行处理;续时模块,用于利用所述锁失效时长,对续时队列中的续时资源进行续时处理,所述续时资源包括所述分布式锁对应的资源;释放模块,用于若所述业务代码执行完毕,删除所述分布式锁,并从所述续时队列中删除所述分布式锁对应的资源。9.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有多条指令;所述处理器从所述存储器中加载指令,以执行如权利要求1~7任一项所述的分布式锁处理方法中的步骤。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有多条指令,所述指令适于处理器进行加载,以执行权利要求1~7任一项所述的分布式锁处理方法中的步骤。

技术总结
本申请实施例公开了分布式锁处理方法、装置、电子设备和存储介质;该方法包括:获取注解参数,所述注解参数包括锁类型和锁失效时长;根据锁类型生成具有锁标识的分布式锁;根据锁标识和锁失效时长,为目标线程添加分布式锁;利用锁失效时长,对续时队列中的续时资源进行续时处理;若业务代码执行完毕,删除分布式锁,并从续时队列中删除分布式锁对应的资源。基于注解的方式实现分布式锁,且可对分布式锁进行续时和正常释放,降低了开发成本,从而可以高效地实现分布式锁。效地实现分布式锁。效地实现分布式锁。


技术研发人员:周小亮
受保护的技术使用者:平安银行股份有限公司
技术研发日:2023.03.27
技术公布日:2023/7/7
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐