zookeeper API使用——znode的CRUD

news2024/11/26 10:40:17

这应该是目录

  • 一、创建连接
    • 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() {
                @Override
                public 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.coloradmin.cn/o/2201984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带隙基准Bandgap电路学习(二)

一、高低温性能测试 设置仿真环境温度为-40℃ &#xff0c;观察电路管子工作状态是否正确 环路相位裕度为53.1853 输出噪声曲线&#xff1a; 电源抑制PSR曲线&#xff1a; 设置仿真环境温度为85℃ &#xff0c;观察电路管子工作状态是否正确 环路相位裕度为53.7297 输出噪…

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间&#xff0c;现在&#xff0c;Win 11的24H2版本终于等到了&#xff0c;微软已经全面公开发布Win11 24H2版本&#xff0c;版本号为26100.1742&#xff0c;此次官宣的版本包括了消费者版、商业版、LTSC 2024版等&#xff0c;各种语言版本…

旅游景区小程序|提供多元化服务,打造一站式旅游体验

今年国庆黄金周&#xff0c;各地精心筹备&#xff0c;打造了丰富多彩的文化旅游盛宴&#xff0c;吸引了来自四面八方的游客。凭借各地的自然风光、丰富的人文景观以及精彩纷呈的旅游活动&#xff0c;吸引众多游客。此次国庆旅游市场的火爆&#xff0c;不仅为当地带来了可观的经…

C语言预处理详解(上)(30)

文章目录 前言一、预定义符号二、#define定义标识符三、#define定义宏四、#define的替换规则五、带有副作用的宏六、宏和函数的对比七、#undef的作用八、# 和#的作用##的作用 总结 前言 C语言的入门学习差不多要到尾声了&#xff0c;感觉如何呢~   前文说编译的第一步就是预编…

ax1.twinx()函数介绍

目录 ax1.twinx()实战 ax1.twinx() ax1.twinx() 是 Matplotlib 中用于创建共享 x 轴的双 y 轴的函数。在 Matplotlib 中&#xff0c;当我们希望在同一图中显示不同的数据集&#xff0c;但它们具有相同的 x 轴数据时&#xff0c;可以使用 twinx() 函数创建一个新的坐标轴&#…

(五)、CT球管

第一代和第二代扫描仪使用固定阳极、油冷的X射线管&#xff0c;但由于对输出功率增加的需求&#xff0c;旋转阴极X射线管在CT中变得普遍。 传统固定阳极CT管&#xff0c;当阴极钨丝通过足够的电流时&#xff0c;使其产生白热现象时电子会从钨的表面逸出形成电子云&#xff0c;通…

Lazada菲律宾本土店选品怎么操作?EasyBoss ERP选品功能来帮你!

由于Lazada本土店在流量、履约速度、类目限制以及回款速度方面的优势&#xff0c;越来越多的Lazada卖家都在考虑转型做本土店&#xff0c;但本土化落地并不是一件容易的事&#xff0c;很多卖家在选品阶段就踩大坑了。 因此&#xff0c;为了选品不踩坑&#xff0c;很多卖家都会…

阿里云物联网自有app创建之初始化SDK

文章目录 一、新建工程&#xff0c;配置gradle,导入.so文件&#xff0c;生成apk二、上传apk&#xff0c;集成安全图片&#xff0c;下载SDK三、SDK的集成四、初始化SDK 最近在研究阿里云自有app,这是自己的心得。 一、新建工程&#xff0c;配置gradle,导入.so文件&#xff0c;生…

【论文阅读】超分辨率图像重建算法综述

0. 摘要 研究背景和意义 在人类视觉感知系统中&#xff0c;高分辨率&#xff08;HR&#xff09;图像对于清晰表达空间结构、细节特征、边缘纹理等信息至关重要&#xff0c;在医学、刑侦、卫星等多个领域具有广泛实用价值。超分辨率图像重建&#xff08;SRIR&#xff09;旨在从低…

MQTT vs HTTP:谁更适合物联网?

前言 随着物联网&#xff08;IoT&#xff09;技术的飞速发展中&#xff0c;其应用规模和使用场景正在持续扩大&#xff0c;但它关键的流程仍然是围绕数据传输来进行的&#xff0c;因此设备通信协议选择至关重要。 作为两种主要的通信协议&#xff0c;MQTT 协议和 HTTP 协议各…

AI提示工程:掌握高效Prompt设计的终极指南

导读 提示工程&#xff08;Prompt Engineering&#xff09;是一门新兴的学科&#xff0c;专注于提示词的开发和优化&#xff0c;旨在帮助用户在各种场景和研究领域中更好地利用大语言模型&#xff08;Large Language Model, LLM&#xff09;。掌握相关的提示工程技能将有助于用…

想提升发明专利审查速度有哪些快捷方法?

在创新驱动的时代&#xff0c;发明专利的审查速度对于企业和发明者来说至关重要。了解发明专利的审查程序以及掌握加快审查的快捷途径&#xff0c;能够帮助申请人更快地获得专利授权&#xff0c;保护其创新成果。 一、目前发明专利的审查程序 1. 申请提交&#xff1a;申请人需…

2024年10月上旬更新的6场AI大赛来了,总奖金池:22.9万

亲爱的朋友们&#xff0c;2024年10月的AI大赛最新资讯已上线&#xff01;不要错过这些精彩赛事&#xff0c;快来关注吧&#xff01; 本期我们为您精选了6场AI大赛&#xff0c;主要集中在AI绘画和AI视频创作领域&#xff0c;还有一场别开生面的开放式答题竞赛。这些大赛均由政府…

Java | Leetcode Java题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; class Solution {public int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s ! 0) {s & s - 1;ret;}return ret;} }

线性ADRC(LADRC)系统算法框图

非线性ADRC(NLADRC)详细算法框图和源代码请参考专栏系列文章,常用链接如下: 1、NLADRC自抗扰控制 NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-CSDN博客文章浏览阅读1.6k次,点赞2次,收藏7次。本文介绍了如何将ADRC自抗扰控制算法从Simulink…

基于Renesas R7FA8D1BH (Cortex®-M85)自适应蓝牙控制智能小车

目录 概述 1 系统框架结构 2 系统硬件介绍 2.1 电机驱动控制结构 2.1.1 PWM控制小车接口介绍 2.1.2 小车运行方向控制原理 2.2 外围传感器接口 2.2.1 I2C接口设备 2.2.2 IO接口 2.2.3 UART接口 2.2.4 其他接口 2.3 障碍物监测接口 2.4 测速模块接口 3 系统软件架构…

你还在为找不到免费录屏工具而烦恼吗?

嘿&#xff0c;各位小伙伴们&#xff0c;今天咱们来聊聊录屏软件吧&#xff01;你是不是经常需要录制电脑屏幕&#xff0c;做做教程、游戏解说或者工作汇报呢&#xff1f;那你肯定得选个好用的录屏工具啊&#xff01;来来来&#xff0c;跟着我一起&#xff0c;我来给你们推荐几…

SpringBoot项目打成jar包,在其他项目中引用

1、首先新建一个SpringBoot工程 记得要将Gradle换成Maven 2、新建一个要引用的方法 3、打包的时候要注意&#xff1a; ① 不能使用springboot项目自带的打包插件进行打包&#xff0c;下面是自带的&#xff1a; ②要换成传统项目的maven打包&#xff0c;如下图&#xff1a; 依…

算法 动态规划

更多文章&#xff1a;https://www.pandaer.space 动态规划 算法很简单&#xff01;今天我们来聊聊动态规划&#xff0c;我们先从动态规划怎么来的讲起&#xff0c;然后聊聊动态规划应该如何学&#xff1f;最后正式开始动态规划的学习之旅。 动态规划怎么就出现了呢&#xff…

前端性能优化全面指南

前端性能优化是提升用户体验的关键&#xff0c;页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法&#xff0c;从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件&#xff1a;将多…