工作中常用的分布式锁实现方案

1.基于redis的setnx()、expire()方法:

  a. setnx(lockkey, 1)  如果返回0,则说明设置失败,当前key已存在,
     有其他任务设置了该key;如果返回1,说明设置成功,获取了锁
  b. expire()命令对lockkey设置超时时间(setnx不能设置key的过期时间),避免死锁问题。

2.基于数据库资源表做乐观锁
通过为数据库表添加一个 “version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。
在更新过程中,会对版本号进行比较,如果是一致的,没有发生改变,则会成功执行本次操作;如果版本号不一致,则会更新失败。

   a.先执行select操作查询当前数据的数据版本号,比如当前数据版本号是4:
     select column1, version from table  where id=1 ;

   b. 执行更新操作:
       update table set version=version+1 where id=1 and version=4

   c. 如果update语句真正更新影响到了一行数据,那就说明占用资源成功。否则则说明
      这个资源已经被别人占用了,更新失败。

3.基于zookeeper实现分布式锁
当前任务需要获取锁,需要到zookeeper节点下创建一个临时顺序节点node_n,然后比较当前节点与zookeeper中所有子节点顺序大小,如果自己是最小的,那么表示就获取到锁,否则监听比自己次小的节点node_n-1的删除事件,当次节点删除之后(获取锁的线程执行完任务后,删除节点),再次判断当前节点是不是最小的节点,直到是最小的节点,则表示获取了锁。

这里就不贴代码了。看一张图:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值