一种分布式锁制造技术

技术编号:29835029 阅读:10 留言:0更新日期:2021-08-27 14:24
本发明专利技术涉及计算机技术领域,具体提供了一种分布式锁,基于Redis的自身特性以及命令,设置key值及过期时间,利用分布式锁加锁、释放锁和释放锁前置检查过程,用于保证进程访问共享资源的完整性和一致性。与现有技术相比,本发明专利技术避免了同时访问时对资源进行争夺导致系统错误,提高了程序稳定性,具有良好的推广价值。

【技术实现步骤摘要】
一种分布式锁
本专利技术涉及计算机
,具体提供一种分布式锁。
技术介绍
在单机时代,尽管不需要分布式锁,但仍然面临的类似问题,多个线程对临界资源访问的时候,面临着如何保证资源一致性和完整性的问题,我们可以通过线程间加速的方式,如ava中synchronize/Lock等。随着互联网技术的不断发展,分布式系统成为常见的场景,共享资源存在于不同节点中,简单的线程间加锁的方式就难以满足应用的需要。
技术实现思路
本专利技术是针对上述现有技术的不足,提供一种实用性强的分布式锁。本专利技术解决其技术问题所采用的技术方案是:一种分布式锁,基于Redis的自身特性以及命令,设置key值及过期时间,利用分布式锁加锁、释放锁和释放锁前置检查过程,用于保证进程访问共享资源的完整性和一致性。进一步的,在分布式锁加锁中,Redis的setnx命令适合作为排他性的锁实现,该命令只有在相应key值不存在的情况下才会通过该命令设置value成功,否则返回失败结果。进一步的,当一个进程需要独占某个共享资源时,需要通过setnx命令设置value,当其余进程再执行该命令时,则设置value失败即为获得锁失败。进一步的,所述加锁的流程为:加锁时通过命令设置key值及过期时间,若命令执行成功,则说明获得锁成功,若命令执行失败,则获取已存在锁的过期时间与当前系统时间进行比较,若过期时间小于当前系统时间,说明锁已过期,则可以由该进程重新获得,使用getset命令设置新的过期时间;若过期时间大于当前系统时间,说明锁未过期,则无法获得。进一步的,在释放锁中,当一个进程完成对某个共享资源的独占使用后,可以执行delete命令删除此前获得锁过程中所设置的键值对;此后其余进程需要对该共享资源的进行独占访问时,即可通过setnx命令获得锁。进一步的,所述释放锁的流程为:释放锁时首先验证已存在锁的特征值,判断是否为当前进程所设置,若验证失败,则不可进行释放锁操作;若验证成功,则获取该锁的过期时间,与当前系统时间进行比较,若过期时间小于当前系统时间,说明锁已过期,无需进行操作,若过期时间大于当前系统时间,则执行delete命令,进行释放锁操作。进一步的,释放锁前置检查,当一个进程还没有结束对共享资源的独占访问,锁会当达到超时时间而释放掉,当另外进程获得锁后,则当一个进程结束对资源的访问后,则会错误执行释放锁操作。进一步的,当进程进行释放锁操作时,通过get命令获得value,验证此value是否为该进程设置的identifier,若验证通过,则可进行delete操作。本专利技术的一种分布式锁和现有技术相比,具有以下突出的有益效果:本专利技术实现的分布式锁,具有互斥性、无死锁、容错性的特点。在分布式系统环境下,保证了多个客户端对共享资源进行独享访问时完整性和一致性,避免了同时访问时对资源进行争夺导致系统错误,提高了程序稳定性。附图说明为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。附图1是一种分布式锁中加锁流程示意图;附图2是一种分布式锁中释放锁流程示意图。具体实施方式为了使本
的人员更好的理解本专利技术的方案,下面结合具体的实施方式对本专利技术作进一步的详细说明。显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例都属于本专利技术保护的范围。下面给出一个最佳实施例:本实施例中的一种分布式锁,基于Redis的自身特性以及命令,设置key值及过期时间,利用分布式锁加锁、释放锁和释放锁前置检查过程,用于保证进程访问共享资源的完整性和一致性。加锁:Redis的setnx命令适合作为排他性的锁实现,该命令只有在相应key值不存在的情况下才会通过该命令设置value成功,否则返回失败结果。当一个进程需要独占某个共享资源时,需要通过setnx命令设置value,当其余进程再执行改命令时,则设置value失败即为获得锁失败。继而满足分布式锁的互斥性原则。释放锁:当一个进程完成对某个共享资源的独占使用后,可以执行delete命令删除此前获得锁过程中所设置的键值对。此后其余进程需要对该共享资源的进行独占访问时,即可通过setnx命令获得锁。超时时间设置:若仅通过setnx和delete命令完成加锁及释放锁的过程,若当前已经获得锁的进程出现异常状态,无法释放已获得的锁,则会出现死锁的状况。为避免死锁的情况出现,需要给锁加一个存活周期,如果锁被某个进程获得的时间超过存活时间上限,则Redis强制释放该锁。通过此方法,在某个获得锁的进程出现异常情况无法释放锁的时候,其他进程仍然可以再超时时间之后重新获得锁,得以访问共享资源。释放锁前置检查:Redis在达到超时时间上限后强制释放锁,可以避免死锁,但有可能会破坏锁的互斥性质。当一个进程还没有结束对共享资源的独占访问,锁会当达到超时时间而释放掉,当另外进程获得锁后,则当一个进程结束对资源的访问后,则会错误执行释放锁操作。这样就需要在释放锁之前进行检查,避免错误释放其他进程的锁。当进程进行释放锁操作时,通过get命令获得value,验证此value是否为该进程设置的identifier,若验证通过,则可进行delete操作。参阅图1,如下:S1、加锁的过程利用setex()命令,设置key值和时间,时间为currentTime+expireTime,若命令结果返回值为1,则命令执行成功,即为获得锁。S2、若S1中返回结果为0,则执行命令失败,即为获得锁失败。执行get(key)获取已存在锁的过期时间,并与当前系统时间进行比较,若过期时间已小于当前系统时间,则该已存在锁过期,可以允许其余进程获取,进入S3操作。S3、生成新的过期时间,currentTime+expireTime,执行getset()命令将锁的过期时间设置为新值,即当前锁被新进程获得。S4、进程获得锁之后,可以执行业务,对共享资源进行独享访问。参阅图2,如下:S1、释放锁时,首先获取当前锁的identifier,验证是否为当前进程设置的的锁,若identifier不符,则结束操作,若identifier符合当前进程标识,则转向S2操作。S2、比较当前系统时间与锁的过期时间,若锁的过期时间已小于当前系统时间,则说明锁已过期,不需要对锁进行处理。S3、比较当前系统时间与锁的过期时间,若锁的过期时间大于当前系统时间,执行delete命令释放锁。上述具体的实施方式仅是本专利技术具体的个案,本专利技术的专利保护范本文档来自技高网
...

【技术保护点】
1.一种分布式锁,其特征在于,基于Redis的自身特性以及命令,设置key值及过期时间,利用分布式锁加锁、释放锁和释放锁前置检查过程,用于保证进程访问共享资源的完整性和一致性。/n

【技术特征摘要】
1.一种分布式锁,其特征在于,基于Redis的自身特性以及命令,设置key值及过期时间,利用分布式锁加锁、释放锁和释放锁前置检查过程,用于保证进程访问共享资源的完整性和一致性。


2.根据权利要求1所述的一种分布式锁,其特征在于,在分布式锁加锁中,Redis的setnx命令适合作为排他性的锁实现,该命令只有在相应key值不存在的情况下才会通过该命令设置value成功,否则返回失败结果。


3.根据权利要求2所述的一种分布式锁,其特征在于,当一个进程需要独占某个共享资源时,需要通过setnx命令设置value,当其余进程再执行该命令时,则设置value失败即为获得锁失败。


4.根据权利要求3所述的一种分布式锁,其特征在于,所述加锁的流程为:
加锁时通过命令设置key值及过期时间,若命令执行成功,则说明获得锁成功,若命令执行失败,则获取已存在锁的过期时间与当前系统时间进行比较,若过期时间小于当前系统时间,说明锁已过期,则可以由该进程重新获得,使用getset命令设置新的过期时间;若过期时间大于当前系统时间,说明锁未过期,则无法获得。


5.根据权利要求1所...

【专利技术属性】
技术研发人员:宋喆张建伟江燕
申请(专利权)人:浪潮云信息技术股份公司
类型:发明
国别省市:山东;37

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1