当前位置: 首页 > news >正文

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代码地址&#xff1a; https://gitee.com/blackjie_1/ljUp/tree/master/zookeeperDemo 个人博客网站&#xff1a;什么是快乐 基于docker 安装 拉取zookeeper 3.4.10 docker pull zookeeper:3.4.10启动服务端 docker run -d -p 2181:2181 -v /root/docker/zookeepe…...

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)

目录 一、前言 &#x1f4a6;什么是字符串 &#x1f4a6;字符串如何存储&#xff1f; 二、字符串常量和字符数组 &#x1f4a6;字符串常量 ✨什么是字符串常量&#xff1f; ✨字符串常量与指针 &#x1f4a6;字符数组 ✨字符数组的应用 &#x1f4a6;字符串常量与字符数组的…...

【文件包含】任意文件包含的理解

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

【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json

1、报错 启动项目的时候&#xff0c;报这个错误&#xff0c;是因为根目录错误&#xff0c;查看&#xff0c;根目录是否错误。...

Gitlab CI如何实现安全获取ssh-key拉取依赖项目,打包成品

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

C#匿名方法介绍

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

Linux C/C++全栈开发知识图谱(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

众所周知&#xff0c;在所有的编程语言中&#xff0c;C语言是一门颇具学习难度&#xff0c;需要很长学习周期的编程语言。甚至很多人经常听到一句调侃的话语——“C&#xff0c;从入门到放弃”。 C界的知名书籍特别多&#xff0c;从简单到高端书籍&#xff0c;许多书籍都是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

广告深度学习计算&#xff1a;阿里妈妈智能创意服务优化使用CPU/GPU分离的多进程架构&#xff0c;加速阿里妈妈智能创意服务。https://mp.weixin.qq.com/s/_pjhXrUZVzFRtiwG2LhnkwCLIP4Clip: CLIP 再下一城&#xff0c;利用CLIP实现视频检索 - 知乎前言&#xff1a; OpenAI 的论…...

rocksdb中测试工具Benchmark.sh用法(基准、性能测试)

1.首先要安装db_bench工具&#xff0c;这个工具在成功安装rocksdb之后就自动存在了&#xff0c;主要是在使用make命令之后就成功安装了&#xff0c;详情请见我之前的文章 2.确保成功安装db_bench之后&#xff0c;找到安装的rocksdb目录下面的tools文件夹&#xff0c;查看里面是…...

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中&#xff0c;Rehash是指在进行哈希表扩容或缩容时重新计算和重新分配哈希槽的过程。Redis使用哈希表来存储键值对&#xff0c;哈希表中的每个槽位对应一个哈希槽&#xff0c;每个槽位可以存储多个键值对。 当哈希表的负载因子&#xff08;load facto…...

C#winform门诊医生系统+sqlserver

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

设计模式 -- 工厂模式(Factory Pattern)

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

设计模式-08-适配器模式

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

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 reg_74LS374.v 1.2 reg_LS3…...

【Android】带下划线的TextView

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

图解未来:数据可视化引领智慧决策时代

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

例解什么是Python装饰器

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

EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息

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

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...