Zookeeper--08---zk实现分布式锁、案例
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录zk实现分布式锁1.zk中锁的种类2.zk如何上读锁3.zk如何上写锁4.⽺群效应可以调整成链式监听。解决这个问题。5.curator实现读写锁分布式锁案例案例分析依赖分布式锁原理--序号节点持久序号节点临时序号节点分布式锁实现测试对比单体模式下---ReentrantLockCurator框架实现分布式锁案例依赖获取客户端连接测试案例Redis分布式锁的实现zk实现分布式锁1.zk中锁的种类读锁⼤家都可以读要想上读锁的前提之前的锁没有写锁写锁只有得到写锁的才能写。要想上写锁的前提是之前没有任何锁。2.zk如何上读锁1.创建⼀个临时序号节点节点的数据是read表示是读锁2.获取当前zk中序号⽐⾃⼰⼩的所有节点3.判断最⼩节点是否是读锁如果不是读锁的话则上锁失败为最⼩节点设置监听。阻塞等待zk的watch机制会当最⼩节点发⽣变化时通知当前节点于是再执⾏第⼆步的流程如果是读锁的话则上锁成功3.zk如何上写锁1.创建⼀个临时序号节点节点的数据是write表示是 写锁2.获取zk中所有的⼦节点3.判断⾃⼰是否是最⼩的节点如果是则上写锁成功如果不是说明前⾯还有锁则上锁失败监听最⼩的节点如果最⼩节点有变化 则回到第⼆步。4.⽺群效应如果⽤上述的上锁⽅式只要有节点发⽣变化就会触发其他节点的监听事件这样的话对zk的压⼒⾮常⼤——⽺群效应。可以调整成链式监听。解决这个问题。5.curator实现读写锁importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.recipes.locks.InterProcessLock;importorg.apache.curator.framework.recipes.locks.InterProcessReadWriteLock;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;SpringBootTestpublicclassTestReadWriteLock{AutowiredprivateCuratorFrameworkclient;TestvoidtestGetReadLock()throwsException{// 读写锁InterProcessReadWriteLockinterProcessReadWriteLocknewInterProcessReadWriteLock(client,/lock1);// 获取读锁对象InterProcessLockinterProcessLockinterProcessReadWriteLock.readLock();System.out.println(等待获取读锁对象!);// 获取锁interProcessLock.acquire();for(inti1;i100;i){Thread.sleep(3000);System.out.println(i);}// 释放锁interProcessLock.release();System.out.println(等待释放锁!);}TestvoidtestGetWriteLock()throwsException{// 读写锁InterProcessReadWriteLockinterProcessReadWriteLocknewInterProcessReadWriteLock(client,/lock1);// 获取写锁对象InterProcessLockinterProcessLockinterProcessReadWriteLock.writeLock();System.out.println(等待获取写锁对象!);// 获取锁interProcessLock.acquire();for(inti1;i100;i){Thread.sleep(3000);System.out.println(i);}// 释放锁interProcessLock.release();System.out.println(等待释放锁!);}}分布式锁案例案例分析比如说 进程 1在使用该资源的时候会先去获得锁在使用该资源的时候保持独占这样其他进程就无法访问该资源进程1用完该资源以后就将锁释放掉让其他进程来获得锁那么通过这个锁机制我们就能保证了分布式系统中多个进程能够有序的访问该临界资源。那么我们把这个分布式环境下的这个锁叫作分布式锁。接收到请求后在/locks节点下创建一个临时顺序节点判断自己是不是当前节点下最小的节点是获取到锁不是对前一个节点进行监听获取到锁处理完业务后delete节点释放锁然后下面的节点将收到通知重复第二步判断依赖dependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.5.7/version/dependency分布式锁原理–序号节点持久序号节点临时序号节点分布式锁实现获取连接对zk加锁对zk解锁importorg.apache.zookeeper.*;importorg.apache.zookeeper.data.Stat;importjava.io.IOException;importjava.util.Collections;importjava.util.List;importjava.util.concurrent.CountDownLatch;publicclassDistributedLock{privatefinalStringconnectStringhadoop102:2181,hadoop103:2181,hadoop104:2181;privatefinalintsessionTimeout2000;privatefinalZooKeeperzk;privateCountDownLatchconnectLatchnewCountDownLatch(1);privateCountDownLatchwaitLatchnewCountDownLatch(1);privateStringwaitPath;privateStringcurrentMode;publicDistributedLock()throwsIOException,InterruptedException,KeeperException{// 获取连接zknewZooKeeper(connectString,sessionTimeout,newWatcher(){Overridepublicvoidprocess(WatchedEventwatchedEvent){// connectLatch 如果连接上zk 可以释放if(watchedEvent.getState()Event.KeeperState.SyncConnected){connectLatch.countDown();}// waitLatch 需要释放if(watchedEvent.getType()Event.EventType.NodeDeletedwatchedEvent.getPath().equals(waitPath)){waitLatch.countDown();}}});// 等待zk正常连接后往下走程序connectLatch.await();// 判断根节点/locks是否存在Statstatzk.exists(/locks,false);if(statnull){// 创建一下根节点zk.create(/locks,locks.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}}// 对zk加锁publicvoidzklock(){// 创建对应的临时带序号节点try{currentModezk.create(/locks/seq-,null,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);// wait一小会, 让结果更清晰一些Thread.sleep(10);// 判断创建的节点是否是最小的序号节点如果是获取到锁如果不是监听他序号前一个节点ListStringchildrenzk.getChildren(/locks,false);// 如果children 只有一个值那就直接获取锁 如果有多个节点需要判断谁最小if(children.size()1){return;}else{Collections.sort(children);// 获取节点名称 seq-00000000StringthisNodecurrentMode.substring(/locks/.length());// 通过seq-00000000获取该节点在children集合的位置intindexchildren.indexOf(thisNode);// 判断if(index-1){System.out.println(数据异常);}elseif(index0){// 就一个节点可以获取锁了return;}else{// 需要监听 他前一个节点变化waitPath/locks/children.get(index-1);zk.getData(waitPath,true,newStat());// 等待监听waitLatch.await();return;}}}catch(KeeperExceptione){e.printStackTrace();}catch(InterruptedExceptione){e.printStackTrace();}}// 解锁publicvoidunZkLock(){// 删除节点try{zk.delete(this.currentMode,-1);}catch(InterruptedExceptione){e.printStackTrace();}catch(KeeperExceptione){e.printStackTrace();}}}测试importorg.apache.zookeeper.KeeperException;importjava.io.IOException;publicclassDistributedLockTest{publicstaticvoidmain(String[]args)throwsInterruptedException,IOException,KeeperException{finalDistributedLocklock1newDistributedLock();finalDistributedLocklock2newDistributedLock();newThread(newRunnable(){Overridepublicvoidrun(){try{lock1.zklock();System.out.println(线程1 启动获取到锁);Thread.sleep(5*1000);lock1.unZkLock();System.out.println(线程1 释放锁);}catch(InterruptedExceptione){e.printStackTrace();}}}).start();newThread(newRunnable(){Overridepublicvoidrun(){try{lock2.zklock();System.out.println(线程2 启动获取到锁);Thread.sleep(5*1000);lock2.unZkLock();System.out.println(线程2 释放锁);}catch(InterruptedExceptione){e.printStackTrace();}}}).start();}}对比单体模式下—ReentrantLockCurator框架实现分布式锁案例依赖dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion4.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion4.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-client/artifactIdversion4.3.0/version/dependency获取客户端连接privatestaticCuratorFrameworkgetCuratorFramework(){ExponentialBackoffRetrypolicynewExponentialBackoffRetry(3000,3);CuratorFrameworkclientCuratorFrameworkFactory.builder().connectString(hadoop102:2181,hadoop103:2181,hadoop104:2181).connectionTimeoutMs(2000).sessionTimeoutMs(2000).retryPolicy(policy).build();// 启动客户端client.start();System.out.println(zookeeper 启动成功);returnclient;}测试案例importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.CuratorFrameworkFactory;importorg.apache.curator.framework.recipes.locks.InterProcessMutex;importorg.apache.curator.retry.ExponentialBackoffRetry;publicclassCuratorLockTest{publicstaticvoidmain(String[]args){// 创建分布式锁1InterProcessMutexlock1newInterProcessMutex(getCuratorFramework(),/locks);// 创建分布式锁2InterProcessMutexlock2newInterProcessMutex(getCuratorFramework(),/locks);newThread(newRunnable(){Overridepublicvoidrun(){try{lock1.acquire();System.out.println(线程1 获取到锁);lock1.acquire();System.out.println(线程1 再次获取到锁);Thread.sleep(5*1000);lock1.release();System.out.println(线程1 释放锁);lock1.release();System.out.println(线程1 再次释放锁);}catch(Exceptione){e.printStackTrace();}}}).start();newThread(newRunnable(){Overridepublicvoidrun(){try{lock2.acquire();System.out.println(线程2 获取到锁);lock2.acquire();System.out.println(线程2 再次获取到锁);Thread.sleep(5*1000);lock2.release();System.out.println(线程2 释放锁);lock2.release();System.out.println(线程2 再次释放锁);}catch(Exceptione){e.printStackTrace();}}}).start();}privatestaticCuratorFrameworkgetCuratorFramework(){ExponentialBackoffRetrypolicynewExponentialBackoffRetry(3000,3);CuratorFrameworkclientCuratorFrameworkFactory.builder().connectString(hadoop102:2181,hadoop103:2181,hadoop104:2181).connectionTimeoutMs(2000).sessionTimeoutMs(2000).retryPolicy(policy).build();// 启动客户端client.start();System.out.println(zookeeper 启动成功);returnclient;}}Redis分布式锁的实现Redis–12–Redis分布式锁的实现

相关新闻

Keil5 修改STM32单片机项目名称

Keil5 修改STM32单片机项目名称

Keil5 修改STM32单片机项目名称 目录 Keil5 修改STM32单片机项目名称引言步骤1、修改文件夹名称2、删除修改项目文件3、打开项目中修改属性4、修改输出文件名5、编译引言 在做STM32单片机的时候经常要移植工程或者例程。需要修改工程名称,百度的很多方法说的不清楚有…

2026/7/28 11:16:22 阅读更多 →
docker的基本操作命令

docker的基本操作命令

目录:1、镜像相关操作2、镜像复制(cp)3、日志(logs)查询3.1、通过时间点过滤日志4、查看 Docker 版本(version)查看 Docker 客户端和服务端版本信息。5、查看 Docker 系统信息(info)查看 Docker 运行环境信息。6、查看…

2026/7/28 11:16:22 阅读更多 →
计算机毕业设计之基于Javaweb的肇庆旅游系统的设计与实现lw

计算机毕业设计之基于Javaweb的肇庆旅游系统的设计与实现lw

本世纪以来,随着越来越多的人使用网络,互联网得到了极大的发展,各种网络资源呈一个爆发性的增长,越来越多的人通过各种各样的网络工具,例如一些专业旅游的网站,查询各种各样的信息,为了适应社会…

2026/7/28 11:15:22 阅读更多 →

最新新闻

Hyperion财务智能系统发展历程与国产化替代解析

Hyperion财务智能系统发展历程与国产化替代解析

1. Hyperion发展历程全景解析 在企业管理软件领域,Hyperion(海波龙)的名字始终与财务智能紧密相连。作为全球领先的合并报表与预算管理解决方案,它的发展轨迹堪称企业级软件演进史的经典案例。我从业财务系统实施15年来&#xff0…

2026/7/28 11:29:27 阅读更多 →
FastFlix:开源视频格式转换工具的技术解析与应用

FastFlix:开源视频格式转换工具的技术解析与应用

1. FastFlix:视频格式转换的现代解决方案 在数字内容爆炸式增长的今天,视频格式转换已成为每个内容创作者、普通用户甚至企业团队都无法回避的日常需求。从4K超高清素材的后期处理,到手机拍摄视频的社交平台适配,再到老旧影视资料…

2026/7/28 11:29:27 阅读更多 →
Java Lambda实战:集合排序、多线程与空指针处理

Java Lambda实战:集合排序、多线程与空指针处理

1. 为什么我们需要Java Lambda实战手册 第一次接触Lambda表达式时,我被它的简洁语法惊艳到了。记得当时重构了一个满是匿名内部类的老项目,代码行数直接减少了40%。但真正深入使用后才发现,Lambda远不止是语法糖那么简单——它改变了我们处理…

2026/7/28 11:29:27 阅读更多 →
FigmaCN完整指南:3分钟实现Figma界面全中文汉化的终极解决方案

FigmaCN完整指南:3分钟实现Figma界面全中文汉化的终极解决方案

FigmaCN完整指南:3分钟实现Figma界面全中文汉化的终极解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否在使用全球顶尖设计工具Figma时,因为英文界…

2026/7/28 11:29:27 阅读更多 →
Claude Code 代理式编码系统:从核心原理到实战部署的完整指南

Claude Code 代理式编码系统:从核心原理到实战部署的完整指南

最近在技术社区和开发者圈子里,Claude Code 的讨论热度持续攀升。很多朋友在尝试安装或使用时,遇到了诸如“无法连接到 Anthropic 服务”或“Claude Code 到底是什么”的困惑。本文旨在为你系统性地拆解 Claude Code,从核心概念、工作原理、典…

2026/7/28 11:29:26 阅读更多 →
FLUX.1-dev-ControlNet-Union:一站式AI图像控制终极指南

FLUX.1-dev-ControlNet-Union:一站式AI图像控制终极指南

FLUX.1-dev-ControlNet-Union:一站式AI图像控制终极指南 【免费下载链接】FLUX.1-dev-Controlnet-Union 项目地址: https://ai.gitcode.com/hf_mirrors/InstantX/FLUX.1-dev-Controlnet-Union 你是否曾经在AI图像生成中感到困惑?明明输入了详细的…

2026/7/28 11:28:26 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻