分布式锁设计方案

方案1:数据库的唯一

原理:当想要获得锁时,就向表中插入一条记录,释放锁时就删除这条记录。唯一索引录只被插入一次,那么就可以用这个记录是否存在来判断是否存于锁定。

存在的问题

  • 锁没有失效时间,解锁失败的话其他线程无法再获得锁。
  • 只能是非阻塞锁,插入失败直接就报错了,无法重试。
  • 不可重入,已经获得锁的进程也必须重新获取锁。

方案2:Redis 的 SETNX 指令

原理:使用 SETNX(set if not exist)指令插入一个键值对,如果 Key 已经存在,那么会返回
False,否则插入成功并返回 True。

EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了数据库唯一索引实现方式中释
放锁失败的问题。

方案3:Redis 的 RedLock 算法

原理:尝试从 N 个相互独立 Redis 实例获取锁,如果一个实例不可用,应该尽快尝试下一个。计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N/2+1)实例上获取了锁,那么就认为锁获取成功了。如果锁获取失败,会到每个实例上释放锁。

方案4:Zookeeper 的有序节点

参考:http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html

 

转载于:https://www.cnblogs.com/Spider-spiders/p/9688736.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值