转载: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