基于zookeeper实现高性能分布式锁
实现原理:利用zookeeper的持久性节点和Watcher机制
具体步骤:
1、创建持久性节点 zkLock
2、在此父节点下创建子节点列表,name按顺序定义
3、Java程序获取该节点下的所有顺序子节点,并且按照从小到大的顺序排列
4、取出最小的节点,如果该节点在所有顺序子节点列表中index等于0,代表成功获取到锁资源
否则将给比当前节点还小的节点注册监听事件,利用Watcher机制动态观察节点的删除事件
5、删除子节点即释放锁资源
具体细节可参考园友文章:https://blog.csdn.net/sunfeizhi/article/details/51926396
我模拟了多用户抢购下单的业务场景,从无锁到本地锁再到分布式锁做了一个分析,首先
1、无锁场景

2、本地锁场景

3、基于zookeeper建立分布式锁

模拟真实场景后,对什么时候该用锁的了解更清晰了一步,实际上非大型公司不一定要使用zookeeper来实现,只是我最近研究zookeeper底层原理时,注意到了zookeeper的主动通知特性,在建立节点时也会存储消费者的信息,对可重入机制、智能锁支持良好,这一点是eureka没有的
一般来说选择自己团队最合适的才是正确的,下一次我将使用redis来实现分布式锁,此方案综合考虑(团队技术人员整体水平)是非常适合的一种方案,虽然redis没有主动通知,但可以利用key的过期时间来实现
期间遇到的问题是对线程池底层原理掌握不充足,闹了个乌龙,在这个地方纠结了二十多分钟
我最初好奇为什么线程没有自动退出,检查代码也没有错误的地方,最后突然想起来我使用线程池来管理的线程,线程池核心概念即重用线程,所以当线程使用之后会归还给线程池,下次使用时从缓存中拿线程,这个地方我还是要好好记一记

阅读源代码请访问https://github.com/wade-zh/zkLocker
基于zookeeper实现高性能分布式锁的更多相关文章
- 基于zookeeper实现的分布式锁
基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...
- 基于Zookeeper实现多进程分布式锁
一.zookeeper简介及基本操作 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化.当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watc ...
- 基于zookeeper简单实现分布式锁
https://blog.csdn.net/desilting/article/details/41280869 这里利用zookeeper的EPHEMERAL_SEQUENTIAL类型节点及watc ...
- 基于Zookeeper实现的分布式互斥锁 - InterProcessMutex
Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介 InterProcessMutex基于Z ...
- 基于数据库、redis和zookeeper实现的分布式锁
基于数据库 基于数据库(MySQL)的方案,一般分为3类:基于表记录.乐观锁和悲观锁 基于表记录 用表主键或表字段加唯一性索引便可实现,如下: CREATE TABLE `database_lock` ...
- java使用zookeeper实现的分布式锁示例
java使用zookeeper实现的分布式锁示例 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-07我要评论 这篇文章主要介绍了java使用zookeeper实现的分布式锁示例,需要 ...
- 基于redis实现的分布式锁
基于redis实现的分布式锁 我们知道,在多线程环境中,锁是实现共享资源互斥访问的重要机制,以保证任何时刻只有一个线程在访问共享资源.锁的基本原理是:用一个状态值表示锁,对锁的占用和释放通过状态值来标 ...
- 高性能分布式锁-redisson
RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...
- 如何用Zookeeper来实现分布式锁?
什么是Zookeeper临时顺序节点? 例如 : / 动物 植物 猫 仓鼠 荷花 松树 Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Zonde.# Znode分为四种类型 ...
随机推荐
- ffmpeg超详细综合教程——摄像头直播
本文的示例将实现:读取PC摄像头视频数据并以RTMP协议发送为直播流.示例包含了1.ffmpeg的libavdevice的使用2.视频解码.编码.推流的基本流程具有较强的综合性.要使用libavdev ...
- mac book 华为C8815不能debug
最近遇到一个头疼的问题,华为c8815机器,死活不能在mac下debug,虽然最终是能够debug了,但是走了很多弯路. (1)以为是mac的系统问题,所以重装了系统.为了重装系统,备份资料,用快盘上 ...
- 【转】Jmeter分布式部署文档
很多时候,我们测试时,如果进行大数据量的并发测试时,单个电脑的CPU和内存可能无法承受,这个时候,我们需要进行一个分布式的测试,比如10000个并发,使用三台电脑来进行并发,Jmeter提供了这种功能 ...
- 分布式缓存系统 Memcached 主线程之main函数
前两节中对工作线程的工作流程做了较为详细的分析,现把其主要流程总结为下图: 接下来本节主要分析主线程相关的函数设计,主函数main的基本流程如下图所示: 对于主线程中的工作线程的初始化到启动所有的工作 ...
- 漫谈JVM之类加载机制(篇一)
前言 最近在看一本书,发现代码里用到了Thread.currentThread().getContextClassLoader(),为什么类加载器还与线程有关系呢,为什么不直接使用ClassLoade ...
- Python特殊语法:filter、map、reduce、lambda
filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决 ...
- K12协同开发在做常见问题时候遇到的问题
一.在做常见问题的时候遇到的问题 在后端处理数据的时候是通过serialize来实现的,从数据库中查出自己想要的数据,直接返回数据. 在前端发送ajax请求获取数据并且在页面上以好看的形式渲染. 1. ...
- csdn知识库
- C#统计网站访问总人数和当前在线人数 Application
一.打开vitualstudio2010,新建一个网站,然后添加新项,新建一个login.aspx和index.aspx页面.再添加新项,选择全局应用程序类,该页面为Global.asax. 第一步: ...
- BigDecimal与double
前几天,系统处理double类型的加减法,出现问题. 请看题: 示例1 问, 结果是多少? 0.01? No! 结果是0.009999999999999998! 为什么会这样呢? 因为float和do ...