作者回复: 没有问题。
问题的答案:redis实现的分布式锁,都是有一个过期时间,如果一旦服务A出现stop the world的情况,有可能锁过期了,而此时服务A中仍然存在持有锁,此时另外一个服务B又获取了锁,这个时候存在两个服务同时获取锁的可能。
作者回复: 对的,这种情况也是可能发生的,前提是c节点在宕机之前没有持久化锁。
第二zk锁的问题,如果连接session已经断开,客户端的锁是会释放的,不会存在同时获取锁的情况。
作者回复: 都会设置锁对象
作者回复: 是的
作者回复: 鱼和熊掌不可兼得,保证可靠性的前提下,会带来一定的性能损失。
当在一定时间内没有获取到足够节点时,会通过定时任务将已经超时的锁通过lua脚本来释放。
作者回复: 2.6.12版本中,使用SET代替SETNX ,相当于SETNX+EXPIRE实现了原子性,不必担心SETNX成功,而EXPIRE失败的问题。
作者回复: 实现原理不一样,性能不一样
作者回复: 这是官方给出的一种连接redis集群的参考方式,具体作用已经写出了,类似一个心跳机制:
https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95#24-%E9%9B%86%E7%BE%A4%E6%A8%A1%E5%BC%8F
作者回复: 分布式锁是在分布式服务的情况下保证原子性操作,而不是因为数据库产生的分布式锁。
数据库可以实现分布式锁,是一种实现方式。
作者回复: 将以下代码提出到new Thread之外:
//zookeeper分布式锁
CuratorFramework zk = CuratorFrameworkFactory.newClient(connUrl, retryPolicy);
zk.start();
InterProcessMutex lock = new InterProcessMutex(zk, "/opt/uams/zookeeper-3.4.7/locks");
作者回复: 是的,这种情况也同样存在同时获取锁的可能
作者回复: 可以,使用Redisson就好了
作者回复: 运行了代码,并没有出现死锁问题,麻烦贴出数据库脚本
作者回复: RedLock算法是会去每一个节点获取锁,正常情况下,别的线程无法同时获取锁的。
作者回复: 写入一个单点只实现了高可用,没有实现集群式分布式锁。单点的问题会存在单个节点挂了的情况下,不同应用服务同时获取锁的可能。