《ZooKeeper》---原生的API中的增删改查操作

前言

  • 上一篇文章中,小编简单的介绍了zookeeper集群的搭建,这篇文章了,小编继续带读者探索zookeeper的基本操作。在zookeeper的原生的API中,他的增删改查操作都有同步和异步的两种方式,下面是具体的代码。

1、建立连接

/** zookeeper地址 */
static final String CONNECT_ADDR = "192.168.141.140:2181,192.168.141.141:2181,192.168.141.143:2181";
/** session超时时间 */
static final int SESSION_OUTTIME = 5000;//ms 
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception{

ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher(){
    @Override
    public void process(WatchedEvent event) {
        //获取事件的状态
        KeeperState keeperState = event.getState();
        //获取事件的类型
        EventType eventType = event.getType();
        //如果是建立连接(SyncConnected表示连接成功的状态)
        if(KeeperState.SyncConnected == keeperState){
            if(EventType.None == eventType){
                //如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
                connectedSemaphore.countDown();
                System.out.println("zk 建立连接");
            }
        }
    }
});
//进行阻塞
connectedSemaphore.await();

/*
.......
.......
.......
在这进行的是增删改查操作
*/

zk.close();

2、创建节点

 String result=zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  • 由于原生的API在创建节点时不支持递归创建,所以当我们创建子节点的时候只能在父节点的基础上创建,代码如下。
zk.create("/testRoot/children", "children data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  • 在创建节点的时候,我们需要将节点的value转化成字节数组,然后再将字节数组的值存入zookeeper的该节点中,当取该节点的时候,我们取的也是字节数组,我们需要将数组的值重新还原才能显示出来。

3、获取节点

获取父节点的值
byte[] data = zk.getData("/testRoot", false, null);
获取子节点的值
List<String> children = zk.getChildren("/testRoot", false);
for (String path : children) {
    System.out.println(path);
    String realPath ="/testRoot/" + path;
    System.out.println(new String(zk.getData(realPath, false, null)));
}

4、修改节点的值

zk.setData("/testRoot", "modify data root".getBytes(), -1);

5、删除节点

zk.delete("/testRoot", -1,
     new AsyncCallback.VoidCallback() {

    @Override
    public void processResult(int rc, String path, Object ctx) {
        System.out.println(rc);//rc 为服务响应码 0 代表调用成功,-4代表端口连接,-110表示指定节点存在,-112表示会话已经过期

        System.out.println(path);//path 接口调用时传入API的数据节点的路径参数

        System.out.println(ctx);// 调用接口传入API ctx的值  再此 ctx的值为 “这是回调函数中传入的参数” 
    }
}, "这是回调函数中传入的参数");

小结

  • 上面便是zookeeper原生的API中,对节点的CRUD操作,原生的API,对节点的增加还有删除都不能实现递归操作,操作起来确实有点麻烦,但是为了了解原生API的知识,不得不去总结一下。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值