ZK学习使用

Linux端

1 启动: ./zkServer.sh start
2 停止:./zkServer.sh stop
3 查看状态:./zkServer.sh status
4 重启:./zkServer.sh restart
5 链接:./zkCli.sh -server ip:port
6 创建节点:create -e(临时) -s(有序) /节点名 value
7 设置节点:set /节点名 value
8 删除节点:delete /节点名 或者 deleteall /节点名 (这是带有子节点的)

Java API

pom文件
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-framework</artifactId>
	<version>4.0.1</version>
</dependency>
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-recipes</artifactId>
	<version>4.0.1</version>
</dependency>

第一步创建客户端
	//重试策略
	RetryPolicy rep=new ExponentialBackoffRetry(3000, 10);
	//创建客户端
	CuratorFramework cli=CuratorFrameworkFactory.builder().connectString("192.168.107.129:2181").sessionTimeoutMs(60*1000).connectionTimeoutMs(15*1000).retryPolicy(rep).namespace("curatorCre").build();
	//启动客户端
	cli.start();

创建节点
	//1、基本创建,如果没有指定数据则把当前机器的ip地址保存到app1下
	cli.create().forPath("/app1");
	//2、创建带数据的
	cli.create().forPath("/app2","haha".getBytes());
	//3、创建不同类型的节点
	cli.create().withMode(CreateMode.EPHEMERAL).forPath("/app3","heihei".getBytes());
	//4、创建多级节点
	cli.create().creatingParentsIfNeeded().forPath("/app3/3son","duoji".getBytes());

查询节点
	//1、得到这个节点下的值
	byte[] bak = cli.getData().forPath("/app1");
	System.out.println(new String(bak));
	//2、得到子节点名
	List<String> sonPath = cli.getChildren().forPath("/app3");
	System.out.println(sonPath);
	//3、获取这个节点的信息
	Stat st=new Stat();
	cli.getData().storingStatIn(st).forPath("/app1");
	System.out.println(st);

修改节点
	//1、直接修改
	cli.setData().forPath("/app1","changele".getBytes());
	//2、根据版本号修改
	Stat st=new Stat();
	cli.getData().storingStatIn(st).forPath("/app1");
	int flag=st.getVersion();
	cli.setData().withVersion(flag).forPath("/app1","lele".getBytes());

删除节点
	//1、直接删除
	cli.delete().forPath("/app1");
	//2、删除带子节点的
	cli.delete().deletingChildrenIfNeeded().forPath("/app3");
	//3、必须成功删除
	cli.delete().guaranteed().forPath("/app1");
	//4、删除后的回调
	cli.delete().guaranteed().inBackground(new BackgroundCallback() {
		public void processResult(CuratorFramework cli, CuratorEvent event) throws Exception {
			System.out.println("我被删除了");
			System.out.println(event);
		}
	}).forPath("/app2");


监听节点(仅自己)
//创建NodeCache对象
final NodeCache cache=new NodeCache(cli,"/app2");
//注册监听
cache.getListenable().addListener(new NodeCacheListener() {
	@Override
	public void nodeChanged() throws Exception {
			//获取变化后内容
			byte[] b=cache.getCurrentData().getData();
			System.out.println("节点变化后内容:"+new String(b));
		}
	});
//开启监听
cache.start(true);


监听子节点(不包括自己)
//创建监听对象
PathChildrenCache pp=new PathChildrenCache(cli, "/app3", false);
//绑定监听器
pp.getListenable().addListener(new PathChildrenCacheListener() {
	@Override
	public void childEvent(CuratorFramework cli, PathChildrenCacheEvent event) {
		System.out.println("子节点变化了"+event);
		Type type = event.getType();
		if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
			System.out.println("数据变了");
			byte[] b=event.getData().getData();
			System.out.println(new String(b));
		}
	}
});
pp.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);


监听子孙节点
TreeCache tree=new TreeCache(cli,"/app2");
tree.getListenable().addListener(new TreeCacheListener() {
	@Override
	public void childEvent(CuratorFramework cli, TreeCacheEvent event) {
		System.out.println(event);
	}
});
tree.start();



分布式锁
//静态代码块
{
	//重试策略
	RetryPolicy rep=new ExponentialBackoffRetry(3000, 10);
	CuratorFramework cli=CuratorFrameworkFactory.builder().
	connectString("192.168.107.129:2181").sessionTimeoutMs(60*1000).
	connectionTimeoutMs(15*1000).retryPolicy(rep).build();
	cli.start();
}
//创建锁对象
InterProcessMutex lock=new InterProcessMutex(cli, "/lock");

public void setLock(){
	try {
	    //获取锁
		lock.acquire(5, TimeUnit.SECONDS);
		System.out.println("获取到锁,开始任务");
		Thread.sleep(3000);
		System.out.println("执行完毕");
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally {
		try {
		    //释放锁
			lock.release();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值