最近看了基于zookeeper和redis两种分布式锁的原理以及实现方式:
下文中的锁:你可以理解为一个标识符,表达两种状态,对应值存在已经被锁,如果对应值不存在,可以竞争写入,写入成功获得锁。
相同点:
1、作为锁的标识的第三方组件都是集群:在该功能上,主要为了解决单点问题,实现高可用
2、在原理上根本上来说差异不大:通过网络争用锁,zookeeper通过唯一路径定位该锁,redis通过唯一key来定位锁。为避免死锁都采用锁过期机制
不同点:
1、redis实现会用时间戳作为value来判断锁版本,阻塞其他请求;也是通过这个时间戳来完成锁过期机制的。zookeeper通过uuid+epoch+zxid,zookeeper集群自身维护的一个序列号来标识连接客户端。每一个客户端线程可以拥有锁。过期好像是通过客户端操作,corator是的实现方式如此,zookeeper原生的代码中没有这样的方法。
2、redis就是一个基于网络高可用高并发的缓存,因此相对于zookeeper直接对比没有意义,而且zookeeper的诞生是伴随着paxos算法。因此在分布式一致性采用zookeeper的理由更加充分。