Zookeeper应用的开发主要通过java客户端API去连接和Zookeeper集群。
Zookeeper提供java客户端API:
Zookeeper官方客户端API提供了基本操作:创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。
官方API的不足之处:(Zookeeper官方API功能比较简单,在实际开发过程中不推荐使用)
引入zookeeper client依赖(与服务端保持一致,否则会有很多兼容性问题)
org.apache.zookeeper zookeeper 3.8.0
Zookeeper原生客户端主要使用org.apache.zookeeper.ZooKeeper这个类来使用ZooKeeper服务。
Zookeeper(connectString,sessionTimeout,watcher)
使用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); } }
同步创建节点:
@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算法应用
一行代码就能解决的算法题
二分查找高效判定子序列
目录大纲:
以上文章里写到的所有文档资料,均免费分享,有需要的关注+点赞小编,支持一下,然后关注下方公众号自行下载。