分布式锁实现的几种方式

基于数据库实现分布式锁(表、数据库排他锁)

基于缓存(redis,memcached,tair)

基于Zookeeper实现分布式锁

关注点:

单点问题?(集群)

失效时间?(锁的释放 VS 失效)

非阻塞?(while自旋 || wacther通知)

非可重入?(记录当前获得锁的机器的主机信息和线程信息;三种方式都是)

根据不同的应用场景正确选择:

————————————————————

从理解的难易程度角度(从低到高)

数据库 > 缓存 > 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的分布式锁(源码分析):

http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html

 

最新文章

  1. JavaScript模板引擎artTemplate.js——如何引入模板引擎?
  2. NYOJ题目27水池数目
  3. ionic 的下拉刷新 与 上拉加载
  4. Java总结(二):继承——Inheritance
  5. 一次有趣的XSS漏洞挖掘分析(1)
  6. 史上最臭名昭著五大软件Bug
  7. 在网页中插入MSN,Skype,QQ的方法
  8. Javac早期(编译期)
  9. GDC2016【彩虹六号:围攻 】使丰富的“突破”成为可能的破坏系统
  10. yii2多语言设置
  11. 【CodeForces 651B】Beautiful Paintings 排序+贪心
  12. 修改主机名Ubuntu
  13. Windows 8 关闭无线后无法打开WIFI的解决办法
  14. 设计模式——工厂模式(Factory)
  15. 分析Cocos2d-x横版ACT手游源 1、登录
  16. 【转】Java 线程池
  17. Ubuntu下MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  18. U3D Time类
  19. 西邮Linux兴趣小组2014级免试挑战题 (续)
  20. Java学习之路(转)

热门文章

  1. CF 149E Martian Strings 后缀自动机
  2. sh_02_快速体验
  3. tf_upgrade_v2.exe实验
  4. 值不能为空。参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explorer)
  5. antd form表单一行多个组件并对其校验
  6. Mysql锁表问题解决过程
  7. 请简述一下 Ajax 的原理及实现步骤
  8. Powershell + HTA
  9. PDF to PNG to PDF
  10. leetcode 374. 猜数字大小(python)