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

Zookeeper实现分布式锁

文章目录

    • ZK节点类型
    • watch监听机制
    • Zookeeper实现分布式锁
      • 锁原理
      • 创建锁的过程
      • 释放锁的过程
      • ZK锁的种类
    • 代码实现

Zookeeper是一个开源的分布式协调服务,是一个典型的分布式数据一致性解决方案。

分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁和分布式队列等功能。

ZK节点类型

  • 临时节点
    客户端与zookeeper断开连接后,该节点会自动删除

  • 临时有序节点
    客户端与zookeeper断开连接后,该节点会自动删除,但是这些节点都是有序排列的。

  • 持久节点
    客户端与zookeeper断开连接后,该节点依然存在

  • 持久节点
    客户端与zookeeper断开连接后,该节点依然存在,但是这些节点都是有序排列的。

watch监听机制

主要是监听以下节点变化信息

  • 节点创建
  • 节点删除
  • 节点数据修改
  • 子节点变更

Zookeeper实现分布式锁

锁原理

多个客户端来竞争锁,各自创建自己的节点,按照顺序创建,谁排在第一个,谁就成功的获取了锁。

就像排队买东西一样,谁排在第一个,谁就先买。
在这里插入图片描述

创建锁的过程

  1. A、B、C、D四个客户端来抢锁

  2. A 先来了,他创建了000001的临时顺序节点,他发现自己是最小的节点,那么就成功的获取到了锁

  3. 然后 B 来获取锁,他按照顺序创建了000001的临时顺序节点,发现前面有一个比他小的节点,那么就获取锁失败。他开始监听A客户端,看他什么时候能释放锁

  4. 同理C和D。

释放锁的过程

  1. A 客户端执行完任务后,断开了和zookeeper的会话,这时候临时顺序节点自动删除了,也就释放了锁

  2. B 客户端一直在虎视眈眈的watch监听着A,发现他释放了锁,立马就判断自己是不是最小的节点,如果是就获取锁成功

  3. C 监听着B,D监听着C。

分布式锁的流程图

在这里插入图片描述

ZK锁的种类

  • InterProcessMutex 分布式可重入排它锁
  • InterProcessSemaphoreMutex 分布式排它锁
  • InterProcessReadWriteLock 分布式可读写锁
  • InterProcessMultiLock 用多个锁去进行一组操作
  • InterProcessSemaphoreV2 共享信号量

代码实现

我们这里直接用封装好的工具类,因为如果你自己写的话,如果测试不到位,一旦线上出现问题,那就是大问题。

这里我们用curator这个工具类,他这里把分布式锁已经都给我们实现好了,我们使用起来就像ReentrantLock这些锁一样,非常简单。

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.0</version><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version>
</dependency>
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.RetryNTimes;
import java.util.concurrent.TimeUnit;public class CuratorDistrLockTest implements Runnable{//zookeeper的地址private static final String ZK_ADDRESS = "127.0.0.1:2181";private static final String ZK_LOCK_PATH = "/zkLock";static CuratorFramework client = null;static {// 连接ZK,如果连接失败,设置每5000毫秒重试一次,最多重试10次client = CuratorFrameworkFactory.newClient(ZK_ADDRESS,new RetryNTimes(10, 5000));client.start();}private static void curatorLockTest() {InterProcessMutex lock = new InterProcessMutex(client, ZK_LOCK_PATH);try {if (lock.acquire(6 * 1000, TimeUnit.SECONDS)) {System.out.println("====== " + Thread.currentThread().getName() + " 抢到了锁 ======");//执行业务逻辑Thread.sleep(15000);System.out.println(Thread.currentThread().getName() + "任务执行完毕");}} catch (Exception e) {System.out.println("业务异常");} finally {try {lock.release();} catch (Exception e) {System.out.println("锁释放异常");}}}public static void main(String[] args) {// 用两个线程,模拟两个客户端// 每个线程创建各自的zookeeper连接对象new Thread(new CuratorDistrLockTest()).start();new Thread(new CuratorDistrLockTest()).start();}@Overridepublic void run() {curatorLockTest();}
}

相关文章:

Zookeeper实现分布式锁

文章目录ZK节点类型watch监听机制Zookeeper实现分布式锁锁原理创建锁的过程释放锁的过程ZK锁的种类代码实现Zookeeper是一个开源的分布式协调服务&#xff0c;是一个典型的分布式数据一致性解决方案。 分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅&#xff0c;负载均…...

MFC 添加重新启动管理器支持

重启管理器是添加到 Visual Studio for Windows Vista 或更高版本操作系统的功能 如果发生意外关闭或重启&#xff0c;重新启动管理器将为你的应用程序添加支持。 重新启动管理器的行为取决于应用程序的类型。 如果你的应用程序是文档编辑器&#xff0c;则重新启动管理器让应用…...

一文带你深刻的进入Python,并且了解Python的优缺点

最近几年Python被吹的神乎其神&#xff0c;很多同学都不清楚Python到底能干什么&#xff1f;就盲目去学习Python,今天我就Python的应用领域来简单盘点一下&#xff0c;让想学习Python 的同学找对方向不迷茫。 2. Python 的特点 这里就谈谈自己的看法&#xff0c;首先 Python是…...

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(4)

别具一格,独此一家&#xff0c;原创唯美浪漫情人节表白专辑 不一样的惊喜哦~&#xff01;&#xff08;html5,css3,svg)表白爱心代码&#xff08;复制就可用&#xff09;&#xff08;4&#xff09; 目录 款式四&#xff1a;时光的记忆款 1、拷贝完整源代码 2、更新时光盒所…...

编译原理—翻译方案、属性栈代码

系列文章戳这里&#x1f447; 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…...

链表

一、从尾到头打印链表题目&#xff1a;输入一个链表&#xff0c;按链表从尾到头的顺序返回一个ArrayList。解题思路&#xff1a;使用栈作为中转&#xff0c;可以实现倒置打印classSolution { public:vector<int> printListFromTailToHead(ListNode* head){//使用栈完成中…...

CSS 样式优先级

CSS 样式优先级决定了最终呈现在浏览器中的样式是哪一组样式&#xff0c;在多组样式中有冲突时&#xff0c;最终呈现在浏览器中的样式是具有最高优先级的样式。 CSS 样式优先级顺序如下&#xff1a; 内联样式 > 内部样式 > 外部样式 !important > 内联样式 > ID…...

SpingMVC获取请求参数

通过ServletAPI获取请求参数将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。html<form th:action"{/param/servletAPI}" method"post">用户名&#xff1a;<input ty…...

微搭使用笔记(二)微搭低代码平台介绍及基础使用

概述 官网地址&#xff1a; 官网 官方文档&#xff1a; 官方文档 FAQ: FAQ 腾讯云微搭低代码是一个高性能的低代码开发平台&#xff0c;用户可通过拖拽式开发&#xff0c;可视化配置构建 PC Web、H5 和小程序应用。支持打通企业内部数据&#xff0c;轻松实现企业微信管理、工…...

CountDownLatch的定义、使用 、原理

一、定义 CountDownLatch的作用很简单&#xff0c;就是一个或者一组线程在开始执行操作之前&#xff0c;必须要等到其他线程执行完才可以。我们举一个例子来说明&#xff0c;在考试的时候&#xff0c;老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程&#xff…...

《Terraform 101 从入门到实践》 Terraform在公有云Azure上的应用

《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新&#xff0c;书中的示例代码也是放在GitHub上&#xff0c;方便大家参考查看。 简介 Azure是微软的公有云&#xff0c;它提供了一些免费的资源&#xff0c;具体可以查看&#xff1a; https:/…...

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(3)

别具一格&#xff0c;原创唯美浪漫情人节表白专辑&#xff0c; (复制就可用)&#xff08;html5,css3,svg)表白爱心代码(3) 目录 款式三&#xff1a;心形实时显示认识多长时间桃花飞舞&#xff08;猫咪&#xff09;款 1、拷贝完整源代码 2、拷贝完整js代码 3、修改时间 4、…...

Linux 删除修改日期大于某一天的文件

在服务器运维过程中,我们往往会产生大量的日志文件. 如果日志文件命名能看出日志产生的时间,这些文件是很好删除的. 但有时,我们可能有成千上万的没有命名规律日志文件 下面的方法可以根据日志最后修改时间 批量删除这些文件 先给出完整命令: find /mydir -mtime 10 -name &…...

【算法题】1845. 座位预约管理系统

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 请你设计一个管理 n 个座位预约的系…...

【专业认知】保研北大金融 / 入职腾讯产品经理

2023.02.11 一. 朱博文学长分享——关于大学生活的一点思考 1. 自我介绍 大数据18级 经济学双学位 保研至北大金融硕士 “多思考、多感受、兼听则明” 2. 大学生活 2.1 为什么要上大学 1&#xff1a;追求美好生活的需要 “美好”难以量化&#xff0c;因为每个人对生活…...

OpenHarmony使用Socket实现一个UDP客户端详解

一、前言 我们在这里介绍Socket的使用,是为了后面的一篇文章实现设备配网做铺垫。 二、示例详解 点击获取BearPi-HM_Nano源码 ,以D3_iot_udp_client为例: 示例本身很简单,只需要修改 udp_client_demo.c 的2处代码,就能测试了: //连接WIFI,参数1是:WIFI名称,参数2是:…...

使用VUE自定义组件封装部门选择功能

背景 照惯例&#xff0c;先交待下背景&#xff0c;从真实需求出发&#xff0c;讲述实现效果、设计思路和实现方式。 软件系统中&#xff0c;会有一些常见常用的选择功能&#xff0c;如部门选择、人员选择等&#xff0c;用于填报表单&#xff0c;使用频率很高。直接使用一方面会…...

C语言基础应用(一)数据类型

一、数据类型 1、数据类型的分类 2、常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 2.1 常量举例 // 整型常量 举例 /*718 十进制0213 八进制0x4b 十六进制30u 无符号整数30l 长整型30ul 无符号长整型*/ // 浮点常量…...

算法笔记(三)—— 桶排序及排序总结

堆 逻辑上是一棵完全二叉树&#xff08;依次遍满或者全满&#xff09;。 数组可以转为完全二叉树&#xff0c;完全二叉树某结点左孩子(2*i1)&#xff0c;右孩子(i*22)&#xff0c;父结点((i-1/)2)&#xff0c;根节点的父还是自己。 如何将数组转化为堆&#xff08;大根堆&…...

Linux入门篇(一)

Linux前言Linux初探Linux内核GNU实用工具shellLinux发行版bash shell 基础Linux文件系统Linux文件操作命令前言 在阅读诸如docker之类的书的时候&#xff0c;经常碰到Linux的知识。同时&#xff0c;大部分的盲区也是在Linux方面。因此就想稍微了解一下这个广为人使用的操作系统…...

终极实时窗口分辨率调整工具SRWE:打破屏幕限制的完整指南

终极实时窗口分辨率调整工具SRWE&#xff1a;打破屏幕限制的完整指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾为游戏截图分辨率太低而烦恼&#xff1f;是否需要在不同设备上测试UI布局却要反复重…...

粒子群灰狼优化算法稀疏码设计【附代码】

✨ 长期致力于稀疏码多址接入、星型正交振幅调制、功率不平衡码本、粒子群算法、混合粒子群灰狼优化算法研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff…...

计算机视觉模型选型实战:四维战场决策法

1. 项目概述&#xff1a;这不是一场技术选型&#xff0c;而是一次实战能力的现场测验 “计算机视觉的战场&#xff1a;选择你的冠军”——这个标题乍看像游戏海报&#xff0c;实则精准戳中了当前CV工程落地最真实的痛点。它不谈论文指标、不堆模型参数&#xff0c;而是把镜头直…...

告别AT指令恐惧症:用ESP-01S和51单片机,5分钟搞定手机远程开关灯

从零到一的智能家居初体验&#xff1a;ESP-01S与51单片机极简联动方案 第一次接触物联网硬件开发时&#xff0c;那些密密麻麻的AT指令确实容易让人望而生畏。但当我真正用ESP-01S模块配合最基础的51单片机&#xff0c;在五分钟内实现了手机远程开关LED灯的那一刻&#xff0c;所…...

高性能ai编程工具zed配置deepseek 开启ai agent对话及代码补全

配置ai助手 进入设置页配置deepseek apikey配置代码补全 进入setting->edit pridic -> config.json文件。替换下面内容{"show_edit_predictions": true,// ✅ 代码补全核心配置&#xff08;关键修改&#xff09;"edit_predictions": {"provide…...

[具身智能-653]:人的大脑神经网络就是天然的模拟电路,还是数字电路?

结论先给&#xff1a;人脑神经网络&#xff0c;本质是【天然模拟电路】&#xff0c;不是数字电路这和前面聊的模拟电路频域特性、硬件隐式频域滤波完全同逻辑。一、先分清&#xff1a;数字电路 vs 模拟电路 核心区别数字电路只有0、1两种离散电平&#xff0c;跳变是阶跃式&…...

原神模型导入终极指南:GIMI深度定制框架完全解析

原神模型导入终极指南&#xff1a;GIMI深度定制框架完全解析 【免费下载链接】GI-Model-Importer Tools and instructions for importing custom models into a certain anime game 项目地址: https://gitcode.com/gh_mirrors/gi/GI-Model-Importer 原神模型导入&#x…...

告别手动配网!用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解

告别手动配网&#xff01;用IEEE 1905.1协议实现Wi-Fi AP自动配置的保姆级流程拆解 想象一下&#xff0c;当你需要为三层别墅部署全屋Wi-Fi覆盖&#xff0c;或是为小型办公室搭建多AP无线网络时&#xff0c;传统方式需要逐个登录每个AP的后台&#xff0c;重复输入SSID、密码、…...

uHabits习惯追踪应用完整指南:从入门到精通的5个实用技巧

uHabits习惯追踪应用完整指南&#xff1a;从入门到精通的5个实用技巧 【免费下载链接】uhabits Loop Habit Tracker, a mobile app for creating and maintaining long-term positive habits 项目地址: https://gitcode.com/gh_mirrors/uh/uhabits uHabits习惯追踪应用是…...

AI编程规划工具vibe-driven-dev:从模糊想法到清晰开发蓝图

1. 项目概述&#xff1a;从“感觉”到“计划”的桥梁在AI编程助手&#xff08;或者说“编码智能体”&#xff09;越来越普及的今天&#xff0c;一个常见的困境是&#xff1a;我们脑子里有一个很棒的产品想法&#xff0c;但当你试图把它交给Claude Code、Cursor或者Windsurf这类…...