为什么80%的码农都做不了架构师?>>>   

分布式锁实现的几种方式

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

基于缓存(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

转载于:https://my.oschina.net/itommy/blog/1790534

分布式锁实现方式介绍和Zookeeper实现原理相关推荐

  1. 分布式锁用Redis坚决不用Zookeeper?

    墨墨导读:为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场景. 为什么用分布式锁? 系统 A 是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查 ...

  2. redis分布式锁的安全性及与zookeeper的对比

    上篇 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现算法也 ...

  3. 关于几种分布式锁的简单介绍

    什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁.进程锁. 1.线程锁 主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同 ...

  4. 分布式锁(基于redis和zookeeper)详解

    分布式锁(基于redis和zookeeper)详解 https://blog.csdn.net/a15835774652/article/details/81775044 为什么写这篇文章? 目前网上 ...

  5. Redis分布式锁实现方式

    分布式锁一般有三种实现方式 1. 数据库乐观锁: 2. 基于ZooKeeper的分布式锁: 3. 基于Redis的分布式锁: 三种方式的优缺点分析 1.数据库乐观锁: 优点是实现简单,只需要for u ...

  6. 三种实现分布式锁的方式

    一.为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应 ...

  7. 分布式锁系列--04关于分布式锁的选型分析02-Redlock的实现原理

    欢迎关注公众号:java4all 上一文分布式锁系列–03关于分布式锁的选型分析01中,我们看到了单节点的redis分布式锁在failover时产生了无法解决的安全问题,因此,Redis的作者anti ...

  8. 分布式锁用Redis还是Zookeeper?

    为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场景. 作者:jianfeng来源:石杉的架构笔记|2019-07-16 09:22 为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场 ...

  9. java如何保证redis设置过期时间的原子性_分布式锁用 Redis 还是 Zookeeper

    在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单. 由于系统有 ...

最新文章

  1. js如何让高度和宽度保持一致_如何实现一个下载进度条/播放进度条
  2. Flutter开发之BottomSheetDialog选择组件-5(44)
  3. OC__part11
  4. JS-for的衍生对象
  5. Win-MASM64汇编语言-通用寄存器AX/BX/CX/DX/SI/DI/BP
  6. linux服务器的又一管理利器webmin图解教程
  7. 2.Jenkins 权威指南 --- 配置Jenkins 服务器
  8. 功能三星Galaxy S2手机
  9. 2020云课堂智慧职教答案计算机,2020云课堂智慧职教答案英语,云智慧职教题库,智慧职教测试答案...
  10. 用CST进行多物理仿真,热仿真结果有误
  11. 计算机网络经过了几个阶段,计算机网络的发展经过哪几个阶段?
  12. C程序设计(第五版)谭浩强第七章课后答案
  13. 关系代数中的除法运算
  14. QQ音乐、网易云音乐、酷狗音乐歌单导入到Spotify
  15. 高仿Readhub小程序 微信小程序项目【原】
  16. m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
  17. Windows下的gotoxy 函数
  18. 表单工作流审核步骤抄送功能介绍
  19. 用Python爬取知乎上关于程序员的神回复
  20. 文本溢出隐藏显示... 鼠标移动到元素显示全部内容

热门文章

  1. 类的初始化列表_【Flutter 111】Flutter手把手教程Dart语言——类、类的的成员变量和方法、类的构造函数...
  2. OpenResty的现状、趋势、使用及学习方法
  3. zookeeper专题:使用zookeeper实现分布式锁
  4. Docker的使用、底层原理及常用软件docker下载
  5. linux fpga 开发板,香蕉派BPI-F2S ,四核Linux工业级应用的开源硬件开发板,FPGA教学套装...
  6. 从源码分析RocketMQ系列-RocketMQ消息持久化源码详解
  7. Maven使用创建项目(一)
  8. 电脑有网络计算机共享怎么用,2台电脑怎么共享文件?没有网络也能共享【详解】...
  9. html文档包包含几个基本标记,HTML中包含哪些基本的标记?
  10. Redis进阶高可用之主从复制