分布式锁跟 我们 平时用 的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 里设置了值 谁就获取到了 锁。