zookeeper的数据结构

zookeeper的观察器

  • 可设置观察器的3个方法:getData();getChildren();exists();
  • 节点数据发生变化,发送给客户端
  • 观察器只能监控一次,再监控重新设置

zookeeper分布式锁原理

  • 利用zookeeper的瞬时有序节点的特性
  • 多线程并发创建瞬时节点时,得到有序的序列
  • 序号最小的线程获得锁
  • 其他的线程则监听自己序号的前一个序号
  • 前一个线程执行完成,删除自己序号的节点
  • 下一个序号的线程得到通知,继续执行
  • 以此类推
  • 创建节点时,已经确定了线程的执行顺序


代码实现

@Slf4j
public class ZkLock implements Watcher,AutoCloseable {private ZooKeeper zooKeeper;private String businessName;private String znode;public ZkLock(String connectString,String businessName) throws IOException {this.zooKeeper = new ZooKeeper(connectString,30000,this);this.businessName = businessName;}public boolean getLock() throws KeeperException, InterruptedException {Stat existsNode = zooKeeper.exists("/" + businessName, false);if (existsNode == null){// 创建持久节点,用于区分业务zooKeeper.create("/" + businessName,businessName.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}// 创建瞬时节点znode = zooKeeper.create("/" + businessName + "/" + businessName + "_", businessName.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);// 获取瞬时节点名称znode = znode.substring(znode.lastIndexOf("/")+1);// 获取持久节点下的所有瞬时节点List<String> childrenNodes = zooKeeper.getChildren("/" + businessName, false);// 瞬时节点排序Collections.sort(childrenNodes);// 获取第一个瞬时节点String firstNode = childrenNodes.get(0);if (!firstNode.equals(znode)){String lastNode = firstNode;for (String node:childrenNodes){if (!znode.equals(node)){lastNode = node;}else {  zooKeeper.exists("/"+businessName+"/"+lastNode,true);break;}}synchronized (this){wait();}}return true;}@Overridepublic void process(WatchedEvent watchedEvent) {if (watchedEvent.getType() == Event.EventType.NodeDeleted){synchronized (this){notify();}}}@Overridepublic void close() throws Exception {zooKeeper.delete("/"+businessName+"/"+znode,-1);zooKeeper.close();log.info("我释放了锁");}
}

测试

    @RequestMapping("zkLock")public String zkLock(){log.info("我进入了方法!");try (ZkLock zkLock = new ZkLock("192.168.2.251:2181","order")){if (zkLock.getLock()) {log.info("我进入了锁!!");Thread.sleep(15000);}} catch (InterruptedException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}log.info("方法执行完成");return "方法执行完成";}

localhost:9998/zkLock

localhost:9999/zkLock

基于zookeeper的瞬时节点实现分布式锁相关推荐

  1. ZooKeeper(五) 使用Zookeeper有序临时节点实现分布式锁

    当使用zookeeper实现分布式锁时,当有新的请求需要进入需要同步加锁代码时,在zookeeper加锁代码中会在加锁的共同父节点下创建一个新的临时有需节点.创建完成后会获取加锁父节点下所有子节点.判 ...

  2. relation does not exist报错是什么意思_为什么Zookeeper天生就是一副分布式锁的胚子?...

    " 什么是分布式锁?分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作. 图片来自 Pexels 如果不同的系统或是同一个系统的不同主机之间共享了 ...

  3. ZooKeeper : Curator框架之分布式锁InterProcessReadWriteLock

    InterProcessReadWriteLock 跨JVM工作的可重入读/写互斥锁,使用Zookeeper来持有锁,所有JVM中使用相同锁路径的所有进程都将实现进程间临界区.这个互斥锁是公平的,每个 ...

  4. Zookeeper命令操作(初始Zookeeper、JavaAPI操作、分布式锁实现、模拟12306售票分布式锁、Zookeeper集群搭建、选举投票)

    Zookeeper命令操作(初始Zookeeper.JavaAPI操作.分布式锁实现.模拟12306售票分布式锁.Zookeeper集群搭建.选举投票) 1.初始Zookeeper Zookeeper ...

  5. 基于Redis(setnx)实现分布式锁

    什么是分布式锁? 分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性. 分布式锁需要具 ...

  6. zookeeper操作封装——curator使用分布式锁使用

    文章目录 1. 基本操作 1.1 建立连接 1.2 建立结点 1.3 查询结点 查询数据 查询子结点 查看结点信息 1.4 修改结点 普通修改 带乐观锁的修改 1.5 删除 删除单个结点 删除带子结点 ...

  7. 基于redis集群实现的分布式锁,可用于秒杀,定时器。

    在分布式系统中,经常会出现需要竞争同一资源的情况,使用redis可以实现分布式锁. 前提:redis集群已经整合项目,并且可以直接注入JedisCluster使用: @Autowiredprivate ...

  8. Zookeeper:基于Zookeeper的分布式锁与领导选举

    本文转发自技术世界,原文链接 http://www.jasongj.com/zookeeper/distributedlock/ 1.Zookeeper特点 1.1 Zookeeper节点类型 如上文 ...

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

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

最新文章

  1. 接收蓝牙广播onReceive中getStringExtra()出现错误
  2. 【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试
  3. 一次作死尝试:将自己的linux用rm -rf /会怎样?结果哭了。。
  4. android alarmmanager进程,Android中使用AlarmManager需注意设置进程属性
  5. go tool trace goalng调优工具
  6. CSS3技巧 —— 渐变
  7. SpringBoot集成MyBatis-Plus代码生成器
  8. java 有序容器_Java 容器集合框架概览
  9. linux arm. 快速启动,教你如何快速启动Linux 系统
  10. python单词的含义-学Python必背的初级单词,你都背了吗?
  11. mice包--R中数据缺失值的处理
  12. python身份证号查询信息
  13. 百度换肤,表单全选案例
  14. 微信小程序开发学习5(自定义组件)
  15. 介绍一个java的Excel处理工具
  16. WINDOWS 系统自定义编程 键盘
  17. 聊天窗口怎么用计算机,在电脑上用键盘快速打开聊天窗口的快速键是什么键?...
  18. 户籍管理系统的设计与实现(论文+PPT+源码)
  19. 17岁电竞少年追梦之旅,多次试训无果黯然返乡,沉淀一年,少年杨帆终圆梦~
  20. 【python】身份证号码有效性校验

热门文章

  1. 微信开放平台第三方平台授权小程序权限集id对应中文说明
  2. ESP8266+红外模块制作万能网路遥控器
  3. Word中的插入页眉 ?Word中页眉横线如何删除?
  4. idea打开后不显示界面,win+D快捷键解决问题
  5. 【新书推荐】【2011.06】唐缺:不一样的推理密谋全集(套装共7册)
  6. 简单的led驱动 了解下
  7. 激光雷达与深度相机对比——以RS-LIDAR-16和Realsense D455为例
  8. 解决Google浏览器打开页面速度太慢问题
  9. 机械CAD软件中还能这样制作材料清单BOM表?
  10. Educational Codeforces Round 119 (Rated for Div. 2) EFG 题解