一种基于分布式锁的数据存储方法、装置和计算机设备与流程
未命名
08-13
阅读:77
评论:0
1.本技术涉及数据库结构技术领域,特别是涉及一种基于分布式锁的数据存储方法、装置和计算机设备。
背景技术:
2.在分布式的应用环境下,为保障数据的一致性和锁的唯一性,会采用redis做分布式锁,而在单机部署时,redis故障将会导致节点丢失。现有技术中一般会采用master-slave模式,加锁时只对一个节点加锁,但是即使通过sentinel做了高可用,一旦出现master节点故障还是会出现分布式锁丢失的情况,而如果不解决,则会导致当前redis主节点的数据并没有复制到从服务器,进一步地,若此时其他客户端获取到了锁,而之前拥有锁的客户端可能还在对资源进行操作,此时又会出现多客户端同时对同一资源进行访问和操作的问题。
3.基于上述问题,在相关技术中通常采用redlock算法实现分布式锁,redlock算法包括一个过期时间,即客户端在每个master节点上请求锁时,会有一个和总的锁释放时间相比小的多的过期时间,以防止一个客户端在某个宕掉的主节点上阻塞过长的时间。虽然redlock算法引入了过期时间的方式来保证系统运转的顺利,但其仍存在安全隐患,例如客户端a获取到锁后开始执行,但执行到一半系统服务被挂起,而后锁超时了,客户端b在等待到客户端a锁超时后,成功获取锁并执行入库操作,若客户端b操作完成后客户端a恢复了,客户端a又执行了一次入库操作,这样就会导致客户端b的数据丢失,从而产生安全隐患。
4.目前针对分布式锁节点故障而导致的多个客户端写入数据库的数据缺失或损坏的问题,尚未提出有效的解决方案。
技术实现要素:
5.基于此,有必要针对上述技术问题,提供一种基于分布式锁的数据存储方法、装置和计算机设备。
6.第一方面,本技术提供了一种基于分布式锁的数据存储方法。该方法包括:
7.获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,目标分布式节点为根据第一获取请求从至少一个分布式节点中选择的;
8.根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌;
9.获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求,若第二时间戳令牌等于第一时间戳令牌,基于目标分布式锁指示第一客户端将写入请求对应的待写入数据存储至目标数据库。
10.在其中一个实施例中,根据预设的时间间隔对第一客户端进行状态检测之后,方法还包括:
11.对目标分布式锁的当前过期时长进行状态检测,得到目标分布式锁的第一状态检测结果,并对第一客户端进行超时检测,得到第一客户端的第一客户端检测结果;
12.若检测到第一状态检测结果指示目标分布式锁处于未过期状态,且执行状态第一检测结果指示第一客户端正在执行写入操作,将当前过期时长延长至预设延长时长。
13.在其中一个实施例中,对第一客户端进行超时检测,得到第一客户端的第一客户端检测结果,包括:
14.向预设的分布式锁数据库中发送分布式锁获取指令;
15.若基于分布式锁获取指令从分布式锁数据库中调取到第一客户端的名称,则得到指示第一客户端正在进行写入操作的第一客户端检测结果;
16.若基于分布式锁获取指令无法从分布式锁数据库中调取到第一客户端的名称,则得到指示第一客户端已完成写入操作的第一客户端释放结果,基于第一客户端释放结果释放目标分布式锁。
17.在其中一个实施例中,获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌之前,方法还包括:
18.获取预设的时间同步协议以及预设的同步时间间隔;
19.基于所述同步时间间隔,根据所述时间同步协议对所述第一客户端、所述第二客户端以及分布式锁数据库的时间进行校验操作,并在校验通过的情况下获取所述第一获取请求。
20.在其中一个实施例中,根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,且在基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌之前,方法还包括:
21.根据时间间隔对第一客户端进行状态检测;
22.若检测到第一客户端的异常抛出信号,则释放目标分布式锁;
23.或,
24.若检测到第一客户端预设的过期时长结束,则释放目标分布式锁。
25.在其中一个实施例中,基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌之后,方法还包括:
26.对目标分布式锁的当前过期时长进行状态检测,得到目标分布式锁的第二状态检测结果,并对第二客户端进行超时检测,得到第二客户端的第二客户端检测结果;
27.若检测到第二状态检测结果指示目标分布式锁处于未过期状态,且执行状态第二检测结果指示第二客户端正在执行写入操作,将当前过期时长延长至预设延长时长。
28.第二方面,本技术还提供了一种基于分布式锁的数据存储装置。所述装置包括:
29.获取模块,用于获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于分布式节点的第一分布式锁以及第一时间戳令牌;
30.计算模块,用于根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则获取第二客户端发送的第二获取请求,基于第二获取请求向第
二客户端发送对应于分布式节点的第二分布式锁以及第二时间戳令牌;
31.比对模块,用于获取第一客户端的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,得到第二时间戳令牌大于第一时间戳令牌的比较结果,基于比较结果拒绝写入请求。
32.第三方面,本技术还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
33.获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,目标分布式节点为根据第一获取请求从至少一个分布式节点中选择的;
34.根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌;
35.获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求,若第二时间戳令牌等于第一时间戳令牌,基于目标分布式锁指示第一客户端将写入请求对应的待写入数据存储至目标数据库。
36.第四方面,本技术还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
37.获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,目标分布式节点为根据第一获取请求从至少一个分布式节点中选择的;
38.根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌;
39.获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求,若第二时间戳令牌等于第一时间戳令牌,基于目标分布式锁指示第一客户端将写入请求对应的待写入数据存储至目标数据库。
40.第五方面,本技术还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
41.获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,目标分布式节点为根据第一获取请求从至少一个分布式节点中选择的;
42.根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌;
43.获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求,若第二时间戳令牌等于第一时间戳令牌,基于目标分布式锁指示第一客户端将写入请求对
应的待写入数据存储至目标数据库。
44.上述基于时间戳的分布式锁异常管理方法和装置,根据第一客户端发送的第一获取请求返回目标分布式节点的目标分布式锁,在检测到第一客户端跑出的异常抛出信号后释放该目标分布式锁,并基于第二获取请求向第二客户端发送目标分布式锁和第二时间戳令牌。当第一客户端异常状态结束,发送对于数据库的写入指令时,比较第一时间戳令牌以及第二时间戳令牌,若第二时间戳令牌大于第一时间戳令牌则拒绝第一客户端的写入操作,若第二时间戳令牌等于第一时间戳令牌则通过上述写入请求。通过上述方法解决了现有技术中多个客户端申请向数据库写入时,由于出现某个或某些客户端的异常情况而导致的数据库数据出现丢失或损坏的问题。进一步地,通过时间戳的比对可以准确地判断当前的写入请求是否可以通过。
附图说明
45.图1为一个实施例中基于分布式锁的数据存储方法的流程示意图;
46.图2为一个实施例中基于分布式锁的数据存储方法的结构框架图;
47.图3为一个优选实施例中基于分布式锁的数据存储方法的框架图;
48.图4为一个实施例中基于分布式锁的数据存储装置的结构框图;
49.图5为一个实施例中基于分布式锁的数据存储计算机设备的内部结构图。
具体实施方式
50.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
51.在一个实施例中,如图1所示,提供了一种基于分布式锁的数据存储方法,图1为根据本技术是实力的基于分布式锁的数据存储方法的流程图,包括以下步骤:
52.步骤s110,获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,目标分布式节点为根据第一获取请求从至少一个分布式节点中选择的。
53.其中,目标分布式节点与目标分布式锁一一对应,一个目标分布式锁在一个时间段内只能被分配给一个客户端。基于第一客户端发送的第一获取请求,且该目标分布式锁未被占用时,向第一客户端返回第一分布式锁以及第一时间戳令牌,该第一时间戳令牌为获取锁的时候,该锁携带的最新时间戳令牌,第一客户端可以根据该第一分布式锁以及第一时间戳令牌完成数据的读写操作。
54.步骤s120,根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌。
55.其中,根据时间间隔对第一客户端的状态进行持续监测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,其中具体的,当第一客户端处于异常状态时是无法直接检测到的,因为造成异常的原因有很多,可能是网络、性能等等,所以只能等待获取第一客户端的异常抛出信号,并对应于该异常抛出信号释放该目标分布式锁,若第一客户端处
于异常状态但未抛出异常抛出信号,则等待第一客户端的过期时间结束,自动释放该目标分布式锁。在该目标分布式锁释放后,根据第二获取请求向第二客户端发送目标分布式锁以及对应于当前时间的第二时间戳令牌。若获取到第一时间戳令牌在前,获取到第二时间戳令牌在后,则第二时间戳令牌大于第一时间戳令牌,时间戳令牌的值随着时间的增加而增大。
56.步骤s130,获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求,若第二时间戳令牌等于第一时间戳令牌,基于目标分布式锁指示第一客户端将写入请求对应的待写入数据存储至目标数据库。
57.其中,当第一客户端在执行操作的过程中因为种种异常原因导致第一客户端不能顺利完成其执内容后,若第一客户端再次恢复试图继续进行对应操作时,在发送写入请求时则会比对第一客户端对应的第一时间戳令牌以第二时间戳令牌的大小,若第二时间戳令牌大于第一时间戳令牌,则拒绝第一客户端的读写请求,其中,第二时间戳令牌为当前最新的时间戳令牌。若第二时间戳令牌等于第一时间戳令牌,即在第一客户端从异常状态恢复前并没有别的客户端获取该目标分布式锁,则统一第一客户端继续进行读写操作。
58.通过上述步骤s110至s130可知,在向客户端发送目标分布式锁的时候附带有最新时间戳,以此可以有效地避免当第一客户端被异常挂起时,第二客户端获取到了该目标分布式锁并执行写入操作,而后第一客户端恢复继续进行入库操作而导致的第二客户端数据丢失的问题。通过本技术有效地解决了现有技术中由于客户端或分布式锁状态异常而导致的写入数据库的数据缺失或损坏的问题,并且进一步地,通过时间戳的获取和比对可以高效且准确地对当前情况进行判断,保证了快速且准确的执行进程。
59.在一个实施例中,根据预设的时间间隔对第一客户端进行状态检测之后,方法还包括:
60.对目标分布式锁的当前过期时长进行状态检测,得到目标分布式锁的第一状态检测结果,并对第一客户端进行超时检测,得到第一客户端的第一客户端检测结果;若检测到第一状态检测结果指示目标分布式锁处于未过期状态,且执行状态第一检测结果指示第一客户端正在执行写入操作,将当前过期时长延长至预设延长时长。
61.具体地,在第一客户端未抛出异常抛出信号时,对分别同时对目标分布式锁以及第一客户端的状态进行检测,若检测到目标分布式锁处于未过期状态,且第一客户端正在执行写入操作,则将当前过期时长延长至预设延长时长,或在当前过期时长后增加预设的时间,比如可以增加10s过期时长。其中具体的,在对目标分布式锁进行状态检测时,不同的语言有不同的内置方法,例如java用了spring定时器,可以做定时监测,查看key是否还存在;在对第一客户端的执行状态进行检测室,如果还在执行中,那就是处于获得锁的状态,则判断是否还持有锁,以java为例,可以用redission的内置getlock的方法,若获得了对应于第一客户端的id和剩余次数,次数不为0时则代表第一客户端仍旧持有锁,若剩余次数为0时,则代表第一客户端未持有锁,则对该目标分布式锁进行释放。通过该方法可以保证客户端在非异常发生的情况下执行完成对应的操作,且如果发生异常,也可以及时捕捉到异常抛出信号并及时释放锁,以避免线路堵塞。
62.在一个实施例中,对第一客户端进行超时检测,得到第一客户端的第一客户端检
测结果,包括:
63.向预设的分布式锁数据库中发送分布式锁获取指令;
64.若基于分布式锁获取指令从分布式锁数据库中调取到第一客户端的名称,则得到指示第一客户端正在进行写入操作的第一客户端检测结果;
65.若基于分布式锁获取指令无法从分布式锁数据库中调取到第一客户端的名称,则得到指示第一客户端已完成写入操作的第一客户端释放结果,基于第一客户端释放结果释放目标分布式锁。
66.具体地,在客户端需要加锁时,例如锁名为onelock,会发送一串lua脚本到redis,默认携带两个参数,一个是存活时间,一个是该用户对应的客户端id,然后redis把这两个参数和锁名保存下来,通过类似于getlock的指令去调取该锁,若返回上述客户端id和存活时间(存活时间不为0),则代表该目标分布式锁被该客户端占用,若存活时间为0,则释放该锁,从redis删除这个key,此时该目标分布式锁可以提供给其他请求的客户端。对于客户端是否持有锁的判断,也可以为redis自带的hset去加锁,然后使用循环,去不停地用hset获取分布式锁数据库中的锁的内容,判断是否携带自身客户端id以及锁的次数是否为0,当客户端对锁使用完毕后,使用del key去删除锁。对于客户端是否持有锁的判断包括但不限于上述两个方法,在对分布式锁的状态进行检测时也要对客户端的状态进行检测,这样可以准确地完成对于该目标分布式锁是否可以分配给其他客户端的判断,在避免了误判的基础上保证了锁分配的效率,避免了线程的堵塞。
67.在一个实施例中,获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌之前,方法还包括:
68.获取预设的时间同步协议以及预设的同步时间间隔;
69.基于同步时间间隔,根据时间同步协议对第一客户端、第二客户端以及分布式锁数据库的时间进行校验操作。
70.具体地,获取预设的时间同步协议,该时间同步协议可以为ntp(network time protocol),使计算机时间同步化的一种协议,以ntp系统为准,校正多个客户端、分布式锁数据库的时间。由此可以看出,由于本技术中应用时间戳来保证客户端对于数据的读写操作可以正常执行,因此对时间戳的准确性要求很高,本技术引入了时间同步协议,通过定时监测多个客户端、分布式锁数据库的时间是否准确,ntp的引入可以进一步保证客户端数据读写的安全性。
71.在一个实施例中,根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,且在基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌之前,方法还包括:
72.根据时间间隔对第一客户端进行状态检测;
73.若检测到第一客户端的异常抛出信号,则释放目标分布式锁;
74.或,
75.若检测到第一客户端预设的过期时长结束,则释放目标分布式锁。
76.具体地,在获取到第一客户端的异常抛出信号后,释放目标分布式锁,若未检测到异常抛出信号但第一客户端预设的过期时长结束了,也释放目标分布式锁。由于无法直接
检测到客户端是否处于异常状态,因此若客户端异常,只能等待客户端抛出异常信号后finally里释放锁,或者等待过期时长结束。
77.在一个实施例中,本技术提供了一种两个客户端以及分布式数据库,即redis的结构框架图,如图2所示,基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌之后,方法还包括:
78.对目标分布式锁的当前过期时长进行状态检测,得到目标分布式锁的第二状态检测结果,并对第二客户端进行超时检测,得到第二客户端的第二客户端检测结果;
79.若检测到第二状态检测结果指示目标分布式锁处于未过期状态,且执行状态第二检测结果指示第二客户端正在执行写入操作,将当前过期时长延长至预设延长时长。
80.具体地,为了避免一个客户端占用分布式锁时间过长,一般会在实际应用中对每个客户端占用锁的时间设置一个过期时长,当客户端占用该锁时间超过过期时长时则中止该客户端的操作进程并释放该分布式锁,当前过期时长即为检测该客户端可以占用该分布式锁的时间,在第二客户端获取到第二时间戳令牌后,根据预设的时间间隔同时对目标分布式锁的状态以及第二客户端的状态进行检测,若检测到目标分布式锁未过期,且第二客户端正在进行读写操作,则将预设的当前过期时长延长至预设的延长时长,也可在当前过期时长后增加预设的时间段,例如可以增加10s;若检测到当前分布式锁未过期,但第二客户端已经读写完毕或处于异常状态,也释放该分布式锁。通过上述方法可以及时地获取分布式锁以及客户端的状态,并基于客户端以及分布式锁的状态进行判断,是否释放分布式锁,一方面可以保证客户端正常读写时不被打断,另一方面也可以及时发现客户端的异常状态,及时释放分布式锁,方式线程堵塞。
81.本实施例还提供了一种基于分布式锁的数据存储方法的具体实施例,如图3所示,图3是一个优选实施例中生成图表方法的框架图。
82.在多个客户端获取锁的时候,当获取到第一客户端发送的获取锁的请求,在该目标分布式锁未被占用时,向第一客户端发送目标分布式锁并附带当前时间的第一时间戳令牌,第一客户端获取该目标分布式锁以及第一时间戳令牌,开始执行自己的读写操作,在执行的过程中若第一客户端系统异常被挂起,然后锁超时了或者抛出了异常抛出信号,则释放该目标分布式锁。基于预先获取到的第二客户端发送的获取锁的请求,向第二客户端发送目标分布式锁以及对应于当前时间的第二时间戳令牌,此时,第二时间戳令牌大于第一时间戳令牌,第二客户端获取该目标分布式锁以及第二时间戳令牌,开始执行自己的读写操作,在第二客户端正在执行或执行完毕后,若第一客户端苏醒,发送继续进行数据读写的请求,检测到第一客户端对应的第一时间戳令牌小于当前的时间戳令牌,则拒绝此次请求,这样就避免了线程的安全问题。进一步地,为了保证现成的效率,必须提前设置过期时间,在本技术中,每隔一个时间段就去检测一下目标分布式锁是否过期,该时间段可以为5s、10s等,若目标分布式锁未过期且当前客户端正在进行读写操作,就延长预设时间的过期时长,即可以在当前的过期时长上延长5s、10s等,进一步地,对于过期时间的延长也可以为在客户端正常执行读写操作时,每隔一段预设的时间去检查最新的过期时间,例如每隔5s去获取锁的最新时间,若小于10s,则延长5s。最后,引入ntp系统,以ntp系统为基准来定时同步客户端以及分布式锁数据库的时间。
83.通过上述方法可以有效地避免,第二客户端在第一客户端异常超时后拿到分布式
锁并进行入库操作,第二客户端完成后,第一客户端恢复了,又开始进行入库操作从而导致第二客户端数据丢失的情况。并且对客户端以及分布式锁的定时监测,可以有效地判断是释放分布式锁还是延长分布式锁的超时时间,可以在保证线程效率的同时保证客户端的读写操作顺利完成。
84.应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
85.基于同样的发明构思,本技术实施例还提供了一种用于实现上述所涉及的基于分布式锁的数据存储方法的基于分布式锁的数据存储装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个基于分布式锁的数据存储装置实施例中的具体限定可以参见上文中对于基于分布式锁的数据存储方法的限定,在此不再赘述。
86.在一个实施例中,如图4所示,提供了一种基于分布式锁的数据存储装置,包括:获取模块41、计算模块42和比对模块43,其中:
87.获取模块41,用于获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,目标分布式节点为根据第一获取请求从至少一个分布式节点中选择的;
88.计算模块42,用于根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌;
89.比对模块43,用于获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求,若第二时间戳令牌等于第一时间戳令牌,基于目标分布式锁指示第一客户端将写入请求对应的待写入数据存储至目标数据库。
90.具体地,获取模块41获取到第一客户端发送的第一获取请求,根据该第一获取请求想第一客户端返回目标分布式锁以及对应当前时间的第一时间戳令牌。而后计算模块42根据一定的时间间隔对第一客户端进行状态检测,若检测到第一客户端抛出了异常抛出信号,则释放目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌。比对模块43在获取到第一客户端发送的写入请求后,将第一时间戳令牌与当前最新的时间戳令牌进行比较,若当前最新的时间戳令牌大于第一时间戳令牌,则拒绝第一客户端的写入请求。若当前最新的时间戳令牌等第一时间戳令牌,即在第一客户顿异常时并没有其他客户端进行读写操作,则通过第一客户端的写入请求,使其继续执行中断进程。
91.通过上述方法可以有效地避免,第二客户端在第一客户端异常超时后拿到分布式锁并进行入库操作,而其中一个客户端异常时造成的数据丢失或损坏的情况。可以有效地
保证当前线路的畅通,面对突发的客户端异常时有良好的应对能力。
92.上述基于分布式锁的数据存储装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
93.在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图5所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过wifi、移动蜂窝网络、nfc(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种接口信息同步方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
94.本领域技术人员可以理解,图5中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的分段式数据统计设备的限定,具体的分段式数据统计设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
95.本领域的技术人员应该明白,以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
96.以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术专利的保护范围应以所附权利要求为准。
技术特征:
1.一种基于分布式锁的数据存储方法,其特征在于,所述方法包括:获取第一客户端发送的第一获取请求,基于所述第一获取请求向所述第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,所述目标分布式节点为根据所述第一获取请求从至少一个分布式节点中选择的;根据预设的时间间隔对所述第一客户端进行状态检测,若检测到所述第一客户端的异常抛出信号,则释放所述目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向所述第二客户端发送所述目标分布式锁以及第二时间戳令牌;获取所述第一客户端针对所述目标分布式节点上的目标数据库的写入请求,将所述第一时间戳令牌与所述第二时间戳令牌进行比较,若所述第二时间戳令牌大于所述第一时间戳令牌拒绝所述写入请求,若所述第二时间戳令牌等于所述第一时间戳令牌,基于所述目标分布式锁指示所述第一客户端将所述写入请求对应的待写入数据存储至所述目标数据库。2.根据权利要求1所述的方法,其特征在于,所述根据预设的时间间隔对所述第一客户端进行状态检测之后,所述方法还包括:对所述目标分布式锁的当前过期时长进行状态检测,得到所述目标分布式锁的第一状态检测结果,并对所述第一客户端进行超时检测,得到第一客户端的第一客户端检测结果;若检测到所述第一状态检测结果指示所述目标分布式锁处于未过期状态,且所述第一状态检测结果指示所述第一客户端正在执行写入操作,将所述当前过期时长延长至预设延长时长。3.根据权利要求2所述的方法,其特征在于,所述对所述第一客户端进行超时检测,得到第一客户端的第一客户端检测结果,包括:向预设的分布式锁数据库中发送分布式锁获取指令;若基于所述分布式锁获取指令从所述分布式锁数据库中调取到所述第一客户端的名称,则得到指示所述第一客户端正在进行写入操作的第一客户端检测结果;若基于所述分布式锁获取指令无法从所述分布式锁数据库中调取到所述第一客户端的名称,则得到指示所述第一客户端已完成写入操作的第一客户端释放结果,基于所述第一客户端释放结果释放所述目标分布式锁。4.根据权利要求1所述的方法,其特征在于,所述获取第一客户端发送的第一获取请求,包括:获取预设的时间同步协议以及预设的同步时间间隔;基于所述同步时间间隔,根据所述时间同步协议对所述第一客户端、所述第二客户端以及分布式锁数据库的时间进行校验操作,并在校验通过的情况下获取所述第一获取请求。5.根据权利要求1所述的方法,其特征在于,所述根据预设的时间间隔对所述第一客户端进行状态检测,若检测到所述第一客户端的异常抛出信号,且在所述基于预先获取到的第二客户端发送的第二获取请求向所述第二客户端发送所述目标分布式锁以及第二时间戳令牌之前,所述方法还包括:根据所述时间间隔对所述第一客户端进行状态检测;若检测到所述第一客户端的异常抛出信号,则释放所述目标分布式锁;
或,若检测到所述第一客户端预设的过期时长结束,则释放所述目标分布式锁。6.根据权利要求1所述的方法,其特征在于,所述基于预先获取到的第二客户端发送的第二获取请求向所述第二客户端发送所述目标分布式锁以及第二时间戳令牌之后,所述方法还包括:对所述目标分布式锁的当前过期时长进行状态检测,得到所述目标分布式锁的第二状态检测结果,并对所述第二客户端进行超时检测,得到第二客户端的第二客户端检测结果;若检测到所述第二状态检测结果指示所述目标分布式锁处于未过期状态,且所述第二客户端检测结果指示所述第二客户端正在执行写入操作,将所述当前过期时长延长至预设延长时长。7.一种分布式锁异常管理的装置,其特征在于,所述装置包括:获取模块,用于获取第一客户端发送的第一获取请求,基于所述第一获取请求向所述第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌,其中,所述目标分布式节点为根据所述第一获取请求从至少一个分布式节点中选择的;计算模块,用于根据预设的时间间隔对所述第一客户端进行状态检测,若检测到所述第一客户端的异常抛出信号,则释放所述目标分布式锁,并基于预先获取到的第二客户端发送的第二获取请求向所述第二客户端发送所述目标分布式锁以及第二时间戳令牌;比对模块,用于获取所述第一客户端针对所述目标分布式节点上的目标数据库的写入请求,将所述第一时间戳令牌与所述第二时间戳令牌进行比较,若所述第二时间戳令牌大于所述第一时间戳令牌拒绝所述写入请求,若所述第二时间戳令牌等于所述第一时间戳令牌,基于所述目标分布式锁指示所述第一客户端将所述写入请求对应的待写入数据存储至所述目标数据库。8.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至6中任一项所述的方法的步骤。9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。10.一种计算机程序产品,包括计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。
技术总结
本申请涉及一种基于分布式锁的数据存储方法和装置。该方法包括:获取第一客户端发送的第一获取请求,基于第一获取请求向第一客户端发送对应于目标分布式节点的目标分布式锁以及第一时间戳令牌;根据预设的时间间隔对第一客户端进行状态检测,若检测到第一客户端的异常抛出信号,释放目标分布式锁,基于预先获取到的第二客户端发送的第二获取请求向第二客户端发送目标分布式锁以及第二时间戳令牌;获取第一客户端针对目标分布式节点上的目标数据库的写入请求,将第一时间戳令牌与第二时间戳令牌进行比较,若第二时间戳令牌大于第一时间戳令牌拒绝写入请求。采用本方法能够避免分布式锁节点故障而导致客户端写入数据库的数据丢失或损坏的问题。数据丢失或损坏的问题。数据丢失或损坏的问题。
技术研发人员:吴国庆 吴卓群
受保护的技术使用者:杭州安恒信息技术股份有限公司
技术研发日:2023.04.28
技术公布日:2023/8/9
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
