服了,头条4面:因为一个问题问题砍了我10万薪水( 四 )


第3个特点:监听器
客户端可以对某个节点添加监听器 , 当节点信息发生变化的时候 , zookeeper会通知客户端 , 比如节点数据被修改、节点被删除等等 , 都会通知客户端;
这个特性特别牛逼:这个特别爽 , 后面的节点只需要监听他前面的一个节点 , 当前面的一个节点被删除时 , zookeeper会通知监听者 , 监听者可以判断自己创建的节点编号是不是最小的 , 如果是最小的 , 即获取锁成功 , 这个是不是比上面数据库和redis的方式好一些 , db和redis的方式需要自旋(获取失败了 , 休眠稍许 , 继续循环尝试) , 而zookeeper不需要自旋 , 锁被释放的时候 , zookeeper会通知等待者 。
5.2、代码重点理解原理 , 代码大家可以在网上找找 , 比较多 , 这里就不贴出来了 。
6、方式4:etcdetcd 和 zookeeper功能差不多 , 也可以作为高可用配置中心 , 不过etcd基于Go语言实现 , 也可以用来实现分布式锁 , 实现原理上和zookeeper差不多 , 这里就不细说了 。
7、总结【服了,头条4面:因为一个问题问题砍了我10万薪水】本文主要介绍了4种方式实现分布式锁 , 大家重点要理解每种方式的原理 。
db和redis的方式原理差不多 , 内部在获取失败的情况下 , 都需要采用自旋的方式重新尝试获取锁 , 而zookeeper采用监听的方式 。
redis和zookeeper这2种方式用的比较多 , 性能上面redis更好一些 , 并发量比较大的可以采用redis的方式 。
设计中还有一点:获取锁的时候分2步走 , 先获取jvm中的锁 , 然后再尝试获取分布式锁 。