基于redis的分布式锁实现方法及系统技术方案

技术编号:33555646 阅读:14 留言:0更新日期:2022-05-26 22:52
本发明专利技术公开了一种基于redis的分布式锁实现方法及系统,属于微服务架构下java技术领域,本发明专利技术要解决的技术问题为如何将redis分布式锁处理数据的并发访问,并保证数据的最终一致性,技术方案为:该方法具体如下:获取当前时间,以毫秒为单位;按顺序向redis master节点请求加锁;客户端设置网络连接和响应超时时间,响应超时时间小于锁的失效时间;若响应超时时间超时,跳过该redis master节点,尝试下一个redis master节点;客户端使用当前时间减去开始获取锁时间,得到获取锁的使用时间:当且仅当超过一半的redis master节点均获得锁,并且获取锁的使用时间小于锁失效时间时,锁获取成功,获取锁的真正有效时间需要减去获取锁使用的时间;当锁获取失败,客户端在所有的redis master节点上解锁。master节点上解锁。master节点上解锁。

【技术实现步骤摘要】
基于redis的分布式锁实现方法及系统


[0001]本专利技术涉及微服务架构下java
,具体地说是一种基于redis的分布式锁实现方法及系统。

技术介绍

[0002]在很多场景中,为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式锁。开发应用的时候,如果需要对某一个共享变量进行并发式访问的时候,可以用分布式锁进行处理。
[0003]为了保证一个方法或属性在高并发情况下的同一时间只能被一个访问者执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就需要一种跨机器的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。
[0004]在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。大部分的解决方案是基于DB实现的,但是普通的关系型数据库在读写性能上存在瓶颈。
[0005]故如何将redis分布式锁处理数据的并发访问,并保证数据的最终一致性是目前亟待解决的技术问题。

技术实现思路

[0006]本专利技术的技术任务是提供一种基于redis的分布式锁实现方法及系统,来解决如何将redis分布式锁处理数据的并发访问,并保证数据的最终一致性的问题。
[0007]本专利技术的技术任务是按以下方式实现的,一种基于redis的分布式锁实现方法,该方法具体如下:
[0008]获取当前时间,以毫秒为单位;
[0009]按顺序向redis master节点请求加锁;
[0010]客户端设置网络连接和响应超时时间,响应超时时间小于锁的失效时间;若响应超时时间超时,跳过该redis master节点,尝试下一个redis master节点;
[0011]客户端使用当前时间减去开始获取锁时间,得到获取锁的使用时间:
[0012]当且仅当超过一半的redis master节点均获得锁,并且获取锁的使用时间小于锁失效时间时,锁获取成功;
[0013]当锁获取成功,获取锁(key)的真正有效时间需要减去获取锁使用的时间;
[0014]当锁获取失败,客户端在所有的redis master节点上解锁。
[0015]作为优选,获取锁时,使用SETNX加锁,并使用EXPIRE命令为锁添加一个超时时间,超过该超时时间,则自动释放锁;其中,锁的value值为一个随机生成的UUID,通过锁的value值在释放锁时进行判断;
[0016]其中,SETNX(SETNX key val)具体为:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0;
[0017]EXPIRE(EXPIRE key timeout)具体为:为key设置一个超时时间,单位为second,超过该超时时间锁会自动释放,避免死锁;
[0018]DELETE(DELETE key)具体为:删除key。
[0019]更优地,获取锁时,还设置一个获取的超时时间,若超过该超时时间,则放弃获取锁。
[0020]更优地,释放锁时,通过UUID判断是不是该锁,若是该锁,则执行DELETE进行锁释放。
[0021]作为优选,加锁具体如下:
[0022]通过set方法尝试加锁:
[0023]若当前锁不存在,返回加锁成功
[0024]若当前锁已经存在,则获取锁的过期时间,将获取锁的过期时间与当前时间比较:
[0025]若锁已经过期,则设置新的过期时间,返回加锁成功。
[0026]更优地,set方法具体为:
[0027]set(String key,String value,String nxxx,String expx,int time);
[0028]其中,参数key:使用key来当锁,key是唯一的;
[0029]参数value:这里传的是requestId,为了保证分布式锁的可靠性,通过给value赋值为requestId,来了解对应加锁的请求,为解锁提供依据,即就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据;requestId使用UUID.randomUUID().toString()方法生成;
[0030]参数nxxx:这个使用的是NX,意思是SET IF NOT EXIST,即当key不存在时,进行set操作;若key已经存在,则不做任何操作;
[0031]参数expx:这个参数传的是PX,意思是要为key加一个过期的设置,具体时间由参数time决定;
[0032]参数time:与参数Expx相呼应,代表key的过期时间。
[0033]作为优选,解锁具体如下:
[0034]获取锁对应的value值,检查是否与requestId相等:
[0035]若相等,则删除锁,即解锁;
[0036]若不相等,则直接结束执行。
[0037]其中,分布式锁是排他锁(Exclusive Locks),简称X锁,又称为写锁或独占锁,是一种基本的锁类型。如果事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其它任何事务都不能再对这个数据对象进行任何类型的操作——直到T1释放了排他锁。排他锁的核心是如何保证当前有且仅有一个事务获得锁,并且锁被释放后,所有正在等待获取锁的事务都能够被通知到。
[0038]分布式锁应该具备以下条件:
[0039]①
在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
[0040]②
高可用的获取锁与释放锁;
[0041]③
高性能的获取锁与释放锁;
[0042]④
具备可重入特性;
[0043]⑤
具备锁失效机制,防止死锁;
[0044]⑥
具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。
[0045]本专利技术采用Redis结合springboot作为分布式锁的实现。
[0046]一种基于redis的分布式锁实现系统,该系统包括,
[0047]获取模块,用于获取当前时间,以毫秒为单位;
[0048]请求模块,用于按顺序向redis master节点请求加锁;
[0049]设置模块,用于通过客户端设置网络连接和响应超时时间,响应超时时间小于锁的失效时间;若响应超时时间超时本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于redis的分布式锁实现方法,其特征在于,该方法具体如下:获取当前时间,以毫秒为单位;按顺序向redis master节点请求加锁;客户端设置网络连接和响应超时时间,响应超时时间小于锁的失效时间;若响应超时时间超时,跳过该redis master节点,尝试下一个redis master节点;客户端使用当前时间减去开始获取锁时间,得到获取锁的使用时间:当且仅当超过一半的redis master节点均获得锁,并且获取锁的使用时间小于锁失效时间时,锁获取成功;当锁获取成功,获取锁的真正有效时间需要减去获取锁使用的时间;当锁获取失败,客户端在所有的redis master节点上解锁。2.根据权利要求1所述的基于redis的分布式锁实现方法,其特征在于,获取锁时,使用SETNX加锁,并使用EXPIRE命令为锁添加一个超时时间,超过该超时时间,则自动释放锁;其中,锁的value值为一个随机生成的UUID,通过锁的value值在释放锁时进行判断;其中,SETNX具体为:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则返回0;EXPIRE(具体为:为key设置一个超时时间,单位为second,超过该超时时间锁会自动释放,避免死锁;DELETE具体为:删除key。3.根据权利要求1或2所述的基于redis的分布式锁实现方法,其特征在于,获取锁时,还设置一个获取的超时时间,若超过该超时时间,则放弃获取锁。4.根据权利要求3所述的基于redis的分布式锁实现方法,其特征在于,释放锁时,通过UUID判断是不是该锁,若是该锁,则执行DELETE进行锁释放。5.根据权利要求1所述的基于redis的分布式锁实现方法,其特征在于,加锁具体如下:通过set方法尝试加锁:若当前锁不存在,返回加锁成功若当前锁已经存在,则获取锁的过期时间,将获取锁的过期时间与当前时间比较:若锁已经过期,则设置新的过期时间,返回加锁成功。6.根据权利要求5所述的基于redis的分布式锁实现方法,其特征在于,set方法具体为:set(String key,String value,String nxxx,St...

【专利技术属性】
技术研发人员:刘建邦徐士强董玉全
申请(专利权)人:浪潮云信息技术股份公司
类型:发明
国别省市:

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

1