分布式锁的实现方式

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

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

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

画个图来表示:
分布式锁的实现方式
比如三个应用进程 同时要操作 一个文件。

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

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

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

第二种:用zookeeper来实现

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

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

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

画个图:

分布式锁的实现方式

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

第三种使用 redis 来实现

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

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

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