分布式锁实现的几种方式
基于数据库实现分布式锁(表、数据库排他锁)html
基于缓存(redis,memcached,tair)java
基于Zookeeper实现分布式锁redis
关注点:算法
单点问题?(集群)数据库
失效时间?(锁的释放 VS 失效)缓存
非阻塞?(while自旋 || wacther通知)分布式
非可重入?(记录当前得到锁的机器的主机信息和线程信息;三种方式都是)memcached
根据不一样的应用场景正确选择:源码分析
————————————————————性能
从理解的难易程度角度(从低到高)
数据库 > 缓存 > Zookeeper
————————————————————
从实现的复杂性角度(从低到高)
Zookeeper >= 缓存 > 数据库
————————————————————
从性能角度(从高到低)
缓存 > Zookeeper >= 数据库
————————————————————
从可靠性角度(从高到低)
Zookeeper > 缓存 > 数据库
————————————————————
ZK分布式锁的实现
ZK分布式锁以前有提过,有简单互斥锁、互斥锁、读写锁;互斥锁是在简单互斥锁的基础上进行了优化,防止羊群效应问题,直接根据事件通知下一子节点来得到锁;
调整后的分布式锁算法流程以下:(优化为“等待前一个子节点删除通知”)
1.客户端链接zookeeper,并在/lock下建立临时的且有序的子节点,第一个客户端对应的子节点为/lock/lock-0000000000,第二个为/lock/lock-0000000001,以此类推。
2.客户端获取/lock下的子节点列表,判断本身建立的子节点是否为当前子节点列表中序号最小的子节点,若是是则认为得到锁,不然监听恰好在本身以前一位的子节点删除消息,得到子节点变动通知后重复此步骤直至得到锁;
3.执行业务代码;
4.完成业务流程后,删除对应的子节点释放锁。
分布式锁的几种实现方式:http://www.hollischuang.com/archives/1716
基于Zookeeper的分布式锁(源码分析):