CN111782669B - 一种分布式锁的实现方法、装置及电子设备 - Google Patents

一种分布式锁的实现方法、装置及电子设备 Download PDF

Info

Publication number
CN111782669B
CN111782669B CN202010600206.3A CN202010600206A CN111782669B CN 111782669 B CN111782669 B CN 111782669B CN 202010600206 A CN202010600206 A CN 202010600206A CN 111782669 B CN111782669 B CN 111782669B
Authority
CN
China
Prior art keywords
lock
key
value
value database
read
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.)
Active
Application number
CN202010600206.3A
Other languages
English (en)
Other versions
CN111782669A (zh
Inventor
王小敏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Baidu Netcom Science and Technology Co Ltd
Original Assignee
Beijing Baidu Netcom Science and Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Baidu Netcom Science and Technology Co Ltd filed Critical Beijing Baidu Netcom Science and Technology Co Ltd
Priority to CN202010600206.3A priority Critical patent/CN111782669B/zh
Publication of CN111782669A publication Critical patent/CN111782669A/zh
Application granted granted Critical
Publication of CN111782669B publication Critical patent/CN111782669B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2308Concurrency control
    • G06F16/2336Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
    • G06F16/2343Locking methods, e.g. distributed locking or locking implementation details

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种分布式锁的实现方法、装置及电子设备,涉及分布式锁技术领域,可用于云平台或云服务。具体实现方案为:向键值数据库发送锁获取请求;在接收到键值数据库基于锁获取请求发送的第一成功信息的情况下,访问第一资源,其中,第一成功信息用于指示在键值数据库中成功设置第一资源的第一锁;向键值数据库发送针对第一锁的第一释放请求;其中,第一释放请求用于键值数据库基于第一释放请求将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,可从而提高锁释放的安全性。

Description

一种分布式锁的实现方法、装置及电子设备
技术领域
本申请涉及计算机技术的分布式锁技术领域,尤其涉及一种分布式锁的实现方法、装置及电子设备。
背景技术
分布式锁是指在分布式环境中,用于保护竞争资源正确地被各个实例读写的技术,基于键值数据库(Redis)的锁设置命令可以实现基本的分布式锁。即首先通过设置命令获取锁,成功获取锁后访问竞争资源,访问竞争资源后通过释放命令释放锁,则其他工作进程或线程可竞争该所使用或修改竞争资源。
发明内容
本公开提供一种分布式锁的实现方法、装置及电子设备。
第一方面,本申请一个实施例提供一种分布式锁的实现方法,包括:
向键值数据库发送锁获取请求;
在接收到所述键值数据库基于所述锁获取请求发送的第一成功信息的情况下,访问第一资源,其中,所述第一成功信息用于指示在所述键值数据库中成功设置所述第一资源的第一锁;
向所述键值数据库发送针对所述第一锁的第一释放请求;
其中,所述第一释放请求用于所述键值数据库基于所述第一释放请求将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁。
在本申请实施例的分布式锁的实现方法中,向键值数据库发送的针对第一锁的第一释放请求中包括第二值,在通过第一释放请求请求键值数据库释放第一锁的过程中,键值数据库需将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,从而提高锁释放的安全性。
第二方面,本申请一个实施例提供一种分布式锁的实现方法,包括:
接收锁获取请求;
响应于所述锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息,其中,所述第一成功信息用于指示在所述键值数据库中成功设置第一资源的第一锁;
在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁。
在本申请实施例的分布式锁的实现方法中,第一释放请求中包括第二值,在接收到针对第一锁的第一释放请求的情况下,需将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,从而提高锁释放的安全性。
第三方面,本申请一个实施例提供一种分布式锁的实现装置,包括:
第一发送模块,用于向键值数据库发送锁获取请求;
访问模块,用于在接收到所述键值数据库基于所述锁获取请求发送的第一成功信息的情况下,访问第一资源,其中,所述第一成功信息用于指示在所述键值数据库中成功设置所述第一资源的第一锁;
第二发送模块,用于向所述键值数据库发送针对所述第一锁的第一释放请求;
其中,所述第一释放请求用于所述键值数据库基于所述第一释放请求将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁。
第四方面,本申请一个实施例提供一种分布式锁的实现装置,包括:
第一接收模块,用于接收锁获取请求;
第一返回模块,用于响应于所述锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息,其中,所述第一成功信息用于指示在所述键值数据库中成功设置第一资源的第一锁;
释放模块,用于在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁。
第五方面,本申请一个实施例还提供一种电子设备,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行本申请各实施例提供的方法。
第六方面,本申请一个实施例还提供一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行本申请各实施例提供的方法。
附图说明
附图用于更好地理解本方案,不构成对本申请的限定。其中:
图1是本申请提供的一个实施例的分布式锁的实现方法的流程示意图之一;
图2是本申请提供的一个实施例的分布式锁的实现方法的流程示意图之二;
图3是本申请提供的一个实施例的分布式锁的实现方法的流程示意图之三;
图4是本申请提供的一个实施例的分布式锁的实现方法的流程示意图之四;
图5是本申请提供的一个实施例的分布式锁的实现方法的流程示意图之五;
图6是本申请提供的一个实施例的分布式锁的实现方法的原理图之一;
图7是本申请提供的一个实施例的读写锁的结构图;
图8是本申请提供的一个实施例的分布式锁的实现方法的原理图之二;
图9是本申请提供的一个实施例的分布式锁的实现方法的原理图之三;
图10是本申请提供的一个实施例的分布式锁的实现装置的结构图之一;
图11是本申请提供的一个实施例的分布式锁的实现装置的结构图之二;
图12是用来实现本申请实施例的分布式锁的实现方法的电子设备的框图。
具体实施方式
以下结合附图对本申请的示范性实施例做出说明,其中包括本申请实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本申请的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
如图1所示,根据本申请的实施例,本申请提供一种分布式锁的实现方法,该方法包括:
步骤S101:向键值数据库发送锁获取请求。
同步和互斥在多线程和多进程编程中是一个基本的需求,互相协作的多个进程和线程往往需要某种方式的同步和互斥。在Redis中,较常见的进程或线程的同步方式有分布式锁,分布式锁的类型可以有互斥锁以及读写锁等。互斥锁,保护了一个临界区,在这个临界区中,一次最多只能进入一个线程或进程。读写锁,也可以认为是一种共享版的互斥锁,可以多个线程或进程同时进行读,但只允许一个进程或线程进行写,即写操作必须单独进行,不可多写和边读边写。进程或线程只有在获取到某个共享资源的分布式锁的情况下,方可访问该共享资源,例如,读访问共享资源或写访问共享资源。如此,首先需要向Redis发送锁获取请求,例如,第一进程或第一线程需要访问第一资源,通过访问第一资源执行对应的任务,则第一进程或第一线程向Redis发送锁获取请求,以请求在Redis中设置第一资源的第一锁。
步骤S102:在接收到键值数据库基于锁获取请求发送的第一成功信息的情况下,访问第一资源。
其中,第一成功信息用于指示在键值数据库中成功设置第一资源的第一锁,表示第一资源的第一锁获取成功,即可访问第一资源。第一锁对应第一锁键以及第一锁键对应的第一值,可基于发送锁获取请求的访问者的身份标识生成,用于指示发送锁获取请求的访问者的身份。例如,若第一进程或第一线程向Redis发送锁获取请求,该第一值可以为基于第一进程或第一线程的身份标识生成的值。作为一个示例,对于第一进程或第一线程,有对应的访问资源的方式,例如,读方式或写方式,访问资源的方式由第一进程或第一线程本身所对应的任务决定。比如,线程A为读线程,则访问资源的方式为读方式,在Redis中,基于锁获取请求可根据访问资源的方式设置对应的第一锁,在接收到键值数据库基于锁获取请求发送的第一成功信息的情况下,拥有读第一资源的权力,即可对第一资源进行读访问。
步骤S103:向键值数据库发送针对第一锁的第一释放请求。
其中,第一释放请求用于键值数据库基于第一释放请求将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁。
锁都对应key(锁键)以及key对应的value(值),key对应要锁的资源,value用于锁的管理使用,其中,第一锁键对应要锁的第一资源。已为发送锁获取请求的访问者(例如,第一进程或第一线程)设置第一资源的第一锁,为了确保其他工作进程或工作线程能获取到第一资源的第一锁,对第一资源进行访问,在访问第一资源后,需要释放第一锁。在本实施例中,通过向键值数据库发送针对第一锁的第一释放请求,以请求键值数据库释放第一锁,键值数据库在接收到第一释放请求后,为了避免其他工作进程或线程对第一锁的释放,减少安全风险,需要将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,需要说明的是,第二值可用于指示发送第一释放请求的发送者的身份,在第一值与第二值匹配的情况下,表示发起第一锁释放请求与发起锁获取请求为同一对象,例如,为同一进程或线程,通过所释放校验,如此,即可释放第一锁。作为一个示例,第一值与第二值匹配,可以理解为第一值与第二值相同。作为一个示例,第一进程或第一线程发送上述锁获取请求,第一进程或第一线程发送第一释放请求,第一释放请求中携带第二值,为基于第一进程或第一线程的身份标识生成的值,可用于表示第一进程或第一线程的身份。
在本申请实施例的分布式锁的实现方法中,向键值数据库发送的针对第一锁的第一释放请求中包括第二值,在通过第一释放请求请求键值数据库释放第一锁的过程中,键值数据库需将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,从而提高锁释放的安全性。
在一个实施例中,该方法还包括:通过管理进程或管理线程检测到当前时间与第一锁的设置时间之间的时长与第一锁的有效时长的差值小于第一预设值,且访问第一资源未完成的情况下,向键值数据库发送锁延长请求,锁延长请求用于键值数据库基于锁延长请求延长第一锁的有效时长。
即在本实施例中,增加对锁的统一管理,即获取的第一锁需要统一注册,由单独的非工作进程(管理进程)或非工作线程(管理线程)管理,管理进程或管理线程可检测第一锁是否过期,当前时间与第一锁的设置时间之间的时长与第一锁的有效时长的差值小于第一预设值,表示第一锁即将过期,若当前时间与第一锁的设置时间之间的时长与第一锁的有效时长的差值小于第一预设值,且访问第一资源未完成,表示第一锁即将过期,但对第一资源的访问未完成,若第一锁过期,第一锁会释放,无法继续对第一资源的访问,如此,可延长第一锁的有效时长,以确保对第一资源未完成访问的情况下,可继续访问第一资源。
在一个实施例中,向键值数据库发送针对第一锁的第一释放请求之后,还包括:在通过管理进程或管理线程检测到第一锁释放失败的情况下,通过管理进程或管理线程向键值数据库发送针对第一锁的第二释放请求;其中,第二释放请求用于键值数据库基于第二释放请求释放第一锁。
即管理进程或管理线程不仅可在第一锁即将过期时请求有效时长的延长,而且可周期检查第一锁是否发生异常,例如,检测到第一锁释放失败的情况下,表示检测到对第一锁的释放发生异常(例如,由于网络抖动原因导致第一锁释放未成功),可通过管理进程或管理线程向键值数据库发送针对第一锁的第二释放请求,以请求键值数据库重新释放第一锁,避免第一锁未成功释放,只能依赖锁的过期而自动释放,导致其他工作进程或工作线程无法使用第一资源导致并发较低的情况。
如图2所示,根据本申请的实施例,本申请一种分布式锁的实现方法,该方法包括:
步骤S201:接收锁获取请求。
例如,可接收第一进程或第一线程发送的锁获取请求,第一进程或第一线程需要访问第一资源,通过访问第一资源执行对应的任务,则第一进程或第一线程向Redis发送锁获取请求,以请求在Redis中设置第一资源的第一锁。
步骤S202:响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息。
其中,第一成功信息用于指示在键值数据库中成功设置第一资源的第一锁。
接收锁获取请求后,可在键值数据库中设置第一资源的第一锁,在键值数据库中为发送获取锁请求的访问者设置第一资源的第一锁成功的情况下,向第一进程或第一线程返回第一成功信息,表示第一进程或第一线程成功获取第一锁,如此,第一进程或第一线程在获取到第一成功信息后,即可访问第一资源。
步骤S203:在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁。
第一进程或第一线程在访问资源完成后,需要释放第一锁。在本实施例中,通过向键值数据库发送针对第一锁的第一释放请求,以请求键值数据库释放第一锁,键值数据库在接收到第一释放请求后,为了避免其他工作进程或线程对第一锁的释放,减少安全风险,在接收到针对第一锁的第一释放请求的情况下,需要将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,需要说明的是,第二值可用于指示发送锁获取请求的访问者的身份,在第一值与第二值匹配的情况下,表示发起第一锁释放请求与发起锁获取请求为同一对象,例如,为同一进程或线程,通过所释放校验,如此,即可释放第一锁。作为一个示例,第一值与第二值匹配,可以理解为第一值与第二值相同。作为一个示例,第一进程或第一线程发送上述锁获取请求,第一释放请求中携带第二值,为基于第一进程或第一线程的身份标识生成的值,可用于表示第一进程或第一线程的身份。
在本申请实施例的分布式锁的实现方法中,第一释放请求中包括第二值,在接收到针对第一锁的第一释放请求的情况下,需将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,从而提高锁释放的安全性。
在一个实施例中,该方法还包括:响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,为管理进程或管理线程注册第一锁。
即在本实施例中,增加对锁的统一管理,即获取的第一锁需要统一注册,由单独的非工作进程(管理进程)或非工作线程(管理线程)管理。
例如,管理进程或管理线程可检测第一锁是否过期,当前时间与第一锁的设置时间之间的时长与第一锁的有效时长的差值小于第一预设值,表示第一锁即将过期,若当前时间与第一锁的设置时间之间的时长与第一锁的有效时长的差值小于第一预设值,且访问第一资源未完成(例如,第一进程或第一线程方位第一资源未完成),表示第一锁即将过期,但对第一资源的访问未完成,若第一锁过期,第一锁会释放,无法继续对第一资源的访问,可向键值数据库发送锁延长请求,锁延长请求用于键值数据库基于锁延长请求延长第一锁的有效时长,即可延长第一锁的有效时长,以确保对第一资源未完成访问的情况下,可继续访问第一资源。
如图3所示,在一个实施例中,响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息的步骤S202,包括:
步骤S3021:响应于锁获取请求,确定锁类型;
步骤S3022:在锁类型为互斥锁类型的情况下,在键值数据库中设置第一资源的互斥锁类型的第一锁;
步骤S3023:返回第一成功信息;
其中,释放第一锁,包括:删除第一锁键。
可以理解,锁获取请求可携带访问资源的方式,访问资源的方式与发送锁获取请求的访问者有关,例如,通过第一进程或第一线程发送锁获取请求,则锁获取请求中携带第一进程或第一线程的访问资源的方式,比如,对于读线程A,则访问资源的方式为读方式。如此,基于锁获取请求可确定锁类型,锁类型与访问资源的方式对应。
对于不同类型的锁,其设置锁的过程即获取锁的过程不同。例如,在本实施例中,若锁类型为互斥锁类型,则在键值数据库中设置第一资源的互斥锁类型的第一锁即可,第一锁的类型为互斥锁类型,在键值数据库中设置第一资源的互斥锁类型的第一锁成功的情况下,向发送锁获取请求的对象(例如,第一进程或第一线程)返回第一成功信息,此时,第一进程或第一线程获取第一锁成功,后续即可对第一资源进行与锁类型对应的访问。
即在本实施例中,需要根据锁获取请求确定锁类型,在锁类型为互斥锁类型的情况下,在键值数据库中设置第一资源的互斥锁类型的第一锁,且在释放第一锁的过程中,将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下删除第一锁键,实现第一锁的释放,如此,可提高对互斥锁类型的第一锁的释放的安全性。
如图4所示,在一个实施例中,响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息的步骤S202,包括:
步骤S4021:响应于锁获取请求,确定锁类型;
步骤S4022:在锁类型为读写锁的写锁类型的情况下,在键值数据库中设置第一互斥锁;
步骤S4023:在键值数据库中设置第一互斥锁成功的情况下,在键值数据库中设置第一资源的写锁类型的第一写锁。
其中,第一锁包括第一写锁;
步骤S4024:在键值数据库中设置第一写锁成功的情况下,释放第一互斥锁,返回第一成功信息。
对于不同类型的锁,其设置锁的过程即获取锁的过程不同。例如,在本实施例中,若锁类型为读写锁的写锁类型(也可以理解为写方式的读写锁),则首先需要获取互斥锁,即在键值数据库中设置第一资源的第一互斥锁,在键值数据库中设置第一互斥锁成功的情况下,在键值数据库中设置第一资源的写锁类型的第一写锁,在键值数据库中设置第一写锁成功的情况下,释放第一互斥锁,向发送锁获取请求的对象(例如,第一进程或第一线程)返回第一成功信息,例如,向第一进程或第一线程返回第一成功信息,此时,第一进程或第一线程获取第一锁成功,后续即可对第一资源进行写访问。
即在本实施例中,需要根据锁获取请求确定锁类型,在锁类型为读写锁的写锁类型的情况下,先在键值数据库中设置第一互斥锁,然后在键值数据库中设置第一资源的写锁类型的第一写锁,在键值数据库中设置第一写锁成功的情况下,释放第一互斥锁,且返回所述第一成功信息,在释放第一锁的过程中,将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下实现第一锁,如此,可提高对互斥锁类型的第一锁的释放的安全性。
在一个实施例中,在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一锁的第一锁键的第一值与释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,包括:
在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一写锁的第一写锁键的第一写值与第一释放请求中的第二值进行比较,在第一写值与第二值匹配的情况下,删除第一锁键。
即在本实施例中,在释放第一锁的过程中,第一写锁的第一写锁键的第一写值与第一释放请求中的第二值进行比较,在第一写值与第二值匹配的情况下,删除第一锁键,实现第一锁的释放,如此,可提高对读写锁类型的第一写锁的释放的安全性。
如图5所示,在一个实施例中,响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息的步骤S202,包括:
步骤S5021:响应于锁获取请求,确定锁类型;
步骤S5022:在锁类型为读写锁的读锁类型的情况下,在键值数据库中设置第一资源的第二互斥锁;
步骤S5023:在键值数据库中设置第二互斥锁成功的情况下,在键值数据库中设置第一资源的写锁类型的第二写锁;
步骤S5024:在键值数据库中设置第二写锁成功的情况下,若键值数据库中已记录第一资源的第一读锁的读锁键,则将读锁键的第三值增一;
其中,第一锁包括第一读锁和第二写锁;
步骤S5025:释放第二互斥锁,返回第一成功信息。
对于不同类型的锁,其设置锁的过程即获取锁的过程不同。例如,在本实施例中,若锁类型为读写锁的读锁类型(也可以理解为读方式的读写锁),则首先需要获取互斥锁,即在键值数据库中设置第一资源的第二互斥锁,在键值数据库中设置第二互斥锁成功的情况下,在键值数据库中设置第一资源的写锁类型的第二写锁,在键值数据库中设置第二写锁成功的情况下,若键值数据库中已设置第一资源的第一读锁的读锁键,则将读锁键的第三值增一,表示目前有增一后的第三值个进程或线程以读方式对第一资源访问,即同时可有多个进程或多个线程对第一资源进行访问,提高并发度。然后释放第二互斥锁,向发送锁获取请求的对象(例如,第一进程或第一线程)返回第一成功信息,例如,向第一进程或第一线程返回第一成功信息,此时,第一进程或第一线程获取第一锁成功,后续即可对第一资源进行读访问。需要说明的是,若在键值数据库中设置第二写锁成功的情况下,若键值数据库中未设置第一资源的第一读锁的读锁键,则在键值数据库中设置第一资源的第一读锁的读锁键,且将读锁键的第三值设置为1,表示目前有1个进程或线程以读方式对第一资源进行访问。
即在本实施例中,需要根据锁获取请求确定锁类型,在锁类型为读写锁的读锁类型的情况下,先在键值数据库中设置第二互斥锁,然后在键值数据库中设置第一资源的写锁类型的第二写锁,在键值数据库中设置第二写锁成功的情况下,将键值数据库中已设置的第一读锁的读锁键的第三值增一,然后释放第二互斥锁,且返回所述第一成功信息,在释放第一锁的过程中,将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下实现第一锁,如此,可提高对读写锁类型的第一读锁和第二写锁的释放的安全性。
在一个实施例中,在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一锁的第一锁键的第一值与释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,包括:
在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一读锁的读锁键的第三值与第一释放请求中的第二值进行比较,在第三值与第二值匹配的情况下,将读锁键的第三值减一;在减一后的第三值为零的情况下,删除读锁键,并释放第二写锁。
即在本实施例中,在释放第一锁的过程中,第一读锁的读锁键的第三值与第一释放请求中的第二值进行比较,在第三值与第二值匹配的情况下,将读锁键的第三值减一,若减一后的第三值为零,表示目前以读方式访问第一资源的线程或进程的数量为零,即可删除读锁键,实现第一读锁的释放,并释放第二写锁,如此,可提高对读写锁类型的第一写锁的释放的安全性。需要说明的是,在减一后的第三值不为零的情况下,则表示当前还有进程或线程以读方式访问第一资源,则维持第一读锁和第二写锁不释放,第一读锁的读锁键的第三值减少一。
下面以具体实施例对上述分布式锁的实现方法的过程加以说明。
如图6所示,锁都对应锁key以及所key对应的value;key对应要锁的资源,value用于锁的管理使用,锁的获取和锁的释放和锁的类型相关。基于Redis的互斥锁,首先,获取互斥锁,互斥锁的获取就是设置互斥锁key以及对应的value,成功,则成功获取互斥锁,释放互斥锁则是删除互斥锁key。需要说明的是,设置的互斥锁key的value为发送锁获取请求的第一进程或第一线程的身份标识生成的值,可唯一标识第一进程或第一线程的身份。即在本实施例中,增加锁的安全性,只允许获取锁的自身进程或线程释放自身获取的锁,在获取锁的阶段,由获取锁的第一进程或第一线程生成带有自身标识的随机value,该value由获取锁的进程或线程持有。在锁的释放阶段,第一线程或第一进程需要提供获取锁时生成value,Redis中该锁key对应的value与第一进程或第一线程提供的value进行比对校验,校验通过后(例如value相同)释放该锁key。另外,增加锁的统一管理,所有获取的锁都需要统一注册,由单独的非工作线程或非工作进程管理,在遇到网络抖动等异常原因,由管理进程在网络恢复后统一释放,以及在检测到锁过期时,可延长锁的有效时长等。
另外,基于Redis的读写锁方案,读写锁支持单个工作进程或者工作线程以独占的方式使用竞争资源,支持多个读线程同时使用竞争资源,该方案适用于pthread线程环境,也同样适用于brpc(开源的rpc框架,rpc即远程调用框架)环境中用到的bthread线程环境,利用互斥锁可以保证各实例间的串行执行某些任务,利用读写锁可以解决多实例读写相同资源的同步问题。
如图7所示,读写锁包括互斥锁、写锁的key和读锁的Key。互斥锁用于保护锁的自身数据,保证各个工作进程或线程正确地获取读写锁,写锁key的value中保存带有工作进程或工作线程标记的随机数,读锁key的value用于记录当前正在以读方式使用资源的工作进程或工作线程数量,每次成功获取写锁后都会自增1。在获取读写锁过程中,首先需要获取互斥锁,获取操作后释放互斥锁;获取读写锁的读锁类型的读锁时,同时持有读锁和写锁,最后一个读工作进程或工作线程释放读锁后需要删除读锁的key,并释放写锁。
如图8所示,获取读写锁的写锁类型的写锁,获取写锁的过程类似于上述获取互斥锁的过程,第一进程或第一线程在获取写锁之前需要先获取互斥锁,获取互斥锁之后,以带自身标记的随机值value在Redis中设置写锁key,设置成功后注册写锁key到锁的管理进程或管理线程统一管理,然后释放互斥锁。第一进程或第一线程使用第一资源执行对应的任务,在使用第一资源完毕后,可向Redis发送第一锁释放请求,以请求释放上述设置成功的写锁key。Redis需要将第一锁释放请求携带的value与自身存储的第一进程或第一线程的写锁key的value进行对比,若相同,则释放写锁key。而且,管理进程或管理线程统一管理可周期检测该写锁是否发生异常以及检测写锁是否过期等。
如图9所示,获取读写锁的读锁类型的读锁,读锁key的value是记录当前以读方式使用互斥资源的工作进程或工作线程数量,在获取读锁的过程中,首先需要获取互斥锁和写锁,与上述获取互斥锁和写锁的过程类似。然后使用INCR key命令自增读锁key的value,然后注册读锁key到锁的管理进程或管理线程统一管理。释放读锁的需要使用DECR key命令自减读锁对应的value,当value减到0时,需要删除写key并释放写锁。而且,管理进程或管理线程统一管理可周期检测读锁是否发生异常以及检测读锁是否过期等。
请参考图10,本申请提供一种实施例的一种分布式锁的实现装置1000,装置包括:
第一发送模块101,用于向键值数据库发送锁获取请求;
访问模块102,用于在接收到键值数据库基于锁获取请求发送的第一成功信息的情况下,访问第一资源,其中,第一成功信息用于指示在键值数据库中成功设置第一资源的第一锁;
第二发送模块103,用于向键值数据库发送针对第一锁的第一释放请求;
其中,第一释放请求用于键值数据库基于第一释放请求将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁。
在一个实施例中,装置1000还包括:
第三发送模块,用于通过管理进程或管理线程检测到当前时间与第一锁的设置时间之间的时长与第一锁的有效时长的差值小于第一预设值,且访问第一资源未完成的情况下,向键值数据库发送锁延长请求,锁延长请求用于键值数据库基于锁延长请求延长第一锁的有效时长。
在一个实施例中,装置1000还包括:
第四发送模块,用于第二发送模块向键值数据库发送针对第一锁的第一释放请求之后,在通过管理进程或管理线程检测到第一锁释放失败的情况下,通过管理进程或管理线程向键值数据库发送针对第一锁的第二释放请求;
其中,第二释放请求用于键值数据库基于第二释放请求释放第一锁。
如图11所示,在一个实施例中,本申请还提供一种分布式锁的实现装置1100,装置包括:
第一接收模块110,用于接收锁获取请求;
第一返回模块111,用于响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息,其中,第一成功信息用于指示在键值数据库中成功设置第一资源的第一锁;
释放模块112,用于在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁。
在一个实施例中,装置1100还包括:
注册模块,用于响应于锁获取请求,在键值数据库中设置第一锁成功的情况下,为管理进程或管理线程注册第一锁。
在一个实施例中,第一返回模块,包括:
第一确定模块,用于响应于锁获取请求,确定锁类型;
第一设置模块,用于在锁类型为互斥锁类型的情况下,在键值数据库中设置第一资源的互斥锁类型的第一锁;
第一返回子模块,用于返回第一成功信息;
其中,释放第一锁,包括:删除第一锁键。
在一个实施例中,第一返回模块,包括:
第二确定模块,用于响应于锁获取请求,确定锁类型;
第二设置模块,用于在锁类型为读写锁的写锁类型的情况下,在键值数据库中设置第一互斥锁;
第三设置模块,用于在键值数据库中设置第一互斥锁成功的情况下,在键值数据库中设置第一资源的写锁类型的第一写锁,其中,第一锁包括第一写锁;
第二返回子模块,用于在键值数据库中设置第一写锁成功的情况下,释放第一互斥锁,返回第一成功信息。
在一个实施例中,在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一锁的第一锁键的第一值与释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,包括:
在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一写锁的第一写锁键的第一写值与第一释放请求中的第二值进行比较,在第一写值与第二值匹配的情况下,删除第一锁键。
在一个实施例中,第一返回模块,包括:
第三确定模块,用于响应于锁获取请求,确定锁类型;
第四设置模块,用于在锁类型为读写锁的读锁类型的情况下,在键值数据库中设置第一资源的第二互斥锁;
第五设置模块,用于在键值数据库中设置第二互斥锁成功的情况下,在键值数据库中设置第一资源的写锁类型的第二写锁;
第一处理模块,用于在键值数据库中设置第二写锁成功的情况下,若键值数据库中已记录第一资源的第一读锁的读锁键,则将读锁键的第三值增一,其中,第一锁包括第二写锁和第一读锁;
第三返回子模块,用于释放第二互斥锁,返回第一成功信息。
在一个实施例中,释放模块,包括:
第二处理模块,用于在接收到针对第一锁的第一释放请求的情况下,将键值数据库中第一读锁的读锁键的第三值与第一释放请求中的第二值进行比较,在第三值与第二值匹配的情况下,将读锁键的第三值减一;
释放子模块,用于在减一后的第三值为零的情况下,删除读锁键,并释放第二写锁。
上述各实施例的分布式锁的实现装置为实现上述各实施例的分布式锁的实现方法的装置,技术特征对应,技术效果对应,在此不再赘述。
根据本申请的实施例,本申请还提供了一种电子设备和一种可读存储介质。
如图12所示,是根据本申请实施例的分布式锁的实现方法的电子设备的框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本申请的实现。
如图12所示,该电子设备包括:一个或多个处理器1201、存储器1202,以及用于连接各部件的接口,包括高速接口和低速接口。各个部件利用不同的总线互相连接,并且可以被安装在公共主板上或者根据需要以其它方式安装。处理器可以对在电子设备内执行的指令进行处理,包括存储在存储器中或者存储器上以在外部输入/输出装置(诸如,耦合至接口的显示设备)上显示GUI的图形信息的指令。在其它实施方式中,若需要,可以将多个处理器和/或多条总线与多个存储器和多个存储器一起使用。同样,可以连接多个电子设备,各个设备提供部分必要的操作(例如,作为服务器阵列、一组刀片式服务器、或者多处理器系统)。图12中以一个处理器1201为例。
存储器1202即为本申请所提供的非瞬时计算机可读存储介质。其中,所述存储器存储有可由至少一个处理器执行的指令,以使所述至少一个处理器执行本申请所提供的分布式锁的实现方法。本申请的非瞬时计算机可读存储介质存储计算机指令,该计算机指令用于使计算机执行本申请所提供的分布式锁的实现方法。
存储器1202作为一种非瞬时计算机可读存储介质,可用于存储非瞬时软件程序、非瞬时计算机可执行程序以及模块,如本申请实施例中的分布式锁的实现方法对应的程序指令/模块(例如,附图10所示的第一发送模块101、访问模块102、第二发送模块103,或者图11中的第一接收模块100、第一返回模块111、释放模块112)。处理器1201通过运行存储在存储器1202中的非瞬时软件程序、指令以及模块,从而执行服务器的各种功能应用以及数据处理,即实现上述方法实施例中的分布式锁的实现方法。
存储器1202可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储根据键盘显示的电子设备的使用所创建的数据等。此外,存储器1202可以包括高速随机存取存储器,还可以包括非瞬时存储器,例如至少一个磁盘存储器件、闪存器件、或其他非瞬时固态存储器件。在一些实施例中,存储器1202可选包括相对于处理器1201远程设置的存储器,这些远程存储器可以通过网络连接至键盘显示的电子设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
分布式锁的实现方法的电子设备还可以包括:输入装置1203和输出装置1204。处理器1201、存储器1202、输入装置1203和输出装置1204可以通过总线或者其他方式连接,图12中以通过总线连接为例。
输入装置1203可接收输入的数字或字符信息,以及产生与键盘显示的电子设备的用户设置以及功能控制有关的键信号输入,例如触摸屏、小键盘、鼠标、轨迹板、触摸板、指示杆、一个或者多个鼠标按钮、轨迹球、操纵杆等输入装置。输出装置804可以包括显示设备、辅助照明装置(例如,LED)和触觉反馈装置(例如,振动电机)等。该显示设备可以包括但不限于,液晶显示器(LCD)、发光二极管(LED)显示器和等离子体显示器。在一些实施方式中,显示设备可以是触摸屏。
此处描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、专用ASIC(专用集成电路)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
这些计算程序(也称作程序、软件、软件应用、或者代码)包括可编程处理器的机器指令,并且可以利用过程和/或面向对象的编程语言、和/或汇编/机器语言来实施这些计算程序。如本文使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
根据本申请实施例的技术方案,向键值数据库发送的针对第一锁的第一释放请求中包括第二值,在通过第一释放请求请求键值数据库释放第一锁的过程中,键值数据库需将键值数据库中第一锁的第一锁键的第一值与第一释放请求中的第二值进行比较,在第一值与第二值匹配的情况下,释放第一锁,从而提高锁释放的安全性。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发申请中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本申请公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本申请保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本申请的精神和原则之内所作的修改、等同替换和改进等,均应包含在本申请保护范围之内。

Claims (18)

1.一种分布式锁的实现方法,所述方法包括:
向键值数据库发送锁获取请求;
在接收到所述键值数据库基于所述锁获取请求发送的第一成功信息的情况下,访问第一资源,其中,所述第一成功信息用于指示在所述键值数据库中成功设置所述第一资源的第一锁,其中,所述第一成功信息为:所述键值数据库响应于所述锁获取请求,确定锁类型,在所述锁类型为读写锁的读锁类型的情况下,在所述键值数据库中设置所述第一资源的第二互斥锁,在键值数据库中设置所述第二互斥锁成功的情况下,在键值数据库中设置所述第一资源的所述写锁类型的第二写锁,在键值数据库中设置所述第二写锁成功的情况下,若键值数据库中已记录所述第一资源的第一读锁的读锁键,则将所述读锁键的第三值增一,释放所述第二互斥锁后,返回的所述第一成功信息,其中,第一锁包括所述第二写锁和所述第一读锁;
向所述键值数据库发送针对所述第一锁的第一释放请求;
其中,所述第一释放请求用于所述键值数据库基于所述第一释放请求将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁;其中,将所述键值数据库中所述第一锁的第一锁键的第一值与所述释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁,包括:将所述键值数据库中所述第一读锁的读锁键的第三值与所述第一释放请求中的第二值进行比较,在所述第三值与所述第二值匹配的情况下,将所述读锁键的第三值减一;在减一后的第三值为零的情况下,删除所述读锁键,并释放所述第二写锁。
2.根据权利要求1所述的方法,其中,所述方法还包括:
通过管理进程或管理线程检测到当前时间与所述第一锁的设置时间之间的时长与所述第一锁的有效时长的差值小于第一预设值,且访问所述第一资源未完成的情况下,向所述键值数据库发送锁延长请求,所述锁延长请求用于所述键值数据库基于所述锁延长请求延长所述第一锁的有效时长。
3.根据权利要求1所述的方法,其中,所述向所述键值数据库发送针对所述第一锁的第一释放请求之后,还包括:
在通过管理进程或管理线程检测到所述第一锁释放失败的情况下,通过所述管理进程或管理线程向键值数据库发送针对所述第一锁的第二释放请求;
其中,所述第二释放请求用于所述键值数据库基于所述第二释放请求释放所述第一锁。
4.一种分布式锁的实现方法,其中,包括:
接收锁获取请求;
响应于所述锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息,其中,所述第一成功信息用于指示在所述键值数据库中成功设置第一资源的第一锁;
在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁;
其中,所述响应于所述锁获取请求,在所述键值数据库中设置第一锁成功的情况下,返回第一成功信息,包括:
响应于所述锁获取请求,确定锁类型;
在所述锁类型为读写锁的读锁类型的情况下,在所述键值数据库中设置所述第一资源的第二互斥锁;
在键值数据库中设置所述第二互斥锁成功的情况下,在键值数据库中设置所述第一资源的所述写锁类型的第二写锁;
在键值数据库中设置所述第二写锁成功的情况下,若键值数据库中已记录所述第一资源的第一读锁的读锁键,则将所述读锁键的第三值增一,其中,第一锁包括所述第二写锁和所述第一读锁;
释放所述第二互斥锁,返回所述第一成功信息;
其中,所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁,包括:
所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一读锁的读锁键的第三值与所述第一释放请求中的第二值进行比较,在所述第三值与所述第二值匹配的情况下,将所述读锁键的第三值减一;
在减一后的第三值为零的情况下,删除所述读锁键,并释放所述第二写锁。
5.根据权利要求4所述的方法,其中,所述方法还包括:
响应于所述锁获取请求,在所述键值数据库中设置第一锁成功的情况下,为管理进程或管理线程注册所述第一锁。
6.根据权利要求4所述的方法,其中,所述响应于所述锁获取请求,在所述键值数据库中设置第一锁成功的情况下,返回第一成功信息,包括:
响应于所述锁获取请求,确定锁类型;
在所述锁类型为互斥锁类型的情况下,在所述键值数据库中设置所述第一资源的所述互斥锁类型的所述第一锁;
返回所述第一成功信息;
其中,所述释放所述第一锁,包括:删除所述第一锁键。
7.根据权利要求4所述的方法,其中,所述响应于所述锁获取请求,在所述键值数据库中设置第一锁成功的情况下,返回第一成功信息,包括:
响应于所述锁获取请求,确定锁类型;
在所述锁类型为读写锁的写锁类型的情况下,在所述键值数据库中设置第一互斥锁;
在所述键值数据库中设置所述第一互斥锁成功的情况下,在所述键值数据库中设置所述第一资源的所述写锁类型的第一写锁,其中,第一锁包括所述第一写锁;
在所述键值数据库中设置所述第一写锁成功的情况下,释放所述第一互斥锁,返回所述第一成功信息。
8.根据权利要求7所述的方法,其中,所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁,包括:
所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一写锁的第一写锁键的第一写值与所述第一释放请求中的第二值进行比较,在所述第一写值与所述第二值匹配的情况下,删除所述第一锁键。
9.一种分布式锁的实现装置,所述装置包括:
第一发送模块,用于向键值数据库发送锁获取请求;
访问模块,用于在接收到所述键值数据库基于所述锁获取请求发送的第一成功信息的情况下,访问第一资源,其中,所述第一成功信息用于指示在所述键值数据库中成功设置所述第一资源的第一锁,其中,所述第一成功信息为:所述键值数据库响应于所述锁获取请求,确定锁类型,在所述锁类型为读写锁的读锁类型的情况下,在所述键值数据库中设置所述第一资源的第二互斥锁,在键值数据库中设置所述第二互斥锁成功的情况下,在键值数据库中设置所述第一资源的所述写锁类型的第二写锁,在键值数据库中设置所述第二写锁成功的情况下,若键值数据库中已记录所述第一资源的第一读锁的读锁键,则将所述读锁键的第三值增一,释放所述第二互斥锁后,返回的所述第一成功信息,其中,第一锁包括所述第二写锁和所述第一读锁;
第二发送模块,用于向所述键值数据库发送针对所述第一锁的第一释放请求;
其中,所述第一释放请求用于所述键值数据库基于所述第一释放请求将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁;其中,将所述键值数据库中所述第一锁的第一锁键的第一值与所述释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁,包括:将所述键值数据库中所述第一读锁的读锁键的第三值与所述第一释放请求中的第二值进行比较,在所述第三值与所述第二值匹配的情况下,将所述读锁键的第三值减一;在减一后的第三值为零的情况下,删除所述读锁键,并释放所述第二写锁。
10.根据权利要求9所述的装置,其中,所述装置还包括:
第三发送模块,用于通过管理进程或管理线程检测到当前时间与所述第一锁的设置时间之间的时长与所述第一锁的有效时长的差值小于第一预设值,且访问所述第一资源未完成的情况下,向所述键值数据库发送锁延长请求,所述锁延长请求用于所述键值数据库基于所述锁延长请求延长所述第一锁的有效时长。
11.根据权利要求9所述的装置,其中,还包括:
第四发送模块,用于所述第二发送模块向所述键值数据库发送针对所述第一锁的第一释放请求之后,在通过管理进程或管理线程检测到所述第一锁释放失败的情况下,通过所述管理进程或管理线程向键值数据库发送针对所述第一锁的第二释放请求;
其中,所述第二释放请求用于所述键值数据库基于所述第二释放请求释放所述第一锁。
12.一种分布式锁的实现装置,其中,包括:
第一接收模块,用于接收锁获取请求;
第一返回模块,用于响应于所述锁获取请求,在键值数据库中设置第一锁成功的情况下,返回第一成功信息,其中,所述第一成功信息用于指示在所述键值数据库中成功设置第一资源的第一锁;
释放模块,用于在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述第一释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁;
其中,所述第一返回模块,包括:
第三确定模块,用于响应于所述锁获取请求,确定锁类型;
第四设置模块,用于在所述锁类型为读写锁的读锁类型的情况下,在所述键值数据库中设置所述第一资源的第二互斥锁;
第五设置模块,用于在键值数据库中设置所述第二互斥锁成功的情况下,在键值数据库中设置所述第一资源的所述写锁类型的第二写锁;
第一处理模块,用于在键值数据库中设置所述第二写锁成功的情况下,若键值数据库中已记录所述第一资源的第一读锁的读锁键,则将所述读锁键的第三值增一,其中,第一锁包括所述第二写锁和所述第一读锁;
第三返回子模块,用于释放所述第二互斥锁,返回所述第一成功信息;
其中,所述释放模块,包括:
第二处理模块,用于所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一读锁的读锁键的第三值与所述第一释放请求中的第二值进行比较,在所述第三值与所述第二值匹配的情况下,将所述读锁键的第三值减一;
释放子模块,用于在减一后的第三值为零的情况下,删除所述读锁键,并释放所述第二写锁。
13.根据权利要求12所述的装置,其中,所述装置还包括:
注册模块,用于响应于所述锁获取请求,在所述键值数据库中设置第一锁成功的情况下,为管理进程或管理线程注册所述第一锁。
14.根据权利要求12所述的装置,其中,所述第一返回模块,包括:
第一确定模块,用于响应于所述锁获取请求,确定锁类型;
第一设置模块,用于在所述锁类型为互斥锁类型的情况下,在所述键值数据库中设置所述第一资源的所述互斥锁类型的所述第一锁;
第一返回子模块,用于返回所述第一成功信息;
其中,所述释放所述第一锁,包括:删除所述第一锁键。
15.根据权利要求12所述的装置,其中,所述第一返回模块,包括:
第二确定模块,用于响应于所述锁获取请求,确定锁类型;
第二设置模块,用于在所述锁类型为读写锁的写锁类型的情况下,在所述键值数据库中设置第一互斥锁;
第三设置模块,用于在所述键值数据库中设置所述第一互斥锁成功的情况下,在所述键值数据库中设置所述第一资源的所述写锁类型的第一写锁,其中,第一锁包括所述第一写锁;
第二返回子模块,用于在所述键值数据库中设置所述第一写锁成功的情况下,释放所述第一互斥锁,返回所述第一成功信息。
16.根据权利要求15所述的装置,其中,所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一锁的第一锁键的第一值与所述释放请求中的第二值进行比较,在所述第一值与所述第二值匹配的情况下,释放所述第一锁,包括:
所述在接收到针对所述第一锁的第一释放请求的情况下,将所述键值数据库中所述第一写锁的第一写锁键的第一写值与所述第一释放请求中的第二值进行比较,在所述第一写值与所述第二值匹配的情况下,删除所述第一锁键。
17.一种电子设备,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1-8中任一所述的方法。
18.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行如权利要求1-8中任一所述的方法。
CN202010600206.3A 2020-06-28 2020-06-28 一种分布式锁的实现方法、装置及电子设备 Active CN111782669B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010600206.3A CN111782669B (zh) 2020-06-28 2020-06-28 一种分布式锁的实现方法、装置及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010600206.3A CN111782669B (zh) 2020-06-28 2020-06-28 一种分布式锁的实现方法、装置及电子设备

Publications (2)

Publication Number Publication Date
CN111782669A CN111782669A (zh) 2020-10-16
CN111782669B true CN111782669B (zh) 2023-12-12

Family

ID=72761581

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010600206.3A Active CN111782669B (zh) 2020-06-28 2020-06-28 一种分布式锁的实现方法、装置及电子设备

Country Status (1)

Country Link
CN (1) CN111782669B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113010325B (zh) * 2021-03-16 2023-07-25 北京百度网讯科技有限公司 一种读写锁的实现方法、装置及电子设备
CN113535416B (zh) * 2021-06-30 2024-02-27 北京百度网讯科技有限公司 可重入分布式锁的实现方法、装置、电子设备及存储介质
CN115114305B (zh) * 2022-04-08 2023-04-28 腾讯科技(深圳)有限公司 分布式数据库的锁管理方法、装置、设备及存储介质
CN116089100B (zh) * 2023-01-12 2023-10-20 北京万里开源软件有限公司 一种数据库中锁资源监控方法及装置
CN117472930A (zh) * 2023-12-26 2024-01-30 成都大成均图科技有限公司 一种高并发数据的存储方法、装置和设备

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE602005002062D1 (de) * 2004-02-19 2007-10-04 Sap Ag Optimierung der Sperrgranularität mittels Bereichssperren
CN106354565A (zh) * 2016-09-21 2017-01-25 努比亚技术有限公司 一种分布式锁客户端及控制方法
CN106648909A (zh) * 2016-10-13 2017-05-10 华为技术有限公司 一种磁盘锁的管理方法、装置和系统
CN108418821A (zh) * 2018-03-06 2018-08-17 北京焦点新干线信息技术有限公司 基于Redis与Kafka的线上抢购系统高并发场景处理方法及装置
CN110737681A (zh) * 2019-10-15 2020-01-31 深圳前海环融联易信息科技服务有限公司 处理请求的加锁处理方法、装置、计算机设备及存储介质
CN110990404A (zh) * 2019-11-27 2020-04-10 亚信科技(中国)有限公司 一种索引数据的处理方法、装置及电子设备
CN111258771A (zh) * 2020-01-16 2020-06-09 青木数字技术股份有限公司 一种基于Raft算法的分布式锁的实现方法及系统

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10235404B2 (en) * 2014-06-25 2019-03-19 Cohesity, Inc. Distributed key-value store
US10585874B2 (en) * 2016-04-25 2020-03-10 International Business Machines Corporation Locking concurrent commands in a database management system
US20180165327A1 (en) * 2016-12-14 2018-06-14 Google Inc. Avoiding index-navigation deadlocks in database systems

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE602005002062D1 (de) * 2004-02-19 2007-10-04 Sap Ag Optimierung der Sperrgranularität mittels Bereichssperren
CN106354565A (zh) * 2016-09-21 2017-01-25 努比亚技术有限公司 一种分布式锁客户端及控制方法
CN106648909A (zh) * 2016-10-13 2017-05-10 华为技术有限公司 一种磁盘锁的管理方法、装置和系统
CN108418821A (zh) * 2018-03-06 2018-08-17 北京焦点新干线信息技术有限公司 基于Redis与Kafka的线上抢购系统高并发场景处理方法及装置
CN110737681A (zh) * 2019-10-15 2020-01-31 深圳前海环融联易信息科技服务有限公司 处理请求的加锁处理方法、装置、计算机设备及存储介质
CN110990404A (zh) * 2019-11-27 2020-04-10 亚信科技(中国)有限公司 一种索引数据的处理方法、装置及电子设备
CN111258771A (zh) * 2020-01-16 2020-06-09 青木数字技术股份有限公司 一种基于Raft算法的分布式锁的实现方法及系统

Also Published As

Publication number Publication date
CN111782669A (zh) 2020-10-16

Similar Documents

Publication Publication Date Title
CN111782669B (zh) 一种分布式锁的实现方法、装置及电子设备
CN110806923B (zh) 一种区块链任务的并行处理方法、装置、电子设备和介质
US8640096B2 (en) Configuration of componentized software applications
US11307948B2 (en) Fault injection method and apparatus, electronic device and storage medium
US10732964B2 (en) Systems and methods for updating multi-tier cloud-based application stacks
CN111475262B (zh) 区块链中事务请求处理方法、装置、设备和介质
US7624309B2 (en) Automated client recovery and service ticketing
CN111459813B (zh) 测试处理方法及装置
US20210263912A1 (en) Method for data processing based on smart contract and device
CN112527474B (zh) 任务处理方法及装置、设备、可读介质、计算机程序产品
EP3039534B1 (en) Generating an idempotent workflow
CN112511505A (zh) 一种鉴权系统、方法、装置、设备和介质
CN106250487B (zh) 一种数据库并发控制方法及装置
KR20210040866A (ko) 파일 리소스 처리 방법, 장치, 기기, 매체 및 컴퓨터 프로그램
CN111339114B (zh) 一种数据访问方法、装置、设备及存储介质
US11537476B2 (en) Database management system backup and recovery management
CN111258957B (zh) 分布式文件系统目录更新方法、装置、设备和介质
CN114090113B (zh) 数据源处理插件动态加载的方法、装置、设备及存储介质
CN111782357B (zh) 标签控制方法及装置、电子设备和可读存储介质
US10055448B2 (en) Techniques to reduce contention windows
CN111897782B (zh) 文件控制方法、装置、设备及存储介质
US12001292B2 (en) Backup housekeeping operations between database management systems and external storage
KR20210040322A (ko) 스케줄링 방법, 장치, 기기, 기록 매체 및 컴퓨터 프로그램
CN111753330A (zh) 数据泄露主体的确定方法、装置、设备和可读存储介质
CN111913810B (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
GR01 Patent grant
GR01 Patent grant