zookeeper API使用——znode的CRUD

这应该是目录

  • 一、创建连接
    • 1.1构造函数
    • 1.2创建连接(封装)
  • 二、节点操作
    • 2.1创建节点create
      • 语法
      • 代码
    • 2.2获取节点数据getData
      • 语法
      • 代码
    • 2.3获取子节点getChildren
      • 语法
      • 代码
    • 2.4修改节点的值setData
      • 语法
      • 代码
    • 2.5删除delete
      • 语法
      • 代码

以下的代码只能作为基础的语法使用,为了简洁,我尽量使得每个功能区分开,代码内可能存在一些冗余,自行删除即可

一、创建连接

1.1构造函数

zookeeper的构造函数很多,具体区别建议查看源码
在这里插入图片描述

常用的构造函数如下

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException { this(connectString, sessionTimeout, watcher, false); }

String connectString:这是一个包含ZooKeeper服务器地址的连接字符串。通常,它是由逗号分隔的主机名和端口号对组成,例如 “host1:port1,host2:port2,host3:port3”
int sessionTimeout:这是会话超时的时间(以毫秒为单位)。ZooKeeper客户端和服务器之间的会话在指定的时间内如果没有收到任何心跳,则会话将过期。
Watcher watcher:这是一个实现了Watcher接口的实例,用于接收来自ZooKeeper的状态变化通知。

1.2创建连接(封装)

由于连接速度比较慢,因此使用CountDownLatch同步工具类,等待zookeeper客户端与服务端建立完成后,继续后续操作。

ZooKeeperFacotry.java

package com.wunaiieq;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.util.concurrent.CountDownLatch;
public class ZooKeeperFacotry {//连接超时时间private static final int SESSION_TIMEOUT = 5000;public static ZooKeeper create(String connectionString) throws Exception {final CountDownLatch connectionLatch = new CountDownLatch(1);//创建 ZooKeeper 对象ZooKeeper zooKeeper = new ZooKeeper(connectionString, SESSION_TIMEOUT,// 当 ZooKeeper 服务的状态变为 SyncConnected(同步连接已建立)时,process 方法会被调用。// 此时,它会调用 connectionLatch.countDown() 来减少 CountDownLatch 的计数,并打印出 "连接建立" 的信息。new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getType()== Event.EventType.None&& event.getState() == Watcher.Event.KeeperState.SyncConnected) {connectionLatch.countDown();System.out.println("success");}}});//在创建 ZooKeeper 对象之后,代码会打印出 "等待连接建立..." 的信息,并调用 connectionLatch.await() 来等待连接建立。// CountDownLatch 的 await 方法会阻塞当前线程,直到计数器的值变为 0。System.out.println("waiting...");connectionLatch.await();return zooKeeper;}}

主函数,这里没有设置太多的内容,关于节点操作请看后续
Main.java

package com.wunaiieq;
import org.apache.zookeeper.ZooKeeper;
public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//随便打印些内容查看状态System.out.println(zooKeeper.getSessionId());}
}

项目使用Maven进行打包,建议在服务器端运行
关于zookeeper的jar包必须保持和服务器端zookeeper版本一致

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wunaiieq</groupId><artifactId>zookeeper02</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.7.1</version></dependency></dependencies><build><plugins><plugin><!--声明--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><!--具体配置--><configuration><archive><manifest><!--jar包的执行入口--><mainClass>com.wunaiieq.Main</mainClass></manifest></archive><descriptorRefs><!--描述符,此处为预定义的,表示创建一个包含项目所有依赖的可执行 JAR 文件;允许自定义生成jar文件内容--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!--执行配置--><executions><execution><!--执行配置ID,可修改--><id>make-assembly</id><!--执行的生命周期--><phase>package</phase><goals><!--执行的目标,single表示创建一个分发包--><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>

二、节点操作

2.1创建节点create

语法

在这里插入图片描述

path:节点的全部路径
data:数据,要求必须是字节数组
acl:节点的权限
在这里插入图片描述
OPEN_ACL_UNSAFE:任何人任何操作
CREATOR_ALL_ACL:给与创建者的权限
READ_ACL_UNSAFE:允许任何人读取

createMode:节点类型
在这里插入图片描述
PERSISTENT:普通持久节点
PERSISTENT_SEQUENTIAL:顺序持久节点
EPHEMERAL:普通临时节点
EPHEMERAL_SEQUENTIAL:顺序临时节点
CONTAINER:容器节点
PERSISTENT_WITH_TTL:带有TTL的持久节点
PERSISTENT_SEQUENTIAL_WITH_TTL:带有TTL的持久顺序节点

代码

代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java

package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//节点不存在时,stat为空if (stat == null) {//创建节点try {String result = zooKeeper.create("/wunaiieq", "wunai".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println("创建成功");} catch (Exception e) {e.printStackTrace();System.out.println("创建失败");}}else {System.out.println("节点存在,创建失败");}}
}

在这里插入图片描述

2.2获取节点数据getData

语法

在这里插入图片描述

path:路径
watch:监听器。这里表示是否使用,如果使用需要填入监听器对象
stat:存储节点属性,如果输入一个stat对象,那么执行后,这个对象会获取到这个节点的相关信息
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
注意2,4两个方法是异步的getdata

代码

代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java

package com.wunaiieq;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);if (stat != null) {Stat stat1 =new Stat();byte[] data = zooKeeper.getData("/wunaiieq", false, stat1);String res =new String(data);System.out.println(res);System.out.println(stat1);}}
}

在这里插入图片描述

2.3获取子节点getChildren

语法

在这里插入图片描述

path:路径
watch:监听器。这里表示是否使用,如果使用需要填入监听器对象
stat:存储节点属性,如果输入一个stat对象,那么执行后,这个对象会获取到这个节点的相关信息
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
下面4个为异步执行的,上面4个将获取所有子节点的名称,在获取到名称后,可以使用2.2的方法获取每个节点的内容

代码

代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java

package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;import java.util.List;public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//获取子节点数据//获取所有子节点List<String> childrenList = zooKeeper.getChildren("/", null);for(String child:childrenList){System.out.println(child);Stat stat1 =new Stat();String path = "/"+child;byte[] data = zooKeeper.getData(path, false, stat1);String res = new String(data);System.out.println(res);System.out.println(stat1);}}
}

在这里插入图片描述

2.4修改节点的值setData

语法

在这里插入图片描述

path:节点的路径
data:数据,要求必须是字节数组
version:版本号,若不知道具体的值,写-1即可,最终结果+1
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
和上述类似,第二个为异步执行的函数

在hadoop生态圈中,大部分框架的数据内容都附带一个版本号的信息,如果想对此节点的数据进行更新,一般都是 新数据 + 更高的版本号

代码

代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java

package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.util.List;
public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//修改节点值Stat stat3 = null;stat3 = zooKeeper.setData("/wunaiieq", "20241010".getBytes(), -1);//查看节点的内容byte[] data = zooKeeper.getData("/wunaiieq", false, null);String res = new String(data);System.out.println(res);}
}

在这里插入图片描述

2.5删除delete

语法

在这里插入图片描述

path:节点的路径
version:版本号,若不知道具体的值,写-1即可,表示无论版本,直接删除
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
和上述类似,第二个为异步执行的函数

代码

代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java

package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.util.List;
public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//删除//判断存在if(stat != null){System.out.println("节点存在");zooKeeper.delete("/wunaiieq",-1);System.out.println("删除成功");}else {System.out.println("节点不存在");}}
}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443539.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain: 大语言模型的新篇章

本文介绍了LangChain框架&#xff0c;它能够将大型语言模型与其他计算或知识来源相结合&#xff0c;从而实现功能更加强大的应用。接着&#xff0c;对LangChain的关键概念进行了详细说明&#xff0c;并基于该框架进行了一些案例尝试&#xff0c;旨在帮助读者更轻松地理解LangCh…

65 切面AOP

65 切面AOP 切面基础概念 AOP&#xff1a;Aspect Oriented Programming&#xff0c;面向切面编程。是通过预编译方式&#xff08;aspectj&#xff09;或者运行期动态代理&#xff08;Spring&#xff09;实现程序功能的统一维护的技术。 面试问题&#xff1a; Spring的两大核心…

【VUE】双端比较算法

假设我们有两个虚拟节点 oldVnode 和 newVnode&#xff0c;它们分别对应的DOM结构为&#xff1a; 我们需要将 oldVnode 更新为 newVnode&#xff0c;这时就可以使用双端比较算法了。算法本质上是将新旧节点进行一次交叉比较&#xff0c;尽可能地重复使用已有的节点来达到最小…

懒人笔记-QT程序UOS打包篇

懒人笔记-uos打包篇 前言1、deploy2、组织打包目录2.1 控制文件2.1.1 control的内容&#xff1a;2.1.2 postinst的内容&#xff1a;2.1.3 postrm的内容&#xff1a; 2.2 执行程序2.3 开机自启&#xff08;可选项&#xff09; 3、输出deb安装包4、服务卸载4.1 服务卸载4.2 程序按…

Web自动化Demo-PHP+Selenium

1.新建工程 打开PhpStorm新建工程如下&#xff1a; 打开终端输入如下命令安装selenium&#xff1a; composer require php-webdriver/webdriver 2.编写代码 <?php require vendor/autoload.php;use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver…

BMS-绝缘检测

一、为什么要进行绝缘检测 前言&#xff1a;BMS绝缘检测是指对电池组与车体之间的绝缘状态进行实时监测和检测。为了确保电池组与车体之间的绝缘性能良好&#xff0c;防止漏电和短路等安全隐患&#xff0c;BMS绝缘检测系统能够及时发现绝缘故障&#xff0c;并采取相应的措施进…

计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设

主要功能如下&#xff1a; &#xff08;1&#xff09;用户管理模块&#xff1a;用户能够注册、登录及修改个人信息&#xff0c;查看热门游戏及攻略信息。 &#xff08;2&#xff09;数据采集与处理模块&#xff1a;主要通过Python编程&#xff0c;爬取Tap Tap社区中游戏热门榜…

python发送邮件带附件:配置全指南与步骤?

python发送邮件带附件教程&#xff1f;python如何发邮件带附件&#xff1f; 无论是工作报告、项目文档还是个人通知&#xff0c;邮件都能快速传递信息。而当这些信息需要附带文件时&#xff0c;Python发送邮件带附件的功能就显得尤为重要。AokSend将详细介绍如何使用Python发送…

简易入门:使用Docke 部署一个tomcat服务

简易入门&#xff1a;使用Docke 部署一个tomcat服务 # 拉取 >docker pull tomcat:9.0# 后台运行容器&#xff0c;端口映射为8080. -p 宿主机端口:容器端口 >docker run -d --name tomcat-c-01 -p 8080:8080 tomcat:9.0# 查看容器id >docker ps CONTAINER ID IMAG…

大数据毕业设计选题推荐-王者荣耀战队数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

图解 微信开发者工具 小程序源码 调试、断点标记方法 , 微信小程序调试器,真机调试断点调试方法,小程序网络API请求调试方法 总结

在我们使用微信开发者工具进行微信小程序开发的时候&#xff0c;在这个微信开发者工具的代码编辑框里面我们是无法像使用vscode, idea等IDE工具时那样直接对代码打断点进行调试&#xff0c; 原因是小程序实际上他就是一个web浏览器应用的包装, 在其内部使用的还是类似chrome的…

Mysql数据库安装与C++配置

本文档旨在为需要安装和配置MySQL 8.3、MySQL Workbench以及C Connector的用户提供详细的步骤指导。在安装过程中&#xff0c;可能会遇到一些常见问题&#xff0c;如DLL文件缺失等&#xff0c;本指南也会提供相应的解决办法。 1.安装Mysql8.3 安装Mysql有很多教程&#xff0c…

10.MySql全局参数优化

从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 一、全局参数 配置文件my.ini(windows)或my.cnf(mac)的全局参数&#xff1a; 假设服务器配置为&#xff1a; CPU&#xff1a;32核 内存&#xff1a;64G…

《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署mongodb 7.0.14容器版分片集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

charAt,chartCodeAt,codePointAt,fromCodePoint,fromCharCode

生僻字的length算2,有些空格是特殊空格,比如\u3000 u3000不是全角空格&#xff0c;u3000是表意字空格&#xff08;Ideographic Space&#xff09;&#xff0c;宽度和一个表意字&#xff08;汉字&#xff09;相同。它应当被当做汉字来处理。比如&#xff0c;在一些排版中&#x…

Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!

一、下载地址&#xff1a; 二、Python的下载及安装&#xff1a; 1、从上面网址进入Python官网 2、安装流程图&#xff1a; 双击已经下载好的python-*.*.*-amd64.exe文件&#xff0c;开始安装 最后就等它自己安装完成就好了 3、检验是否安装完成&#xff1a; windowsR快捷键…

Spring系列 循环依赖

文章目录 注入方式循环依赖的场景单例创建流程getSingletoncreateBeandoCreateBeancreateBeanInstance 循环依赖分析为什么都使用构造函数无法解决&#xff1f;为什么使用Autowired可以解决&#xff1f;为什么要添加到 earlySingletonObjects 缓存中&#xff1f;allowCircularR…

计算机毕业设计 基于Python音乐平台的设计与实现 Python毕业设计 Python毕业设计选题 Vue 前后端分离【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

windows C++-移除界面工作线程(一)

本文档演示了如何使用并发运行时将 Microsoft 基础类 (MFC) 应用程序中由用户界面 (UI) 线程执行的工作移动到工作线程。 本文档还演示了如何提高冗长绘制操作的性能。 通过将阻塞性操作&#xff08;例如&#xff0c;绘制&#xff09;卸载到工作线程来从 UI 线程中移除工作&am…

浙大数据结构:08-图8 How Long Does It Take

这道题算是较为简单的拓扑排序题&#xff0c;难度不大 机翻 1、条件准备 n,m为n个结点&#xff0c;m条边。 tim数组存到该结点完成的最早时间&#xff0c;会一点点更新 graph存有向边的时间 indegree数组存每个结点的入度 #include <iostream> #include <vector&g…