分布式锁的基本实现方式

转载:https://blog.csdn.net/zhangsanfeng2009/article/details/80970059
转载:mysql唯一约束:https://www.cnblogs.com/firstForEver/p/5105760.html,https://blog.csdn.net/fly910905/article/details/79693070
zk实现也是基于锁住方法。
zk实现:https://blog.csdn.net/liyiming2017/article/details/83786331
1.client调用create()方法创建“/root/lock_”节点,注意节点类型是EPHEMERAL_SEQUENTIAL

2.client调用getChildren("/root/lock_",watch)来获取所有已经创建的子节点,并同时在这个节点上注册子节点变更通知的Watcher

3.客户端获取到所有子节点Path后,如果发现自己在步骤1中创建的节点是所有节点中最小的,那么就认为这个客户端获得了锁

4.如果在步骤3中,发现不是最小的,那么等待,直到下次子节点变更通知的时候,在进行子节点的获取,判断是否获取到锁

5.释放锁也比较容易,就是删除自己创建的那个节点即可

还有个羊群效应,是说zk会监听目标节点下的所有子节点改动,是不必要的。可以只监听比自己小的那个,调用exist()方法来判断。

redis实现:https://www.cnblogs.com/0201zcr/p/5942748.html
这个实现基本完美,但没办法解决master获取锁还未写入salve就失效但问题(同一个key只会在一个server上)
最完美的还是redlock,在进化史里有,如果要求完美的话其实用zk比较好
redllock原理:http://cmsblogs.com/?p=3266
redis锁进化历史:https://mp.weixin.qq.com/s/y2HPj2ji2KLS_eTR5nBnDA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值