zookeeper学习记录
本文Java代码地址: https://gitee.com/blackjie_1/ljUp/tree/master/zookeeperDemo
个人博客网站:什么是快乐
基于docker 安装
拉取zookeeper 3.4.10
docker pull zookeeper:3.4.10
启动服务端
docker run -d -p 2181:2181 -v /root/docker/zookeeper:/home/zookeeper --name zookeeper_1 --restart always zookeeper:3.4.10
启动客户端
docker run -it --``rm` `--link zookeeper_one:zookeeper zookeeper zkCli.sh -server zookeeper
或者
docker exec -it zookeeper_1 zkCli.sh
数据模型
其数据结构类似一个树形结构,每个节点可以拥有子节点并能存储1M的数据
1、持久化
2、临时节点 -e
3、持久化顺序节点 -s
4、临时顺序节点 -es
客户端命令
连接本地zookeeper
docker exec -it zookeeper_1 zkCli.sh
或者
docker run -it --rm --link zookeeper_1:zookeeper_1 zookeeper:3.4.10 zkCli.sh -server zookeeper_1
退出
quit
查看节点
ls /节点名称
创建节点
create /节点名称 [数据] create -e /节点名称 [数据] 临时节点,当前会话断开时,临时节点会删除create -s /节点名称 [数据] 顺序节点,节点名称后会有编号create -s /节点名称 [数据] 临时的顺序节点
获取数据
get /节点名称
设置数据
set /节点名称 [数据]
删除
delete /节点名称delete all /节点名称 删除节点及节点下所有节点
Java代码操作
maven依赖
<!-- 本次学习zookeeper版本是3.4.10--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-client</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>2.12.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency>
增删改查
连接
public void curatorFramework() {//重试策略ExponentialBackoffRetry exponentialBackoffRetry = new ExponentialBackoffRetry(3000, 10);//第一种方式
// CuratorFramework client = CuratorFrameworkFactory
// .newClient(zookeeperUrl, 60000, 15000, exponentialBackoffRetry);//第二种方法client = CuratorFrameworkFactory.builder().connectString("192.168.106.128:2181").connectionTimeoutMs(15000).sessionTimeoutMs(60000).retryPolicy(exponentialBackoffRetry).namespace("lj").build();client.start();}
新增
/*** zookeeper 创建节点 持久、临时、顺序 带有数据* create* 1、创建节点并带有数据* 2、设置节点类型* 3、创建多级节点*/@Testpublic void curatorCreate() throws Exception {//基本创建String app1 = client.create().forPath("/app1");//创建带有数据的节点String s1 = client.create().forPath("/app2", "李杰_app2".getBytes(StandardCharsets.UTF_8));//创建节点默认类型:持久化。可通过withMode方法设置类型String s2 = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3", "李杰_临时".getBytes(StandardCharsets.UTF_8));//创建多级节点//creatingParentsIfNeeded :创建多级节点,如果父节点不存在则创建父节点String s3 = client.create().creatingParentsIfNeeded().forPath("/app4/app5", "李杰_多级节点".getBytes(StandardCharsets.UTF_8));System.out.println(s3);}
查询
/*** zookeeper 查询节点* 1、查询字节点 ls /* 2、获取数据 get /* 3、查询节点状态 ls -s*/@Testpublic void curatorQuery() throws Exception {//获取数据 getDatabyte[] bytes = client.getData().forPath("/app1");//查询子节点 getChildrenList<String> strings = client.getChildren().forPath("/");//查询子节点信息+数据信息//stat 用于获取节点信息,结果会放在stat对象中Stat stat = new Stat();byte[] bytes1 = client.getData().storingStatIn(stat).forPath("/app2");System.out.println(new String(bytes1));}
修改
/*** zookeeper 修改节点数据* 1、修改数据* 2、根据版本修改数据*/@Testpublic void curatorUpdate() throws Exception {//1、修改数据
// client.setData().forPath("/app2","app2_修改".getBytes(StandardCharsets.UTF_8));//2、根据版本修改数据 withVersion//获取版本号Stat stat = new Stat();client.getData().storingStatIn(stat).forPath("/app2");//根据版本号修改数据client.setData().withVersion(stat.getVersion()).forPath("/app2","app2_version_update".getBytes(StandardCharsets.UTF_8));}
删除
/*** zookeeper 删除节点* 1、删除单个节点* 2、删除带有子节点的节点* 3、必须成功的删除* 4、回调函数*/@Testpublic void curatorDelete() throws Exception {//1、删除数据client.delete().forPath("/app1");//2、删除带有子节点的节点 deletingChildrenIfNeededclient.delete().deletingChildrenIfNeeded().forPath("/app4");//3、删除子节点 (必须删除成功,本质是重试策略) guaranteedclient.delete().guaranteed().forPath("/app4");//4、回调函数 inBackground 。在删除后执行的方法client.delete().guaranteed().inBackground(new BackgroundCallback(){@Overridepublic void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {System.out.println("我被删除了");System.out.println(curatorEvent);}}).forPath("/app4");}
监听器
* 监听节点
* 1、监听单个节点 nodeCache
* 2、监听节点下所有子节点 PathChildrenCache
* 3、监听单个节点和节点下的所有子节点 TreeCache
监听单个节点
@Testpublic void curatorFrameworkWatch() throws Exception {//监听单个节点//1、创建监听对象NodeCache nodeCache = new NodeCache(client,"/app2",false);//2、注册监听nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {byte[] data = nodeCache.getCurrentData().getData();System.out.println("节点发生改变,当前值:"+new String(data));}});//3、开启监听nodeCache.start();while (true){}}
监听某节点下的所有子节点
/*** 监听某节点的所有子节点* @throws Exception*/@Testpublic void curatorFrameworkWatchChildren() throws Exception {//监听某节点的所有子节点//1、创建监听对象PathChildrenCachePathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/app2", true);//2、注册监听pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent event) throws Exception {//会监听很多数据,包括节点新增,删除,修改连接等System.out.println("节点发生改变");System.out.println(event);//监听子节点数据发生变化if(PathChildrenCacheEvent.Type.CHILD_UPDATED.equals(event.getType())){// 确实是子节点数据发生变化,获取变化后的值byte[] data = event.getData().getData();String s = new String(data);System.out.println(s);}}});//3、开启监听pathChildrenCache.start();while (true){}}
监听某节点和其所有的子节点
/*** 监听某节点和其所有子节点* @throws Exception*/@Testpublic void curatorFrameworkWatchAll() throws Exception {//1、创建监听对象PathChildrenCacheTreeCache pathChildrenCache = new TreeCache(client, "/app2");//2、注册监听pathChildrenCache.getListenable().addListener(new TreeCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, TreeCacheEvent event) throws Exception {//会监听很多数据,包括节点新增,删除,修改连接等System.out.println("节点发生改变");System.out.println(event);//监听子节点数据发生变化if(TreeCacheEvent.Type.NODE_UPDATED.equals(event.getType())){// 确实是节点数据发生变化,获取变化后的值byte[] data = event.getData().getData();String s = new String(data);System.out.println(s);}}});//3、开启监听pathChildrenCache.start();while (true){}}
分布式锁
简略概念:多机器下的对于锁的处理。实现方式:
1、redis (性能高,但是不是很可靠)
2、数据库实现(获得锁:数据库新增一条唯一数据。释放锁:删除新增的数据。锁等待:等新增成功。此思想同样可以用redis实现。)
3、zookeeper
Java代码实现
本次使用的锁是InterProcessMutex
主要步骤:
1、构建CuratorFramework client 对象
2、通过client 构建InterProcessMutex 对象:lock= new InterProcessMutex(client, “/lock”);
3、执行业务前获取锁:boolean acquire = lock.acquire(5, TimeUnit.SECONDS);
4、业务结束后释放锁:lock.release();
模拟售票
public class ZookeeperLockTests {private static class Tick12306{private int tick=100;public int buyTick(){int result=0;if(tick>0){result=tick;tick--;}else{System.out.println("无票了");return -1000;}return result;}}private static class OtherTick implements Runnable{//抢票机构名称private String name;//12306票池private Tick12306 tick12306;//分布式锁private InterProcessMutex lock;public OtherTick(String name,Tick12306 tick12306){this.name=name;this.tick12306=tick12306;//重试策略ExponentialBackoffRetry exponentialBackoffRetry = new ExponentialBackoffRetry(3000, 10);CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.106.128:2181").connectionTimeoutMs(15000).sessionTimeoutMs(60000).retryPolicy(exponentialBackoffRetry).namespace("lj").build();client.start();lock = new InterProcessMutex(client, "/lock");}//抢票@Overridepublic void run() {while (tick12306.tick>0){try {//获取锁boolean acquire = lock.acquire(5, TimeUnit.SECONDS);if(acquire){System.out.println(this.name+"抢票:"+tick12306.buyTick());}}catch (Exception e){e.printStackTrace();}finally {try {//锁释放lock.release();} catch (Exception e) {e.printStackTrace();}}}}}public static void main(String[] args) {Tick12306 tick12306 = new Tick12306();OtherTick t1 = new OtherTick("携程", tick12306);OtherTick t2 = new OtherTick("飞猪", tick12306);Thread thread1 = new Thread(t1);Thread thread2 = new Thread(t2);thread1.start();thread2.start();}}
相关文章:

zookeeper学习记录
本文Java代码地址: https://gitee.com/blackjie_1/ljUp/tree/master/zookeeperDemo 个人博客网站:什么是快乐 基于docker 安装 拉取zookeeper 3.4.10 docker pull zookeeper:3.4.10启动服务端 docker run -d -p 2181:2181 -v /root/docker/zookeepe…...

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)
目录 一、前言 💦什么是字符串 💦字符串如何存储? 二、字符串常量和字符数组 💦字符串常量 ✨什么是字符串常量? ✨字符串常量与指针 💦字符数组 ✨字符数组的应用 💦字符串常量与字符数组的…...

【文件包含】任意文件包含的理解
谈谈任意文件包含的理解 1.漏洞描述 攻击者可以利用任意文件包含漏洞,读取文件,执行代码,对服务器造成危害。程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此…...

【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json
1、报错 启动项目的时候,报这个错误,是因为根目录错误,查看,根目录是否错误。...

Gitlab CI如何实现安全获取ssh-key拉取依赖项目,打包成品
文章目录 前言配置流程注册ssh-keygit runner映射文件方法1 .gitlab-ci.yml使用方法2 docker build 实现 总结 前言 之所以写这篇文章是由于存在以下场景: 当前的项目编译需要依赖别的项目协同编译,如何将别的项目也pull到该项目里,编译成品…...

C#匿名方法介绍
在C#中,匿名方法是一种没有名称的方法,可以被用作委托的参数或者赋值给委托类型的变量。匿名方法主要有两种形式:匿名方法和lambda表达式。 匿名方法:这是C# 2.0引入的特性。匿名方法用delegate关键字定义,它可以有参…...

Linux C/C++全栈开发知识图谱(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
众所周知,在所有的编程语言中,C语言是一门颇具学习难度,需要很长学习周期的编程语言。甚至很多人经常听到一句调侃的话语——“C,从入门到放弃”。 C界的知名书籍特别多,从简单到高端书籍,许多书籍都是C之…...

pyTorch Hub 系列#2:VGG 和 ResNet
一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…...

clip4clip:an empirical study of clip for end to end video clip retrieval
广告深度学习计算:阿里妈妈智能创意服务优化使用CPU/GPU分离的多进程架构,加速阿里妈妈智能创意服务。https://mp.weixin.qq.com/s/_pjhXrUZVzFRtiwG2LhnkwCLIP4Clip: CLIP 再下一城,利用CLIP实现视频检索 - 知乎前言: OpenAI 的论…...

rocksdb中测试工具Benchmark.sh用法(基准、性能测试)
1.首先要安装db_bench工具,这个工具在成功安装rocksdb之后就自动存在了,主要是在使用make命令之后就成功安装了,详情请见我之前的文章 2.确保成功安装db_bench之后,找到安装的rocksdb目录下面的tools文件夹,查看里面是…...

JS-项目实战-点击水果名修改特定水果库存记录
1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name); //返回的是NodeList类型}} }//当…...

Redis渐进式rehash小疑问
一、rehash是什么 在Redis中,Rehash是指在进行哈希表扩容或缩容时重新计算和重新分配哈希槽的过程。Redis使用哈希表来存储键值对,哈希表中的每个槽位对应一个哈希槽,每个槽位可以存储多个键值对。 当哈希表的负载因子(load facto…...

C#winform门诊医生系统+sqlserver
C#winform门诊医生系统sqlserver说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术:基于C#winform架构和sql server数据库 功能模块: 个人中心:修改个人信息、打开照片并进行修改 预约挂号:二级…...

设计模式 -- 工厂模式(Factory Pattern)
工厂模式:属于 创建型模 式,最常用的设计模式之一,提供了一种创建对象的最佳方式。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决…...

设计模式-08-适配器模式
经典的设计模式有23种,但是常用的设计模式一般情况下不会到一半,我们就针对一些常用的设计模式进行一些详细的讲解和分析,方便大家更加容易理解和使用设计模式。 1-适配器模式原理 适配器模式的英文翻译是Adapter Design Pattern。顾名思义&…...

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 reg_74LS374.v 1.2 reg_LS3…...

【Android】带下划线的TextView
序言 我们有时候需要一个类似这样的显示,上面是文字,下面是一条线 这样的显示效果是TextView实现不了的,需要我们自己进行修改一下。 实现 创建一个UnderlineTextView,继承系统的TextView class UnderlineTextView(mContext…...

图解未来:数据可视化引领智慧决策时代
图表和数据可视化在数据分析中的关键作用 引言: 在现代数据科学中,数据可视化扮演着至关重要的角色。通过图表和可视化工具,我们能够更直观、更有效地理解数据的分布、趋势和关联性。本文将深入讨论三个主要的数据可视化工具:mat…...

例解什么是Python装饰器
Python中的装饰器一直是一个比较难理解的概念,我自己理解的就是用一个函数去修改另一个函数,主要是为另一个函数添加计时等功能,而且不用改变另一个函数,这样就大大减少了另一个函数的维护成本。 这个装饰器,英文名就…...

EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息
0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 字10-63邮箱、EEPROM信息 1.1 字10-63组成规范 字10-63虽然包含的空间区域很大,但实际上仅包含引导状态下邮箱配置、标准邮箱配置、EEPROM大小、执行的SII标准版本…...

【文件读取/包含】任意文件读取漏洞 afr_1
1.1漏洞描述 漏洞名称任意文件读取漏洞 afr_1漏洞类型文件读取漏洞等级⭐漏洞环境docker攻击方式 1.2漏洞等级 高危 1.3影响版本 暂无 1.4漏洞复现 1.4.1.基础环境 靶场docker工具BurpSuite 1.4.2.靶场搭建 1.创建docker-compose.yml文件 version: 3.2 services: web: …...

(八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
一、五种算法(DBO、LO、SWO、COA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为…...

通义灵码,阿里巴巴的编程辅助工具
一、官网 通义灵码_智能编码助手_AI编程_人工智能-阿里云 二、安装VSCode 如何下载安装VSCode 三、VSCode安装通义灵码 1.访问扩展详情界面 方式1 访问通义灵码安装教程页面 方法2 访问VSCode市场中的TONGYI Lingma 点击 Install 按钮访问扩展详情界面 2.打开VSCode …...

Uniapp导出的iOS应用上架详解
目录 Uniapp导出的iOS应用上架详解 摘要 引言 苹果审核标准 苹果调试 注意事项和建议 总结 摘要 本文将探讨Uniapp导出的iOS应用能否成功上架的问题。我们将从苹果审核标准、性能影响、调试流程等多个方面进行深入分析,以及向开发者提供相关注意事项和建议。…...

计算机视觉基础(7)——相机基础
前言 从这一节开始,我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始,我们先来学习一下相机模型,了解相机的基本原理,了解相机如何记录影像。 一、数字相机 1.1 基…...

解决Github上的README无法显示图片
首先感谢博主的思路:思路 最近写了点东西提交到git 发现本地能查看md里的图片用的相对路径,提交到github就看不见,并且发现不只是我自己的仓库看不见,其他人的我也看不见。那就有问题了 解决:正常使用相对路径&…...

qnx 工程目录创建工具 addvariant
文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本ÿ…...

计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
第1章:视觉项目资料介绍与学习指南 相关知识: 介绍计算机视觉、OpenCV库,以及课程的整体结构。学习概要: 了解课程的目标和学习路径,为后续章节做好准备。重要性: 提供学生对整个课程的整体认识࿰…...

【AI视野·今日CV 计算机视觉论文速览 第278期】Mon, 30 Oct 2023
AI视野今日CS.CV 计算机视觉论文速览 Mon, 30 Oct 2023 Totally 50 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Image Clustering Conditioned on Text Criteria Authors Sehyun Kwon, Jaeseung Park, Minkyu Kim, Jaewoong Cho, Ernest…...

深度学习:多模态与跨模态
1 定义 1.1 多模态学习 多模态学习(Multimodal Learning)是一种利用来自多种不同感官或交互方式的数据进行学习的方法。在这个语境中,“模态”指的是不同类型的数据输入,如文本、图像、声音、视频等。多模态学习的关键在于整合和…...