1.数据存储
DataTree 底层是ConcurrentHashMap
2.基于Java API初探zookeeper使用
连接状态:
NOT_CONNECTED -------> CONNECING ---------> CONNECTED ---------> CLOSE
a.引入zookeeper的jar包
<!-- Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
b.连接zookeeper服务
package com.anne.zookeeper;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
public class ConnectionDemo {
public static void main(String[] args) {
try {
CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zookeeper = new ZooKeeper("192.168.232.128:2181,192.168.232.130:2181,192.168.232.132:2181", 4000,
new Watcher() {
@Override
public void process(WatchedEvent event) {
if(Event.KeeperState.SyncConnected==event.getState()) {
// 如果收到了服务器的响应事件,连接成功
countDownLatch.countDown();
}
}});
countDownLatch.await();
System.out.println(zookeeper.getState());// CONNECTED
zookeeper.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
c. 数据的增删改查
// 添加节点
zookeeper.create("/zk-persis-anne", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
Thread.sleep(1000);
Stat stat = new Stat();
// 得到当前节点的值
byte[] bytes = zookeeper.getData("/zk-persis-anne", null, stat);
System.out.println(new String(bytes));
// 修改节点的值
zookeeper.setData("/zk-persis-anne", "1".getBytes(), stat.getVersion());
byte[] bytes1 = zookeeper.getData("/zk-persis-anne", null, stat);
System.out.println(new String(bytes1));
// 删除节点
zookeeper.delete("/zk-persis-anne", stat.getVersion());
c.事件机制
watcher特性:当数据发生变化的时候,zookeeper会产生一个watcher事件,并且会发送到客户端。但是客户端只会收到一次通知,如果后续这个节点再次发生变化,那么之前设置watcher的客户端不会再次收到消息。(watcher是一次性操作)。
可以通过循环监听达到永久监听的效果。
1) 如何注册事件机制
通过这三个操作来绑定事件:getData、Exists、getChildren
2) 如何触发事件
只要是事务类型的操作,都会触发监听事件。create/delete/setData