分布式锁(Redis实现、Zookeeper实现)

一. Redis实现分布式锁

  1. 加锁
    虽然可以使用setnx(key,1),当一个线程执行setnx返回1,说明key原本不存在,该线程成功得到了锁;当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败。
    但这样就导致锁就没有过期时间,别的线程再也无法获得锁。
    所以可以采用set(key,1,30,NX)

  2. 解锁
    虽然可以使用del(key)来解锁,但会存在误删情况。即一个已获得锁的线程A在设定的有效时间内未执行完毕就自动释放锁,此时另外一个线程B得到了锁,在线程A执行完任务,线程B还未执行完任务的情况下,执行del(key)时,删除的是B线程的锁,过可采用Lua脚本来实现解锁。

  3. 锁超时
    对于解锁时提出的情况,可以让获得锁的线程开启一个守护线程,用expire指令来增加即将过期但还未执行完毕的线程锁的时间。

二. Zk(Zookeeper)实现分布式锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值