热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

7,javaAPI使用

1,使用idea创建maven项目:双击打开idea-createnewProject-maven-next-填写GAV(G:com.itcast;

1 ,使用 idea 创建 maven 项目 :

双击打开 idea - create new Project - maven - next
- 填写 GAV ( G:com.itcast ; A:zkTest ;) - next - finish

2 ,引入 maven 依赖 :


<project xmlns&#61;"http://maven.apache.org/POM/4.0.0"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0modelVersion><groupId>com.itcastgroupId><artifactId>zkTestartifactId><version>1.0-SNAPSHOTversion><repositories><repository><id>clouderaid><url>https://repository.cloudera.com/artifactory/cloudera-repos/url>repository>repositories><dependencies><dependency><groupId>org.apache.zookeepergroupId><artifactId>zookeeperartifactId><version>3.4.5-cdh5.14.0version>dependency><dependency><groupId>junitgroupId><artifactId>junitartifactId><version>4.11version>dependency>dependencies>
project>

3 &#xff0c;建类 &#xff1a;Day01

     右键 java - new - 输入 com.heima.zkTest.Day01 - OK
在这里插入图片描述

4 &#xff0c;看到 Day01 这个类 &#xff1a;

在这里插入图片描述

5 &#xff0c;查 – 子节点 &#xff1a; ls /

&#64;Test // ls /
public void ls() throws IOException, KeeperException, InterruptedException {// String,int,Watcher// 集群地址&#xff0c;超时等待时间(过了这么久还连接不上的话&#xff0c;就不等了)&#xff0c;观察者。ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);List<String> list &#61; zk.getChildren("/", null);for (String s : list) {System.out.println(s);}zk.close();
}

6 &#xff0c;查 – 数据 &#xff1a; get /xyj

&#64;Test // get /xyj
public void getXyj() throws IOException, InterruptedException, KeeperException {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);byte[] data &#61; zk.getData("/xyj", null, null);String str &#61; new String(data);System.out.println(str);zk.close();
}

7 &#xff0c;查 – 元数据信息 &#xff1a;

&#64;Test // stat
public void getStat() throws IOException, InterruptedException, KeeperException {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);Stat stat &#61; new Stat();zk.getData("/xyj", null, stat);System.out.println("数据版本号&#xff1a;" &#43; stat.getVersion());System.out.println("节点创建时候的事务 id &#xff1a;" &#43;stat.getCversion());System.out.println("数据长度&#xff1a;" &#43; stat.getDataLength());zk.close();
}

8 &#xff0c;增 &#xff1a; create /a tom

&#64;Test // create /a tom
public void create() throws InterruptedException, IOException, KeeperException {// 连接ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);// 创建节点if(zk.exists("/a",null)&#61;&#61;null){// 路径&#xff0c;数据(转码成为字节)&#xff0c;节点权限( 我们用开放权限 )&#xff0c;保存方式( 我们选永久保存 )String msg&#61;zk.create("/a","tom".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println("创建成功&#xff1a;"&#43;msg);}else{System.out.println("节点已经存在&#xff0c;不要重复创建...");}zk.close();
}

9 &#xff0c;改 &#xff1a; set /a jerry

&#64;Test // set /a jerry
public void setA() throws IOException, InterruptedException, KeeperException {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);zk.setData("/a","jerry".getBytes(),-1);zk.close();
}

10&#xff0c;删 – 单节点&#xff1a; delete /a

&#64;Test // delete /a
public void delete() throws IOException, KeeperException, InterruptedException {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);// 节点&#xff0c;版本号( -1 代表最新版本号 )zk.delete("/a",-1);zk.close();
}

11&#xff0c;删 – 目录 &#xff1a;

     javaAPI 不提供删除目录的操作

12&#xff0c;理论 1 – 版本号 &#xff1a; 元数据中的版本号


  1. 修改和删除都需要用到版本号。
  2. 数据的初始版本号是 0
  3. 每次修改数据&#xff0c;版本号就会 &#43;1
  4. 当使用 javaAPI 修改&#xff0c;或这删除数据的时候&#xff0c;需要写版本号&#xff0c;如果写不对版本号&#xff0c;就无法操作数据。
  5. -1 代表最新版本号&#xff0c;我也不管你现在是什么版本&#xff0c;我就操作你这个数据的最新版本。
  6. 版本号的用途 &#xff1a;并发修改。

13&#xff0c;高级操作 &#xff1a;并发修改 ( 重点 )


  1. 先查出来版本号&#xff0c;然后再修改

public static void main(String[] args) throws Exception {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);Stat stat &#61; new Stat();zk.getData("/a",null,stat);int version &#61; stat.getVersion();zk.setData("/a","aa".getBytes(),version);zk.close();
}

  1. 修改 12 次&#xff0c;依次修改 &#xff1a;

public static void main(String[] args) throws Exception {for (int i &#61; 1; i <&#61;12 ; i&#43;&#43;) {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);Stat stat &#61; new Stat();zk.getData("/a",null,stat);int version &#61; stat.getVersion();zk.setData("/a","aa".getBytes(),version);zk.close();}
}

  1. 图示&#xff1a;每次修改操作都依次执行&#xff0c;前一次修改结束了&#xff0c;后一次修改才开始进行
    在这里插入图片描述
  2. 并发修改 &#xff1a;12 个线程一起修改
    结果 &#xff1a;11 个错误。
    结论 &#xff1a;1 个用户修改成功&#xff0c;其他 11 个用户全部失败。

public static void main(String[] args) throws IOException {for (int i&#61;0;i<12;i&#43;&#43;){Thread t &#61; new Thread(new Runnable() {public void run() {try {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);Stat stat &#61; new Stat();zk.getData("/a",null,stat);int version &#61; stat.getVersion();zk.setData("/a","aa".getBytes(),version);zk.close();} catch (Exception e) {e.printStackTrace();}}});t.start();}
}

  1. 12个线程&#xff0c;分批次修改&#xff0c;每三个线程一组&#xff1a;

public static void main(String[] args) throws Exception {for (int i &#61; 1; i <&#61;12 ; i&#43;&#43;) {final int j&#61;i;if(i&#61;&#61;4||i&#61;&#61;7||i&#61;&#61;10){Thread.sleep(1000);}Thread t &#61; new Thread(new Runnable() {public void run() {try {ZooKeeper zk &#61; new ZooKeeper("node01:2181", 5000, null);Stat stat &#61; new Stat();zk.getData("/a", null, stat);int version &#61; stat.getVersion();zk.setData("/a", "aa".getBytes(), version);System.out.println(j);zk.close();} catch (Exception e1) {e1.printStackTrace();}}});t.start();}
}

  1. 对同一时刻的理解 &#xff1a;版本图
    1 &#xff0c;用户 1,2,3 就相当于同一时刻在修改
    2 &#xff0c;在 1,2,3 发出修改操作时&#xff0c;他们看到的版本号都是 0
    3 &#xff0c;但是 1 率先开始修改操作
    4 &#xff0c;当 1 号修改完成后&#xff0c;数据的版本号已经变成 1 版本
    5 &#xff0c;2号&#xff0c;3号&#xff0c;手中拿着的版本号仍然是 0 &#xff0c;但是数据版本号已经是 1 &#xff0c;所以 2,3 修改失败。
    6 &#xff0c;组内不确定性&#xff1a;每个小组中都有一个跑得快的线程&#xff0c;占据主导地位&#xff0c;另外两个跑得慢&#xff0c;至于小组中的哪一个跑得快&#xff0c;是不确定的。
    7 &#xff0c;时间不确定性&#xff1a;理论上说&#xff0c;线程之间存在竞争激烈的竞争&#xff0c;每个小组会有一个线程获胜&#xff0c;但是有可能修改操作执行的很快&#xff0c;以至于&#xff0c;它执行完后&#xff0c;下一个线程才开始启动&#xff0c;这样的话&#xff0c;一个小组中就有可能修改两次数据。
    在这里插入图片描述
  2. 版本号的作用 &#xff1a;
    锁死数据&#xff0c;有了版本号的存在&#xff0c;同一个时刻&#xff0c;只能有一个线程在操作 zookeeper 数据&#xff0c;其他的线程全部操作失败&#xff0c;从而达到支持并发修改操作的目的。
  3. 版本号 -1 的作用 &#xff1a;
    1 &#xff0c;忽略其他版本号&#xff0c;修改最新版本。
    2 &#xff0c;解锁数据&#xff0c;我不管别的线程在干嘛&#xff0c;我就要修改&#xff0c;说什么都不听&#xff0c;我就要改。
  4. 用版本号 -1 做修改操作 &#xff1a;12 个线程全成功&#xff0c;不报错

public static void main(String[] args) throws Exception {for (int i &#61; 1; i <&#61;12 ; i&#43;&#43;) {final int j&#61;i;Thread t &#61; new Thread(new Runnable() {public void run() {try {ZooKeeper zk &#61; new ZooKeeper("node01:2181", 5000, null);zk.setData("/a", "aa".getBytes(), -1);System.out.println(j);zk.close();} catch (Exception e1) {e1.printStackTrace();}}});t.start();}
}

10&#xff0c;结论 &#xff1a;
修改操作&#xff0c;单线程操作的话&#xff0c;就用 -1 版本号。
如果考虑并发安全问题&#xff0c;就要用到自己查询的版本号。

14&#xff0c;理论 2 – 权限 &#xff1a; 创建节点时用到 ( 谁可以访问这个节点 )

&#64;Test // set /a jerrypublic void create() throws IOException, InterruptedException, KeeperException {ZooKeeper zk &#61; new ZooKeeper("node01:2181",5000,null);zk.create("/b","bb".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);zk.close();}

  1. OPEN_ACL_UNSAFE &#xff1a;开放权限&#xff0c;所有人都可读&#xff0c;可写
  2. CREATOR_ALL_ACL &#xff1a; 只有创建这个节点的用户&#xff0c;才能访问这个节点
  3. READ_ACL_UNSAFE &#xff1a;所有用户都可以读这个节点
    在这里插入图片描述

15&#xff0c;理论 3 – 节点类型 &#xff1a; 创建节点时用到


  1. PERSISTENT &#xff1a;永久节点&#xff0c;创建后就一直存在&#xff0c;zk 重启&#xff0c;节点还在
  2. EPHEMERAL &#xff1a;临时节点&#xff0c;客户端断开后&#xff0c;节点消失 ( 打断点&#xff0c;试试看 )
  3. PERSISTENT_SEQUENTIAL &#xff1a;永久序列节点
  4. EPHEMERAL_SEQUENTIAL &#xff1a;临时序列节点
    在这里插入图片描述

16 &#xff0c;临时节点测试 &#xff1a; 打断点


  1. 创建临时节点&#xff0c;打断点 &#xff0c;执行 &#xff1a;
    在这里插入图片描述
  2. 查看这个节点 &#xff1a;看到临时节点
    在这里插入图片描述
  3. 放开 debug &#xff1a;
    在这里插入图片描述
  4. 再次查看 &#xff1a;临时节点消失
    在这里插入图片描述
  5. 作用 &#xff1a;保存临时数据

17 &#xff0c;序列节点 &#xff1a; 就是一串数字


  1. 创建后&#xff0c;他会在节点名字后面加一串数字&#xff0c;10 个数字。
  2. 再次创建序列节点&#xff0c;又一串数字&#xff0c;并且这个数字是刚才的数字加一。
  3. 重要用途 &#xff1a;同步&#xff0c;锁。
  4. 类型&#xff1a;永久型序列节点&#xff0c;临时型序列节点。
  5. 看图&#xff0c;一看便知 &#xff1a;
    在这里插入图片描述

推荐阅读
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • 本文详细介绍了 Flink 和 YARN 的交互机制。YARN 是 Hadoop 生态系统中的资源管理组件,类似于 Spark on YARN 的配置方式。我们将基于官方文档,深入探讨如何在 YARN 上部署和运行 Flink 任务。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 尝试执行数据库模式加载时遇到错误'Mysql2::Error: 指定的键太长;最大键长度为767字节'。本文将探讨这一问题的成因及解决方案。 ... [详细]
author-avatar
asdasdasd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有