Zookeeper应用开发主要通过java客户端API去连接和Zookeeper集群。
Zookeeper提供java客户端API:
- Zookeeper官方的java客户端API
- 第三方的java客户端API,比如Curator()
Zookeeper官方客户端API提供创建会话、创建节点、读取节点、更新数据、删除节点、检查节点是否存在等基本操作。
官方API缺点:(Zookeeper官方API不建议在实际开发过程中使用功能简单)
- Zookeeper的WatcherJ监控是一次性的,每次触发后需要重新注册。会话加班后,重连机制没有实现。
- 异常处理繁琐,Zookeeper它提供了很多异常,开发人员可能不知道如何处理这些异常
- 提供简单的byte[]数组类型的接口,没有提供Java POJO序列化数据处理接口级别
- 如果在创建节点时抛出异常,需要检查节点是否存在
- 无法实现级联删除
Zookeeper原客户端使用
引入zookeeper client依赖性(与服务端一致,否则会有很多兼容性问题)
<!-- Zookeeper client --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.8.0</version> </dependency>
Zookeeper主要用于原客户端org.apache.zookeeper.ZooKeeper使用这类ZooKeeper服务。
ZooKeeper常用构造器
Zookeeper(connectString,sessionTimeout,watcher)
- connectString:使用逗号分隔列表,每个列表Zookeeper节点是一个host.port对,host是机器名还是IP地址,port是ZooKeeper为客户端提供服务的服务。客户端将随意选择connectString建立连接节点的连接。
- sessionTimeout:session timeout 时间
- watcher:接收来自Zookeeper集群事件。
使用zookeeper原生API,连接zookeeper集群
public class ZkClientDemo { private static final String CONNECT_STR="localhost:2181"; private final static String CLUSTER_CONNECT_STR="192.168.65.156:2181,192.168.65.190:2181,192.168.65.200:2181"; public static void main(String[] args) throws Exception { final CountDownLatch countDownLatch=new CountDownLatch(1); ZooKeeper zooKeeper = new ZooKeeper(CLUSTER_CONNECT_STR, 4000, new Watcher() { @Override public void process(WatchedEvent event) { if(Event.KeeperState.SyncConnected==event.getState() && event.getType()== Event.EventType.None){ //如果服务端收到响应,连接成功 countDownLatch.countDown(); System.out.println("连接建立"); } } }); System.out.printf("连接中"); countDownLatch.await(); //CONNECTED System.out.println(zooKeeper.getState()); //创建持久节点 zooKeeper.create("/user","fox".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } }
Zookeeper主要方法
- create(path,data,acl,createMode);创建给定路径znode,并在znode保存data[]数据,createMode指定znode的类型。
- delete(path,version):如果给定path上的znode版本和给定版本version匹配,删除znode。
- exists(path,watch):判断给定 path 上的 znode 并存在 znode 设置一个 watch。
- getData(path, watch):返回给定 path 上的 znode 数据,并在 znode 设置一个 watch。
- setData(path, data, version):如果给定 path 上的 znode 的版本和给定的 version 匹配,设置 znode 数据。
- getChildren(path, watch):返回给定 path 上的 znode 的孩子 znode 名字,并在 znode 设置一个 watch。
- sync(path):把客户端 session 连接节点和 leader 同步节点。
方法特点:
- 所有获取 znode 数据的 API 可以设置一个 watch 用来监控 znode 的变化。
- 所有更新 znode 数据的 API 两个版本: 若无条件更新版本和条件更新版本。 version 为 -1.无条件更新。否则,只有给定的 version 和 znode 当前的 version 只有这样,才会更新。这种更新是条件更新。
- 所有方法都有两个版本:同步和异步。同步版本的方法发送请求 ZooKeeper 等待服务器的响声 应该。异步版将请求放入客户端请求队列,然后立即返回。异步版通过 callback 来接受来 自服务端响应。
节点同步创建:
@Test public void createTest() throws KeeperException, InterruptedException { String path = zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); log.info("created path: {}",path); }
异步创建节点:
@Test public void createAsycTest() throws InterruptedException { zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, (rc, path, ctx, name) -> log.info("rc {},path {},ctx {},name {}",rc,path,ctx,name),"context"); TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); }
修改节点数据
@Test public void setTest() throws KeeperException, InterruptedException { Stat stat = new Stat(); byte[] data = zooKeeper.getData(ZK_NODE, false, stat); log.info("修改前: {}",new String(data)); zooKeeper.setData(ZK_NODE, "changed!".getBytes(), stat.getVersion()); byte[] dataAfter = zooKeeper.getData(ZK_NODE, false, stat); log.info("修改后: {}",new String(dataAfter)); }
2022年,你还认为算法是面试造火箭,工作拧螺丝吗?
事实上,算法仍然是企业筛选程序员最合适的面试方式之一。在字节跳动、华为等公司的推动下,求职者和面试官都逐渐意识到算法面试实际上是一种相对高效、准确、公平的筛选机制。
优秀的合作伙伴知道,学习算法和数据结构不仅是为了满足技术面试的需要,也是为了提高他们的编程水平。一个优秀的程序员不必精通算法,但如果他甚至不能掌握基本算法,他就不能成为一个优秀的程序员。一个程序员的弟弟说:搬砖 算法 = 稳定快速的搬砖,真相,高质量的代码,让项目如飞!
话不多说,直接开始!
梳理知识体系
没有学习系,学东西总是效率很低,只知其表,不知其里,这就是大多数程序员的现状。因此,这个时候就应该要一份知识体系图来帮助梳理自己的知识,当然,以下相关的资料可以关注+点赞小编,文末获取下载方式!
算法笔记必读系列
目录内容:
-
学习算法和刷题的思路指南
-
学习数据结构和算法读什么书
-
动态规划解题套路框架
-
动态规划答疑篇
-
回溯算法解题套路框架
-
二分查找解题套路框架
-
滑动窗口解题套路框架
-
双指针技巧总结
-
BFS算法套路框架
-
Linux的进程、线程、文件描述符是什么
-
Git/SQL/正则表达式的在线练习平台
第一章动态规划
目录内容:
-
动态规划设计:最长递增子序列
-
经典动态规划:0-1 背包问题
-
经典动态规划:完全背包问题
-
经典动态规划:子集背包问题
-
经典动态规划:编辑距离
-
经典动态规划:高楼扔鸡蛋
-
经典动态规划:高楼扔鸡蛋(进阶)
-
经典动态规划:最长公共子序列
-
动态规划之子序列问题解题模板
-
动态规划之博弈问题
-
动态规划之正则表达
-
动态规划之四键键盘
-
动态规划之KMP字符匹配算法
-
贪心算法之区间调度问题
-
团灭 LeetCode 股票买卖问题
-
团灭 LeetCode 打家劫舍问题
第二章算法思维系列
目录内容:
-
回溯算法团灭子集、排列、组合问题
-
回溯算法最佳实践:解数独
-
回溯算法最佳实践:括号生成
-
滑动窗口技巧
-
twoSum问题的核心思想
-
常用的位操作
-
拆解复杂问题:实现计算器
-
烧饼排序
-
前缀和技巧
-
字符串乘法
-
FloodFill算法详解及应用
-
区间调度之区间合并问题
-
区间调度之区间交集问题
-
信封嵌套问题
-
几个反直觉的概率问题
-
洗牌算法
-
递归详解
第三章高频面试系列
目录内容:
-
如何高效寻找素数
-
如何高效进行模幂运算
-
如何运用二分查找算法
-
如何高效解决接雨水问题
-
如何去除有序数组的重复元素
-
如何寻找最长回文子串
-
如何运用贪心思想玩跳跃游戏
-
如何k个一组反转链表
-
如何判定括号合法性
-
如何寻找缺失的元素
-
如何同时寻找缺失和重复的元素
-
如何判断回文链表
-
如何在无限序列中随机抽取元素
-
如何调度考生的座位
-
Union-Find算法详解
-
Union-Find算法应用
-
一行代码就能解决的算法题
-
二分查找高效判定子序列
数据结构与排序篇
目录大纲:
最后
以上文章里写到的所有文档资料,均免费分享,有需要的关注+点赞小编,支持一下,然后关注下方公众号自行下载。