数据存储
DataTree ConcurrentHashMap
事务日志
快照日志
运行时日志
java api
package code;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Pattern;
public class Fir {
public static void main(String[] args) throws Exception {
CountDownLatch count = new CountDownLatch(1);
ZooKeeper zooKeeper = new ZooKeeper("192.168.204.129:2181,192.168.204.129:2182,192.168.204.129:2183", 4000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
count.countDown();
}
}
});
count.await();
System.out.println(zooKeeper.getState());
// zooKeeper.create("/javaapi", "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//一个是权限,一个是持久化,创建后就不能再次创建了
Stat stat = new Stat();
byte[] data = zooKeeper.getData("/java", null, stat);
System.out.println("data = " + new String(data));
zooKeeper.setData("/java", "2".getBytes(), stat.getVersion());
byte[] dataNew = zooKeeper.getData("/java", null, stat);
System.out.println("dataNew = " + new String(dataNew));
zooKeeper.delete("/java",stat.getVersion());
// System.out.println("new String(zooKeeper.getData(\"/java\",null,stat)) = " + new String(zooKeeper.getData("/java", null, stat))); //删除了就不能获取了,否则报错
zooKeeper.close();
}
}
报错信息
KeeperErrorCode = NoNode for /java
事件机制
watch 特性,当节点发生变化的时候,zookeeper会产生一个watcher事件,会给客户端一个通知。但是只会通知一次,后续就没了
绑定事件的机制
一共有三个方法, getData,Exists,getChildren
如何触发这个机制呢
凡是事务类型的操作,都会触发 setDatta Create Delete
watcher 事件的类型, 这个就是上边的触发啊 对应的类型
None 客户端的状态发生变化的时候 ,会有一个事件
也就是在子节点的增删改的时候也会触发。
watcher 事件的原理
watcher 的源码解析在后边。