分布式锁的实现方式

7 篇文章 0 订阅
4 篇文章 0 订阅

分布式锁跟 我们 平时用 的synchronized 锁 本质是都是锁。
不同的是:synchronized是 java提供的锁。 是java进程进行多线程控制时的锁。
用 分布式锁 的原因是,多个应用是不同的进程下运行的,显然用java 提供的 锁就不行了。

说说三种分布式锁的机制。
第一种,用数据库来做。

有一个 专门的 lock table。
字段有 id mothod_Name (做唯一约束)

画个图来表示:
数据库做锁
比如三个应用进程 同时要操作 一个文件。

那么 只要设置三个进程插入的某个值 都相同,然后肯定只有一个应用进程能插入成功,成功就可以获取锁,然后去操作文件,失败的话可以重试。

释放锁的话,就将数据库的这条数据删除即可。

缺点,DB性能不好,还存在 删除数据失败的情况,如果删除数据失败,那么其他应用进程就无法获取到锁。

第二种:用zookeeper来实现

zookeeper的节点类型有四种,持久化节点,持久化有序节点,临时节点,临时有序节点。

我们可以将 订单 结算 用户三个 应用注册到 zookeeper 上当做临时节点, 然后zookeeper的临时节点又是有序的,

所以先注册的节点就能获取到锁。

画个图:

zookeeper实现分布式锁

当锁用完了以后,zookeeper会将临时节点删除,然后节点2 节点3 就会按顺序获取到锁了

第三种使用 redis 来实现

redis 有一个 setnx命令。 setnx只会字key不存在的情况下 为key设置值 。

如果key 存在的话 setnx 返回的是 0 ;
如果key 不存在的话 setnx 返回的是 1 ;

三个应用进程谁先往 redis 里设置了值 谁就获取到了 锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值