zookeeper学习二:zookeeper的基本使用

  • 一:数据结构
ZooKeeper 数据模型的结构与 Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode ,每个 ZNode 都可以通过其路径唯一标识
 zoode的节点类型
1:持久话目录节点(PERSISTENT),客户端与zookeeper断开链接后,该节点依旧存在
     持久话顺序编号目录节点(PERSISTENT_SEQUENTIAL),客户端与zookeeper断开链接后,该节点依旧存在,zookeeper会给该节点按找顺序编号
2:临时目录节点(EPHEMERAL)客户端与zookeeper断开链接后,改节点被删除
      临时顺序编号目录节点( EPHEMERAL_SEQUENTIAL)客户端与 zookeeper 断开连接后,该节点被删除, Zookeeper 会给该节点按照顺序编号
  • 二:命令行的使用

可通过bin目录下”zkCli.cmd“进入zookeeper客户端命令行,可通过help进行客户端指令的查看

1:使用ls [path] watch 可查看当前znode中包含的内容

  加 watch 可查看节点更改信息

例: ls /          

2:通过ls2 [path]  watch  查看当前节点数据并能看到更新次数等数据

加 watch 可查看节点更改信息

例:ls2 /

3:创建节点 create /[ptah]

例:create /test

创建成功 

【注:我用的是win服务,课程老师使用linux,在创建时后面还需要指定内容,这个内容可以随便定义,

这里用ABC定义:create /test ABC】

4:获取节点的值 get [path] watch

加 watch 可查看节点更改信息

例:get /test   (我这里没有设置值,,所以获取的是null)

5:设置节点的值:set [path] value

例:set /test insert

6:查看节点状态:stat [path]

例:stat /test

 7删除节点:delete [ptah]

例:delete /test

删除之后进行查看已经没有

8:递归节点删除:rmr [path]

例:rmr /test

我先在test下创建testNode节点,节点下有数据,用delete是无法删除的,现在使用递归节点删除

  • 三:api的使用

新建一个测试项目,导入maveny依赖导入

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

新建测试类进行测试

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class ZkApi {

    @Test
    public void test() throws IOException, KeeperException, InterruptedException {
       /* 1。创建zookeeper链接
        ZooKeeper zk = new  ZooKeeper(String connectString, int sessionTimeout,Watcher watcher)
        创建zookeeper连接,connectString表示连接的zookeeper服务器的
        地址,sessionTimeOut指定会话的的超时时间,Watcher配置监听*/
        ZooKeeper zk=new ZooKeeper("localhost:2181", 2000, new Watcher() {
            public void process(WatchedEvent watchedEvent) {
                System.out.println("触发了:"+watchedEvent.getType()+"的事件");

            }
        });

        //2创建父节点
      /*  String create(String      path, byte[] data, List  acl,CreateMode createMode)
        创建一个给定的目录节点 path, 并给它设置数据,CreateMode 标识有
        四种形式的目录节点,分别是 PERSISTENT:持久化目录节点,这个目
        录节点存储的数据不会丢失;PERSISTENT_SEQUENTIAL:顺序自动编
        号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,
        然后返回给客户端已经成功创建的目录节点名;EPHEMERAL:临时目
        录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超
        时,这种节点会被自动删除;EPHEMERAL_SEQUENTIAL:临时自动编号节点*/
        //path,节点名称,value:节点值,权限,节点类型
        String node =zk.create("/nodeName","nodeValue".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("节点:"+node);
        //3创建子节点
        //创建子节点时,关闭父节点的创建
        String childNode =zk.create("/nodeName/childNodeName","childNodeValue".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("节点:"+childNode);

        //4获取节点中的值
        /*byte[] getData(String path, boolean watch,Stat stat)
            获取这个 path 对应的目录节点存储的数据,数据的版本等信息可以通
            过 stat 来指定,同时还可以设置是否监控这个目录节点数据的状态*/
            byte [] nodes =zk.getData("/nodeName",false,null);
            System.out.println("节点值:"+new String(nodes));
            List<String> cildnodes =zk.getChildren("/nodeName",false);
            for (String str:cildnodes){
                System.out.println("子节点值:"+new String(str));
            }
        //5修改节点的值
        /*Stat setData(String path, byte[] data, int version)
            给 path 设置数据,可以指定这个数据的版本号,如果 version 为 -1
            怎可以匹配任何版本*/
         Stat stat =zk.setData("/nodeName","updateNodeValue".getBytes(),-1);
         System.out.println("更改节点值状态:"+stat);


        //6.判断某个节点是否存在
            /*Stat exists(String path,Watcher watcher)
            重载方法,这里给某个目录节点设置特定的 watcher,Watcher 在
            ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化
            以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置
            在这个目录节点上的 Watcher,从而每个客户端都很快知道它所关注
            的目录节点的状态发生变化,而做出相应的反应*/
        Stat existsStat =zk.exists("/nodeName/childNodeName",false);
        System.out.println("判断节点是否存在状态:"+existsStat);
        //7。删除节点
        zk.delete("/nodeName/childNodeName",-1);
    }
}

 

 

常见问题:

问题:在创建节点时报错:java.lang.IllegalArgumentException: Path must start with / character

解决:path上以/开头
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值