CN110866021B - 一种基于Go语言的分布式锁的加锁与释放锁的方法及系统 - Google Patents
一种基于Go语言的分布式锁的加锁与释放锁的方法及系统 Download PDFInfo
- Publication number
- CN110866021B CN110866021B CN201910983238.3A CN201910983238A CN110866021B CN 110866021 B CN110866021 B CN 110866021B CN 201910983238 A CN201910983238 A CN 201910983238A CN 110866021 B CN110866021 B CN 110866021B
- Authority
- CN
- China
- Prior art keywords
- lock
- resource
- locking
- request
- area
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
- G06F16/2343—Locking methods, e.g. distributed locking or locking implementation details
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/02—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D30/00—Reducing energy consumption in communication networks
- Y02D30/50—Reducing energy consumption in communication networks in wire-line communication networks, e.g. low power modes or reduced link rate
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)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例提供一种基于Go语言的分布式锁的加锁与释放锁的方法及系统,所述加锁方法包括:接收加锁请求,在判定加锁请求的来源IP为白名单IP并且加锁请求的参数为合法的情况下,根据加锁请求,确定加锁请求对应的要锁定的资源所在的区域;对确定的区域加互斥锁;根据加锁请求,查找区域中加锁请求对应的要锁定的资源是否已存在锁;若锁已存在,则判断锁是否过期;当判定资源不存在锁或者存在锁且锁过期的情况下,为资源保存加锁请求对应的锁信息;释放区域的互斥锁并返回加锁成功消息。本技术方案通过基于Go语言的分布式锁的方案,功能职责清晰单一,出错更易定位并极大的降低了接入成本。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种基于Go语言的分布式锁的加锁与释放锁的方法及系统。
背景技术
目前互联网公司大多采用基于redis或zookeeper等第三方应用的分布式锁方案,以基于redis的方案为例,redis作为目前最为流行的nosql,其setnx命令特性为我们实现分布式锁打下了基础,redis基于io多路复用的事件机制也保证了在一定高并发场景下不会存在性能问题,在移动互联网发展日趋成熟的今天,基于redis的分布式锁方案已成为主流。
基于redis等第三方应用的分布式锁方案虽然目前仍为行业主流的解决方案,但它有三个明显的缺陷:
1.可用性难以保障:作为第三方应用,其职责并不为分布式锁而生,如redis其实是nosql数据库,其往往还担负着数据缓存,数据存储等关键职责。职责越多,越容易引发由其他职责功能过载导致的系统不可用。
2.接入成本高:所有接入使用方均需要实现分布式锁代码逻辑,分布式锁逻辑较为复杂且细节颇多,对于拥有众多技术团队且技术栈多样化的大中型互联网公司更加难以做到标准化。
3.维护成本高:如redis或zookeeper均需要专职的运维工程师进行维护,运维工程师需要考虑对其进行个性化配置,监控报警,数据备份,数据迁移,分布式部署,版本升级等工作。
发明内容
本发明实施例提供一种基于Go语言的分布式锁的加锁与释放锁的方法及系统,通过基于基于Go语言的分布式锁的方案,功能职责清晰单一,出错更易定位并极大的降低了接入成本。
为实现上述目的,一方面,本发明实施例提供了一种基于Go语言的分布式锁的加锁方法,所述方法包括:
接收通过Go语言的超文本传输协议http服务发送的加锁请求;
在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域;
对所述确定的区域加互斥锁;
根据所述加锁请求,查找所述区域中所述加锁请求对应的要锁定的资源是否已存在锁;
若锁已存在,则判断所述锁是否过期;
当判定所述资源不存在锁或者存在锁且锁过期的情况下,为所述资源保存所述加锁请求对应的锁信息以实现对所述资源的加锁;
释放所述区域的互斥锁并返回加锁成功消息。
另一方面,本发明实施例提供了一种基于Go语言的分布式锁的释放锁方法,所述方法包括:
接收释放锁请求;所述释放锁请求中包括要释放的资源的唯一标识以及本资源锁定时的临时唯一标识符;
在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域;
对所述确定的区域加互斥锁;
根据所述要释放的资源的唯一标识,查找所述区域中所述释放锁请求对应的要释放的资源是否存在锁;
若锁存在,则判断锁信息中的当下锁定资源的临时唯一标识符与所述释放锁请求中的本资源锁定时的临时唯一标识符是否一致;
当判定为一致时,释放所述锁资源;
释放所述区域的互斥锁并返回释放锁成功消息。
又一方面,本发明实施例提供了一种基于Go语言的分布式锁的加锁系统,所述系统包括:
请求接收单元,用于接收加锁请求;
区域确定单元,用于在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域;
加互斥锁单元,用于对所述确定的区域加互斥锁;
锁状态判定单元,用于根据所述加锁请求,查找所述区域中所述加锁请求对应的要锁定的资源是否已存在锁,若锁已存在,则判断所述锁是否过期;
加锁单元,用于当判定所述资源不存在锁或者存在锁且锁过期的情况下,为所述资源保存所述加锁请求对应的锁信息以实现对所述资源的加锁;
释放互斥锁单元,用于释放所述区域的互斥锁;
结果返回单元,用于返回加锁成功消息。
再一方面,本发明实施例提供了一种基于Go语言的分布式锁的释放锁系统,所述系统包括:
请求接收单元,用于接收释放锁请求;其中,所述释放锁请求中包括要释放的资源的唯一标识以及本资源锁定时的临时唯一标识符;
区域确定单元,用于在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域;
加互斥锁单元,用于对所述确定的区域加互斥锁;
锁状态判定单元,用于根据所述要释放的资源的唯一标识,查找所述区域中所述释放锁请求对应的要释放的资源是否存在锁;若锁存在,则判断锁信息中的当下锁定资源的临时唯一标识符与所述释放锁请求中的本资源锁定时的临时唯一标识符是否一致;
释放锁单元,用于当判定为一致时,释放所述锁资源;
释放互斥锁单元,用于释放所述区域的互斥锁;
结果返回单元,用于返回释放锁成功消息。
上述技术方案具有如下有益效果:
本发明技术方案相比目前主流的分布式锁方案,首先本方案为定制的分布式锁方案,而不是第三方应用的附属功能,功能职责清晰单一,出错更易定位。其次本方案极大的降低了接入成本,只需要2-3个参数并发起http请求即可,不会面临“千人千面”的尴尬境地。最后本方案也不像主流方案那样面临诸多维护难题,做好服务监控报警即能在生产环境使用。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一种基于Go语言的分布式锁的加锁方法的流程图;
图2是本发明实施例一种基于Go语言的分布式锁的释放锁方法的流程图;
图3是本发明实施例一种基于Go语言的分布式锁的加锁系统的结构示意图;
图4是本发明实施例一种基于Go语言的分布式锁的释放锁系统的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,是本发明实施例一种基于Go语言的分布式锁的加锁方法的流程图,所述方法包括:
步骤一:接收通过Go语言的超文本传输协议http服务发送的加锁请求。
所述接收通过Go语言的超文本传输协议http服务发送的加锁请求,包括:
使用Go语言Golang原生的网络包net/http包建立http服务,根据路由/lock/try接收http GET请求;
所述加锁请求包括要锁定的资源的唯一标识resource、本次锁定的时长ttl以及本次锁定资源的临时唯一标识符token。
步骤二:在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域。
其中,通过来源IP校验以校验服务调用权限,可使用ip白名单限制,如果来源ip不在白名单以内,则返回403错误,否则继续。
对于参数验证,用于基本的接收参数合法性校验,如ttl是否为整数,范围是否合法。
在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域,具体包括:
由于分布式锁的使用频率较高,我们可将锁分为128-4096个区域,具体多少可按实际系统并发量来配置,并发量越大该配置越大。根据配置好的若干区域n来初始化核心数据结构map,map为golang原生的数据结构,我们定义该map的key为0~n-1,value为每个区域的锁链表,不过我们需要在该锁链表的外层包裹一层sync.mutex,sync.mutex为golang原生的互斥锁,用于并发控制。那么我们将接收到的resource参数进行crc32操作得到m,再通过计算式k=m%n,即以m除以n的余数得到结果k,那么k就是该resource所映射到的区域号,表示本次加锁的信息我们就保存在区域号为k的链表中,其中k∈(0,n-1)。
步骤三:对所述确定的区域加互斥锁。
确定好区域号为k之后,我们就调用map[k].m.lock对该区域加互斥锁,该操作保证了只有一个线程可操作该区域,可有效规避并发操作带来的程序错误。
步骤四:根据所述加锁请求,查找所述区域中所述加锁请求对应的要锁定的资源是否已存在锁。
对区域k加锁之后,我们就可以遍历该区域的链表,根据resource查找锁是否已存在。如果锁已经存在,则进入步骤五,否则进入步骤六。
步骤五:若锁已存在,则判断所述锁是否过期。
在锁已存在的情况下,根据锁的生存时间判断锁是否已经过期,如果锁已经过期失效那么进入步骤六,否则表示该资源已被锁定,直接向用户返回失败。
步骤六:当判定所述资源不存在锁或者存在锁且锁过期的情况下,为所述资源保存所述加锁请求对应的锁信息以实现对所述资源的加锁。所述加锁请求对应的锁信息,包括:所述加锁请求中要锁定的资源的唯一标识;本次锁定的过期时间戳,通过当前时间加上本次锁定的时长确定;所述加锁请求中本次锁定资源的临时唯一标识符。
此步骤用于保存锁的resource,expire_at,token信息,resource即传入的参数resource,expire_at表示锁的过期时间戳,expire_at=当前时间+ttl,比如参数ttl传入5,那么expire_at就等于当前时间加5秒,也即5秒后过期,token即传入的参数token。
步骤七:释放所述区域的互斥锁并返回加锁成功消息。
其中,对于释放区域的互斥锁具体为:骤调用map[k].m.unlock释放该区域的互斥锁。
返回加锁成功消息具体为:锁操作区域的互斥锁释放之后,即可向用户返回成功消息,也即告诉用户对指定的resource加锁成功。
如图2所示,是本发明实施例一种基于Go语言的分布式锁的释放锁方法的流程图,所述方法包括:
步骤一:接收释放锁请求;所述释放锁请求中包括要释放的资源的唯一标识resource以及本资源锁定时的临时唯一标识符token。
此步骤中,使用golang原生的net/http包建立http服务,根据路由/lock/release接收http GET请求。
步骤二:在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域。
其中,通过来源IP校验以校验服务调用权限,可使用ip白名单限制,如果来源ip不在白名单以内,则返回403错误,否则继续。
对于参数验证,用于基本的接收参数合法性校验,如ttl是否为整数,范围是否合法。
在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域,具体包括:
由于分布式锁的使用频率较高,我们可将锁分为128-4096个区域,具体多少可按实际系统并发量来配置,并发量越大该配置越大。根据配置好的若干区域n来初始化核心数据结构map,map为golang原生的数据结构,我们定义该map的key为0~n-1,value为每个区域的锁链表,不过我们需要在该锁链表的外层包裹一层sync.mutex,sync.mutex为golang原生的互斥锁,用于并发控制。那么我们将接收到的resource参数进行crc32操作得到m,再通过计算式k=m%n,即以m除以n的余数得到结果k,那么k就是该resource所映射到的区域号,表示本次加锁的信息我们就保存在区域号为k的链表中,其中k∈(0,n-1)。
步骤三:对所述确定的区域加互斥锁。
确定好区域号为k之后,我们就调用map[k].m.lock对该区域加互斥锁,该操作保证了只有一个线程可操作该区域,可有效规避并发操作带来的程序错误。
步骤四:根据所述要释放的资源的唯一标识,查找所述区域中所述释放锁请求对应的要释放的资源是否存在锁。
对区域k加锁之后,我们就可以遍历该区域的链表,根据resource查找锁是否已存在。如果锁已经存在,则进入步骤五,否则返回错误信息。
步骤五:若锁存在,则判断锁信息中的当下锁定资源的临时唯一标识符与所述释放锁请求中的本资源锁定时的临时唯一标识符是否一致。
在锁已存在的情况下,对比锁信息中的token与传入参数token是否一致,此token的设计用于释放时对比,否则可能会释放掉其他进程获得的锁,这样锁就失去意义了,如果一致,则进入步骤六,否则返回错误信息,此步骤无需校验锁的失效时间,因为无论时间到达失效期与否,都需要释放该资源。
步骤六:当判定为一致时,释放所述锁资源。
在确定锁信息无误后,释放内存中的锁资源。
步骤七:释放所述区域的互斥锁并返回释放锁成功消息。
其中,对于释放区域的互斥锁具体为:骤调用map[k].m.unlock释放该区域的互斥锁。
返回释放锁成功消息具体为:锁操作区域的互斥锁释放之后,即可向用户返回成功消息,也即告诉用户对指定的resource释放锁完成。
对应于上述方法,如图3所示,是本发明实施例一种基于Go语言的分布式锁的加锁系统的示意图,所述系统包括:
请求接收单元11,用于接收加锁请求;所述加锁请求中包括要锁定的资源的唯一标识、本次锁定的时长以及本次锁定资源的临时唯一标识符。
区域确定单元12,用于在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域;
加互斥锁单元13,用于对所述确定的区域加互斥锁;
锁状态判定单元14,用于根据所述加锁请求,查找所述区域中所述加锁请求对应的要锁定的资源是否已存在锁,若锁已存在,则判断所述锁是否过期;
加锁单元15,用于当判定所述资源不存在锁或者存在锁且锁过期的情况下,为所述资源保存所述加锁请求对应的锁信息以实现对所述资源的加锁;
释放互斥锁单元16,用于释放所述区域的互斥锁;
结果返回单元17,用于返回加锁成功消息。
进一步地,所述区域确定单元具体用于:
对所述加锁请求中的要锁定的资源的唯一标识进行循环冗余校验crc32操作得到数据m;
通过公式k=m%n确定要锁定的资源所在的区域k,其中,n为预先配置的储存资源的区域总数,;
其中,所述预先配置的储存资源的区域为对Go语言原生的数据结构map按照区域划分进行初始化获得。
进一步地,所述加锁请求包括要锁定的资源的唯一标识、本次锁定的时长以及本次锁定资源的临时唯一标识符。
进一步地,所述加锁请求对应的锁信息,包括:所述加锁请求中要锁定的资源的唯一标识;本次锁定的过期时间戳,通过当前时间加上本次锁定的时长确定;所述加锁请求中本次锁定资源的临时唯一标识符。
如图4所示,是本发明实施例一种基于Go语言的分布式锁的释放锁系统的示意图,所述系统包括:
请求接收单元21,用于接收释放锁请求;其中,所述释放锁请求中包括要释放的资源的唯一标识以及本资源锁定时的临时唯一标识符;
区域确定单元22,用于在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域;
加互斥锁单元23,用于对所述确定的区域加互斥锁;
锁状态判定单元24,用于根据所述要释放的资源的唯一标识,查找所述区域中所述释放锁请求对应的要释放的资源是否存在锁;若锁存在,则判断锁信息中的当下锁定资源的临时唯一标识符与所述释放锁请求中的本资源锁定时的临时唯一标识符是否一致;
释放锁单元25,用于当判定为一致时,释放所述锁资源;
释放互斥锁单元26,用于释放所述区域的互斥锁;
结果返回单元27,用于返回释放锁成功消息。
进一步地,所述区域确定单元22具体用于:
对所述释放锁请求中的要释放的资源的唯一标识进行循环冗余校验crc32操作得到数据m;
通过公式k=m%n确定要释放的资源所在的区域k,其中,n为预先配置的储存资源的区域总数,k∈(0,n-1);
其中,所述预先配置的储存资源的区域为对Go语言原生的数据结构map按照区域划分进行初始化获得。
应该明白,公开的过程中的步骤的特定顺序或层次是示例性方法的实例。基于设计偏好,应该理解,过程中的步骤的特定顺序或层次可以在不脱离本公开的保护范围的情况下得到重新安排。所附的方法权利要求以示例性的顺序给出了各种步骤的要素,并且不是要限于所述的特定顺序或层次。
在上述的详细描述中,各种特征一起组合在单个的实施方案中,以简化本公开。不应该将这种公开方法解释为反映了这样的意图,即,所要求保护的主题的实施方案需要比清楚地在每个权利要求中所陈述的特征更多的特征。相反,如所附的权利要求书所反映的那样,本发明处于比所公开的单个实施方案的全部特征少的状态。因此,所附的权利要求书特此清楚地被并入详细描述中,其中每项权利要求独自作为本发明单独的优选实施方案。
为使本领域内的任何技术人员能够实现或者使用本发明,上面对所公开实施例进行了描述。对于本领域技术人员来说;这些实施例的各种修改方式都是显而易见的,并且本文定义的一般原理也可以在不脱离本公开的精神和保护范围的基础上适用于其它实施例。因此,本公开并不限于本文给出的实施例,而是与本申请公开的原理和新颖性特征的最广范围相一致。
上文的描述包括一个或多个实施例的举例。当然,为了描述上述实施例而描述部件或方法的所有可能的结合是不可能的,但是本领域普通技术人员应该认识到,各个实施例可以做进一步的组合和排列。因此,本文中描述的实施例旨在涵盖落入所附权利要求书的保护范围内的所有这样的改变、修改和变型。此外,就说明书或权利要求书中使用的术语“包含”,该词的涵盖方式类似于术语“包括”,就如同“包括,”在权利要求中用作衔接词所解释的那样。此外,使用在权利要求书的说明书中的任何一个术语“或者”是要表示“非排它性的或者”。
本领域技术人员还可以了解到本发明实施例列出的各种说明性逻辑块(illustrative logical block),单元,和步骤可以通过电子硬件、电脑软件,或两者的结合进行实现。为清楚展示硬件和软件的可替换性(interchangeability),上述的各种说明性部件(illustrative components),单元和步骤已经通用地描述了它们的功能。这样的功能是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本发明实施例保护的范围。
本发明实施例中所描述的各种说明性的逻辑块,或单元都可以通过通用处理器,数字信号处理器,专用集成电路(ASIC),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本发明实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动磁盘、CD-ROM或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中,ASIC可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。
在一个或多个示例性的设计中,本发明实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(DSL)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、DVD、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种基于Go语言的分布式锁的加锁方法,其特征在于,所述方法包括:
接收通过Go语言的超文本传输协议http服务发送的加锁请求;
在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域;
对所述确定的区域加互斥锁;
根据所述加锁请求,查找所述区域中所述加锁请求对应的要锁定的资源是否已存在锁;
若锁已存在,则判断所述锁是否过期;
当判定所述资源不存在锁或者存在锁且锁过期的情况下,为所述资源保存所述加锁请求对应的锁信息以实现对所述资源的加锁;
释放所述区域的互斥锁并返回加锁成功消息;
所述根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域,包括:
对所述加锁请求中要锁定的资源的唯一标识进行循环冗余校验crc32操作得到数据m;
通过公式k=m%n确定要锁定的资源所在的区域k,其中,n为预先配置的储存资源的区域总数,k∈(0,n-1);确定区域号为k后,调用map[k].m.lock对该区域加互斥锁;
其中,所述预先配置的储存资源的区域为对Go语言原生的数据结构map按照区域划分进行初始化获得。
2.如权利要求1所述的基于Go语言的分布式锁的加锁方法,其特征在于,
所述加锁请求包括要锁定的资源的唯一标识、本次锁定的时长以及本次锁定资源的临时唯一标识符。
3.如权利要求2所述的基于Go语言的分布式锁的加锁方法,其特征在于,所述加锁请求对应的锁信息,包括:
所述加锁请求中要锁定的资源的唯一标识;
本次锁定的过期时间戳,通过当前时间加上本次锁定的时长确定;
所述加锁请求中本次锁定资源的临时唯一标识符。
4.一种基于Go语言的分布式锁的释放锁方法,其特征在于,所述方法包括:
接收通过Go语言的超文本传输协议http服务发送的释放锁请求;所述释放锁请求中包括要释放的资源的唯一标识以及本资源锁定时的临时唯一标识符;
在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域;
对所述确定的区域加互斥锁;
根据所述要释放的资源的唯一标识,查找所述区域中所述释放锁请求对应的要释放的资源是否存在锁;
若锁存在,则判断锁信息中的当下锁定资源的临时唯一标识符与所述释放锁请求中的本资源锁定时的临时唯一标识符是否一致;
当判定为一致时,释放所述锁资源;
释放所述区域的互斥锁并返回释放锁成功消息;
所述根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域,包括:
对所述释放锁请求中的要释放的资源的唯一标识进行循环冗余校验crc32操作得到数据m;
通过公式k=m%n确定要释放的资源所在的区域k,其中,n为预先配置的储存资源的区域总数,k∈(0,n-1);
其中,所述预先配置的储存资源的区域为对Go语言原生的数据结构map按照区域划分进行初始化获得。
5.一种基于Go语言的分布式锁的加锁系统,其特征在于,所述系统包括:
请求接收单元,用于接收通过Go语言的超文本传输协议http服务发送的加锁请求;
区域确定单元,用于在判定所述加锁请求的来源IP为白名单IP并且所述加锁请求的参数为合法的情况下,根据所述加锁请求,确定所述加锁请求对应的要锁定的资源所在的区域;
加互斥锁单元,用于对所述确定的区域加互斥锁;
锁状态判定单元,用于根据所述加锁请求,查找所述区域中所述加锁请求对应的要锁定的资源是否已存在锁,若锁已存在,则判断所述锁是否过期;
加锁单元,用于当判定所述资源不存在锁或者存在锁且锁过期的情况下,为所述资源保存所述加锁请求对应的锁信息以实现对所述资源的加锁;
释放互斥锁单元,用于释放所述区域的互斥锁;
结果返回单元,用于返回加锁成功消息;
所述加锁请求包括要锁定的资源的唯一标识、本次锁定的时长以及本次锁定资源的临时唯一标识符;以及,所述区域确定单元具体用于:
对所述加锁请求中的要锁定的资源的唯一标识进行循环冗余校验crc32操作得到数据m;
通过公式k=m%n确定要锁定的资源所在的区域k,其中,n为预先配置的储存资源的区域总数,k∈(0,n-1);
其中,所述预先配置的储存资源的区域为对Go语言原生的数据结构map按照区域划分进行初始化获得。
6.一种基于Go语言的分布式锁的释放锁系统,其特征在于,所述系统包括:
请求接收单元,用于接收通过Go语言的超文本传输协议http服务发送的释放锁请求;其中,所述释放锁请求中包括要释放的资源的唯一标识以及本资源锁定时的临时唯一标识符;
区域确定单元,用于在判定所述释放锁请求的来源IP为白名单IP并且所述释放锁请求的参数为合法的情况下,根据所述要释放的资源的唯一标识,确定所述释放锁请求对应的要释放的资源所在的区域;
加互斥锁单元,用于对所述确定的区域加互斥锁;
锁状态判定单元,用于根据所述要释放的资源的唯一标识,查找所述区域中所述释放锁请求对应的要释放的资源是否存在锁;若锁存在,则判断锁信息中的当下锁定资源的临时唯一标识符与所述释放锁请求中的本资源锁定时的临时唯一标识符是否一致;
释放锁单元,用于当判定为一致时,释放所述锁资源;
释放互斥锁单元,用于释放所述区域的互斥锁;
结果返回单元,用于返回释放锁成功消息;
所述区域确定单元具体用于:
对所述释放锁请求中的要释放的资源的唯一标识进行循环冗余校验crc32操作得到数据m;
通过公式k=m%n确定要释放的资源所在的区域k,其中,n为预先配置的储存资源的区域总数,k∈(0,n-1);
其中,所述预先配置的储存资源的区域为对Go语言原生的数据结构map按照区域划分进行初始化获得。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910983238.3A CN110866021B (zh) | 2019-10-16 | 2019-10-16 | 一种基于Go语言的分布式锁的加锁与释放锁的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910983238.3A CN110866021B (zh) | 2019-10-16 | 2019-10-16 | 一种基于Go语言的分布式锁的加锁与释放锁的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110866021A CN110866021A (zh) | 2020-03-06 |
CN110866021B true CN110866021B (zh) | 2023-06-30 |
Family
ID=69652853
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910983238.3A Active CN110866021B (zh) | 2019-10-16 | 2019-10-16 | 一种基于Go语言的分布式锁的加锁与释放锁的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110866021B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113760932A (zh) * | 2021-08-24 | 2021-12-07 | 北京金山云网络技术有限公司 | 数据库表的加锁方法、装置、存储介质和电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103647820A (zh) * | 2013-12-09 | 2014-03-19 | 华为数字技术(苏州)有限公司 | 用于分布式集群系统的仲裁方法及仲裁装置 |
CN105302840A (zh) * | 2014-07-31 | 2016-02-03 | 阿里巴巴集团控股有限公司 | 一种缓存管理方法与设备 |
CN107818018A (zh) * | 2016-09-14 | 2018-03-20 | 北京京东尚科信息技术有限公司 | 分布式锁的控制方法和装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7426653B2 (en) * | 2005-04-13 | 2008-09-16 | Progress Software Corporation | Fault tolerant distributed lock management |
CN103248667B (zh) * | 2012-02-14 | 2016-03-30 | 阿里巴巴集团控股有限公司 | 一种分布式系统的资源访问方法和系统 |
CN105208124A (zh) * | 2015-09-29 | 2015-12-30 | 华为技术有限公司 | 管理锁的方法及装置、确定锁管理服务器的方法及装置 |
CN108874552B (zh) * | 2018-06-28 | 2021-09-21 | 杭州云毅网络科技有限公司 | 分布式锁执行方法、装置及系统、应用服务器和存储介质 |
CN110211617B (zh) * | 2019-05-17 | 2020-12-29 | 中国科学院计算技术研究所 | 一种哈希硬件处理装置及方法 |
-
2019
- 2019-10-16 CN CN201910983238.3A patent/CN110866021B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103647820A (zh) * | 2013-12-09 | 2014-03-19 | 华为数字技术(苏州)有限公司 | 用于分布式集群系统的仲裁方法及仲裁装置 |
CN105302840A (zh) * | 2014-07-31 | 2016-02-03 | 阿里巴巴集团控股有限公司 | 一种缓存管理方法与设备 |
CN107818018A (zh) * | 2016-09-14 | 2018-03-20 | 北京京东尚科信息技术有限公司 | 分布式锁的控制方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110866021A (zh) | 2020-03-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108173850B (zh) | 一种基于区块链智能合约的身份认证系统和身份认证方法 | |
EP1953950B1 (en) | A method for protecting network service application account, the system, and the apparatus thereof | |
RU2575987C2 (ru) | Управление данными в базе данных каталога | |
US9178865B2 (en) | Serialized authentication and authorization services | |
US20020026590A1 (en) | System for authenticating access to a network, storage medium, program and method for authenticating access to a network | |
JP2013505497A (ja) | 識別情報の検証のための方法及び装置 | |
KR20050079128A (ko) | 이동 통신 단말기의 사용제한 설정 방법 | |
WO2007101077A1 (en) | Apparatus and methods for managing time sensitive application privileges on a wireless device | |
CN113221093B (zh) | 一种基于区块链的单点登录系统、方法、设备和产品 | |
CN113595788A (zh) | 一种基于插件的api网关管理方法及装置 | |
CN110753037A (zh) | 一种令牌的管理方法、设备以及存储介质 | |
CN111355713A (zh) | 一种代理访问方法、装置、代理网关及可读存储介质 | |
CN109165486B (zh) | 一种可配置的接口访问权限控制方法 | |
CN110866021B (zh) | 一种基于Go语言的分布式锁的加锁与释放锁的方法及系统 | |
CN112434054A (zh) | 一种审计日志的更新方法及装置 | |
CN111478894B (zh) | 一种外部用户授权方法、装置、设备及可读存储介质 | |
CN114125812A (zh) | 一种数据同步方法、装置、服务器及存储介质 | |
CN112015563B (zh) | 消息队列切换方法、装置、电子设备及存储介质 | |
CN111243715A (zh) | 一种业务系统统一到集成平台的登录方法 | |
CN112597118B (zh) | 一种共享文件的添加方法及装置 | |
ES2264554T3 (es) | Metodo de control de entrega completa de un servicio, con gestion de un identificador opaco de usuario, utilizando un conjunto de servidores. | |
CN114168935A (zh) | 一种系统访问安全风控处理方法及装置 | |
CN112055849B (zh) | 排他控制系统以及排他控制方法 | |
CN113505125A (zh) | 数据上链的方法及上链代理装置 | |
CN112068899A (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 |