Zookeeper和Redis分别实现分布式锁的原理

目录

分布式锁的概述

ZooKeeper实现分布式锁的原理

Redis实现分布式锁的原理

ZooKeeper分布式锁的工具类

Redis分布式锁的工具类

对比


分布式锁的概述

    分布式锁是一种在分布式系统中用来同步多个进程对共享资源访问的机制。它可以保证在同一时刻,只有一个进程能够获取锁并访问共享资源,从而避免并发冲突。

ZooKeeper实现分布式锁的原理

1. 锁节点的创建

   在ZooKeeper中,分布式锁的实现通常是基于临时顺序节点(Ephemeral Sequential Nodes)。客户端会在一个指定的锁目录下创建一个临时顺序节点。

2. 节点的监听与竞争

 每个客户端会检查自己创建的节点是否是目录下序号最小的节点。如果是,它获得锁;如果不是,它就找到比自己序号小的那个节点,并在该节点上设置监听(watch),等待这个节点被删除。

3. 锁的释放

   获得锁的客户端在完成任务后会删除它创建的节点。这将触发监听该节点的下一个客户端的回调函数,后者随即检查自己是否获得了锁。

4. 会话保持与锁释放

   如果客户端在持有锁的期间失去了与ZooKeeper的连接,那么它创建的临时节点会被自动删除,锁会被释放,这保证了锁总是可用的。

Redis实现分布式锁的原理

1. 锁的设置

   Redis的分布式锁通常是使用SETNXSET命令(带NX标志)来实现的。这些命令可以保证只有在键不存在时才设置键值,从而实现锁的功能。

2. 过期时间的设置

    为了防止客户端在获得锁后因故障未能释放锁,导致死锁,Redis的锁通常会设置一个过期时间(TTL)。这可以通过EXPIRE命令或者SET命令的EX选项来实现。

3. 锁的安全性增强

  为了避免锁过期时间内任务未完成的情况,客户端需要定期检查并续期锁(重新设置过期时间)。客户端在释放锁时,需要确保是自己设置的锁才进行删除,这通常通过在设置锁时使用一个唯一的锁标识符,释放时检查标识符来实现。

4. 原子性操作

    Redis从2.6.12版本开始,SET命令支持NXEX选项,可以原子性地设置键值和过期时间,从而简化了锁的实现。

ZooKeeper分布式锁的工具类

1. Apache Curator

  Apache Curator是一个ZooKeeper的客户端库,它提供了一组高级API,简化了ZooKeeper的使用。Curator中的InterProcessMutex是一个分布式锁的实现,提供了类似Java ReentrantLock 的方法。

Redis分布式锁的工具类

1. Redission

  Redission是一个Java的Redis客户端,它提供了丰富的分布式Java对象,包括分布式锁RLock。Redission的RLock实现了java.util.concurrent.locks.Lock接口,提供了丰富的锁操作功能,并且支持自动续期。

2. Jedis

Jedis是Redis的Java客户端之一,虽然它自身不提供分布式锁的封装,但是可以通过使用setnxexpire命令的组合来实现分布式锁。

对比

  • ZooKeeper的锁实现依赖于ZooKeeper的强一致性保证,锁的状态存储在ZooKeeper的节点中。
  • Redis的锁实现则依赖于Redis的原子操作和键的过期机制。Redis的性能通常更高,但由于Redis是基于最终一致性,可能在某些极端情况下不如ZooKeeper的锁机制健壮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO基础-传统I/O模型

关于IO数据流有两种形式,来源于网络和磁盘分别叫做网络IO、磁盘IO。 客户端通过TCP和UDP协议将数据流发往服务端,服务端接收数据这个过程称为网络IO。 服务端读取本地文件数据到服务中的过程称为磁盘IO。 基于 Linux 一切皆文件的理念,在内…

[大模型]Qwen-7B-Chat WebDemo

Qwen-7B-Chat WebDemo 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行demo…

AI大模型日报#0419:全球最强开源大模型 Llama 3 发布:15T 数据预训练,参数将超 4000 亿

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 刚刚,全球最强开源大模型 Llama 3 发布:使用 15T 数据预训练,最大模型参数将超 4000 亿 摘要…

【目标跟踪】ByteTrack详解与代码细节

文章目录 一、前言二、代码详解2.1、新起航迹2.2、预测2.3、匹配2.4、结果发布2.5、总结 三、流程图四、部署 一、前言 论文地址:https://arxiv.org/pdf/2110.06864.pdf git地址:https://github.com/ifzhang/ByteTrack ByteTrack 在是在 2021 年 10 月…

书生浦语训练营第2期-第4节笔记

一、为什么要微调? 1. 适应特定任务或领域:虽然预训练的模型通常具有广泛的知识和理解能力,但它们可能不完全适应特定任务的需求。通过在特定的数据集上微调模型,可以使模型更好地理解和处理与特定任务或领域相关的数据。 2. 提高…

【uniapp】微信小程序2024手机号快速验证及无感登录教程(内附代码)

组件:手机号快速验证组件 适用对象:企业/个体 费用:0.03元/次 目录 前言思路前端后端代码无感登录onload事件无感登录方法登录判断后端mini_login2 最后 前言 最近注册了公司,可以注册具有支付能力的小程序了,各种材料…

在Nuxt.js中添加PostCSS自动前缀器

在其他浏览器中,有些 CSS 属性需要带有前缀。如-webkit- | -o- | -ms- 等等 Autoprefixer 是一个 PostCSS 插件,可以将你的CSS代码渲染到浏览器中自动补充厂商前缀,因此你不用担心自己编写的CSS代码有浏览器兼容性问题。 如: .fl…

kaggle咖啡销售分析案例侧重可视化折线图条形图扇形图柱状图

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们,令人振奋的消息来啦!本月,我们特地为大家准备了一份特别的粉丝福利!只要您轻轻一点,关注我们的公众号,就有机会抽取现金红包,让您的生活多一份惊喜与喜…

【微信公众平台】扫码登陆

文章目录 前置准备测试号接口配置 带参数二维码登陆获取access token获取Ticket拼装二维码Url编写接口返回二维码接收扫描带参数二维码事件编写登陆轮训接口测试页面 网页授权二维码登陆生成ticket生成授权地址获取QR码静态文件支持编写获取QR码的接口 接收重定向参数轮训登陆接…

游泳耳机哪个牌子好?体验与口碑兼顾的4大游泳耳机汇总!

最近的天气越来越炎热了,许多人选择游泳作为一种既能锻炼身体又能享受清凉的活动。而随着科技的发展,越来越多的运动爱好者希望在游泳时也能享受到音乐的乐趣。因此,游泳耳机应运而生,成为市场上的热门产品。然而,面对…

使用PixVerse使用指定的角色生成视频

PixVerse 是一款可以将文字描述转换为高清视频的AI视频生成工具,它还支持直接生成原神角色的专属动画视频。以下是如何使用PixVerse使用指定的角色生成视频的步骤: 1. 点击PixVerse 网址 访问以下网址:https://app.pixverse.ai/create/vide…

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中,实现了多种垃圾收集器, 包括: 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS(并发)垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低,使用较少 2.并行垃圾回收器 3.并发垃圾回…

软件估算的方法、过程、内容解读(估算指南)

4 估算方法 4.1 基于经验的方法 4.1.1 头脑风暴法 4.1.2 Delphi方法 4.1.2.1 过程图 4.1.2.2 组建评估组 4.1.2.3 系统介绍 4.1.2.4 系统分解与假设 4.1.2.5 设定偏差值 4.1.2.6 个人估计 4.1.2.7 估计结果汇总 4.1.2.8 估计差异讨论 4.1.2.9 结束 4.2 分解的方法…

Brainpan(VulnHub)

Brainpan 1、nmap 2、web渗透 随便看看 目录爆破 使用不同工具,不同字典进行爆破 9999端口分析 10000端口分析 字符串信息中,提示这个程序不能运行在DOS模式下,然后有32个A,还有一行关于复制字节到缓冲区的信息,还有一…

谈谈前端CSS盒模型

前言: 什么是CSS盒模型?盒模型的构造? 在前端开发中,CSS 盒模型是一种非常基础且核心的概念,它描述了文档中的每个元素被框架处理的方式。 ---- 打开浏览器开发者工具,查看Elements右侧下的Styles底部。 …

libVLC Ubuntu编译详解

1.简介 有时候,windows上开发不满足项目需求,需要移植到linux上,不得不自行编译libvlc,编译libvlc相对而言稍微麻烦一点。 我使用的操作系统:Ubuntu20.04 查看系统命令lsb_release -a libvlc版本: 3.0.1…

elment-plus 中 table 左对齐

elment-plus 中 table 左对齐 <el-tablev-loading"loading"class"flex-1 !h-auto":data"roleList":header-cell-style"{text-align: left }":row-style"{ height: 55px }":cell-style"{ text-align: left }"&…

Argus DBM 一款开源的数据库监控工具,无需部署Agent

开箱即用 无需部署Agent&#xff0c;开箱即用。我们使用JDBC直连您的数据库&#xff0c;输入IP端口账户密码即可。 全平台支持 Argus目前支持对Mysql, PostgreSQL, Oracle等数据库类型的监控&#xff0c;我们也会尽快适配其它数据库&#xff0c;致力于监控所有数据库。我们提…

AES 加解密(包含JS、VUE、JAVA、MySQL)工具方法

介绍 AES 是 Advanced Encryption Standard 的缩写&#xff0c;是最常见的对称加密算法。AES 在密码学中又称 Rijndael 加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES&#xff0c;已经被多方分析且广为全世界所使用。 基本原理&#…