基于redis和zookeeper的分布式锁实现方式

Redis、Zookeeper实现分布式锁——原理与实践 Redis与分布式锁的问题已经是老生常谈了,本文尝试总结一些Redis、Zookeeper实现分布式锁的常用方案,并提供一些比较好的实践思路(基于Java)。不足之处,欢迎探讨。方案1:使用SET命令。 假如当前客户端需要占有一个user_lock的锁,它首次需要生成一个token(一个随机字符串,例如uiid),并使用该token进行加锁。加锁命令: EX:该键会在指定时间后指定过期,单位为秒,类似参数还有PX、EXAT、PXAT。 NX:只有该键不存在的时候才会设置key的值。如果user_lock 阅读详情

先来说说什么是分布式锁,简单来说,分布式锁就是在分布式并发场景中,能够实现多节点的代码同步的一种机制。从实现角度来看,主要有两种方式:基于redis的方式和基于zookeeper的方式,下面分别简单介绍下这两种方式:

一、基于redis的分布式锁实现

1.获取锁

redis是一种key-value形式的NOSQL数据库,常用于作服务器的缓存。从redis v2.6.12开始,set命令开始变成如下格式:

SET key value [EX seconds] [PX milliseconds] [NX|XX]

除key和value外,EX是超时时间,NX表示只有在key不存在的时候才会设置key的值,而XX表示在key存在的时间才会设置key的值。NX机制就是基于redis分布式锁的核心。能够解决以下问题:

1)节点1获取key,并且设置超时时间后,还没来得及释放就挂掉了——这里EX超时时间会发挥作用,超时后自动释放锁。

2)刚获取到锁,还没来得及设置超时时间就挂了——这里设置key和设置超时时间是原子操作,如果出现这种情况,会返回0,即获取不到锁。

2.释放锁

为了解决非原子操作带来的问题,常采用lua脚本实现。lua脚本的操作会被认为是原子性的,类似于事务。伪代码如下:

二、基于zookeeper的分布式锁实现

zookeeper是一种分布式协调服务,其中每个节点称为znode,并有自己独立的路径。 znode有四种类型:

持久节点:默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在 。

持久节点顺序节点:所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号:

临时节点:和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除:

临时顺序节点:结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与zookeeper断开连接后,临时节点会被删除。

下面看看是怎样基于上面的四类节点实现分布式锁的。

1.获取锁

1)在Zookeeper当中创建一个持久节,当第一个客户端Client1想要获得锁时,需要在这个节点下面创建一个临时顺序节点。

2)Client1查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点是不是顺序最靠前的一个。如果是第一个节点,则成功获得锁。

3)如果再有一个客户端 Client2 前来获取锁,则在持久节点下面再创建一个临时顺序节点Lock2。

4)Client2查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点Lock2是不是顺序最靠前的一个,结果发现节点Lock2并不是最小的。

于是,Client2向排序仅比它靠前的节点Lock1注册Watcher,用于监听Lock1节点是否存在。这意味着Client2抢锁失败,进入了等待状态。

5)如果又有一个客户端Client3前来获取锁,则在持久节点下载再创建一个临时顺序节点Lock3。

Client3查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点Lock3是不是顺序最靠前的一个,结果同样发现节点Lock3并不是最小的。

于是,Client3向排序仅比它靠前的节点Lock2注册Watcher,用于监听Lock2节点是否存在。这意味着Client3同样抢锁失败,进入了等待状态。

2.释放锁

释放锁就比较简单了,因为前面创建的临时顺序节点,所以在出现下面两种情况时,都会自动释放锁:

1)任务完成后,Client会释放锁。

2)任务没完成,Client就崩溃了,也会自动释放锁。

喜欢小编轻轻点个关注吧!

华为OD机试真题 新系统 2026-04-19 Java&Go 实现【分辨率排序】 华为OD机试真题 新系统 2026-04-19 Python&JS 实现【分辨率排序】 阅读详情

相关推荐

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 556

Redis与ZooKeeper实现分布式锁

使用Jedis、RedisTemplate、Redisson、ZooKeeper等技术实现分布式锁。

积跬步,至千里。 670

双硬盘下Ubuntu 16.04与Win10双系统的安装

之前写过一个双系统安装过程,今天再次整理的原因是想重点强调双硬盘的区别。标红的一定要注意看,那就是我自己一步一步踏出来的坑啊...   基础步骤就不再重复,重点讲区别,需要看详细步骤的童鞋(或者你只有一个硬盘)请看我上一篇博客https://blog.youkuaiyun.com/weixin_40308540/article/details/80157444   区别:双硬盘和单硬盘的区别是什么呢?...

不吃包子 1125

分布式锁之 redis分布式锁和zookeeper分布式锁的实现原理 以及它们各自使用场景

分布式锁之 redis分布式锁和zookeeper分布式锁的实现原理 以及它们各自使用场景 文章目录 前言:在分布式系统的时代中,微服务、服务治理、中间件等名次已经贯穿了我们开发的各个过程,给开发者们提供了很多便捷的方式去更好的开发大型的web系统,这篇文章,主要给大家简单说一下分布式锁。 一、什么是分布式锁? 二、分布式锁给我们解决哪些问题? 三、分布式锁实现原理 redis分布式锁 --- 基于jedis实现 zookeeper分布式锁 --- 基于zkclient实现 它们的不同

weixin_44161382的博客 1580

别再只看成交量了!用通达信这个VOL监测公式,一眼识别主力吸筹与出货信号

本文详细介绍了通达信VOL监测公式的实战应用,通过彩色量柱和换手率分层技术,帮助投资者识别主力吸筹与出货信号。该公式结合动态量能标准化和多周期均线组合,提供可视化主力行为图谱,提升交易决策的准确性。

weixin_28693447的博客 664

5G中的RedCap

5G中的redcap

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 2527

【分布式锁】redis和zookeeper实现分布式锁的流程

zk实现分布式锁的流程(1)为什么用分布式锁?(2)基于redis实现分布式锁(3)基于zookeeper实现分布式锁(4)redis和zk实现分布式锁的优缺点比较 (1)为什么用分布式锁? 【超卖的情况】 例如单个服务器的电商系统,一个用户调用下单接口,要先调用检查库存的接口去检查库存。在并发的时候,会预先把商品的库存存在redis中,下单的时候会更新redis的库存。如果有两个请求同时到来,请求1执行到锁定库存,更新数据库的库存为0,但是还没执行到更新redis的库存为0。而请求2刚好执行到检查redi

weixin_44823875的博客 482

芯片散热技术突破:多尺度结构与VC集成方案解析

在半导体技术快速发展的背景下,芯片散热成为制约性能提升的关键瓶颈。传统散热技术如风冷和水冷已接近物理极限,而两相浸没式液冷技术凭借其超高传热系数成为新的解决方案。通过多尺度表面结构设计与真空腔均热板(Vapor Chamber)的集成创新,可以显著提升沸腾性能,降低沸腾起始温差(ONB)并突破临界热流密度(CHF)限制。这种技术在数据中心、高性能计算(HPC)和边缘计算等高热流密度场景中具有重要应用价值,能有效提升能效比(PUE)并降低能耗。

weixin_36288992的博客 156

分布式锁—基于Redis和ZooKeeper的实现

一 为什么要使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均衡,大致如下图: 上图可以看到,变量A存在三个服务器内存中(这个变量A主要体现是在一个类中的一个成员变量,是一个有状态的对象),如果不加任何控制的话,变量A同时都会在分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的!即使不是同时发过来,三个请

zhaisharap的专栏 2254

CelebA-HQ数据集下载【详细明了版】分辨率包括【64,128,256,512,1024】

CelebA-HQ 是在ICLR2018上,nVidia发表了一篇名为Progressive Growing of GANs for Improved Quality, Stability, and Variation的论文,文中通过训练高分辨率GAN生成了一个新的人脸数据集CelebA-HQ.CelebA是港科大汤晓鸥组收集的人脸数据集(总共200k图片),包括了人脸特征点(landmark),人脸属性(attribute)等信息,详细介绍参考链接[1]和[2]

zik的博客 1万+

【产品经理修炼之道】- 基金产品-“TA系统 ”

TA:Transfer Agent 缩写,通常称成“登记过户”。开放式基金登记过户(TA)系统是基金的登记过户系统。其功能涵盖了基金交易业务的各个环节,包括账户业务处理,如投资者开户、修改账户资料、挂失/解挂等;日常交易业务处理,如认购、申购(一般申购和定期定额)、赎回(一般赎回、指定赎回、预约赎回等)、转托管、基金转换等;特殊业务处理,如非交易过户、账户冻结/解冻等;分红业务处理,如现金分红和红利再投资。

xiaoli8748的专栏 1679

Redis和Zookeeper分布式锁的实现方式

public class Main { private static RedissonClient redissonClient; static { Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); redissonClient = Redisson.create(config); } pu

qq_43005544的博客 347

SpringBoot集成auth0-jwt插件,实现jwt的token生成、校验,用户登录验证,配置拦截器拦截请求校验token功能

该文章介绍了SpringBoot如何集成auth0-jwt插件,实现jwt的token生成、校验,用户登录验证,配置拦截器拦截请求校验token功能. JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它以JSON对象的形式存在,并使用数字签名来验证信息的完整性和真实性。JWT由三部分组成,分别是Header、Payload和Signature。

yunnuo的博客 1247

zookeeper和redis的分布式锁实现方式

1.zookeeper分布式锁 1.1分布式锁方式一: 所有实例都注册到同一个节点上去,成功的加锁,不成功的失败,当一个解锁后删除该节点,监听该节点的所有实例就会去抢锁,这就导致所有的都要去抢。 以下代码解析: package com.study.mike.zookeeper; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.c

qq_24045275的博客 305

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

分布式锁的三种实现方式, 数据库分布式锁, Redis分布式锁, Zookeeper分布式锁

各位小伙伴儿, 上篇我们介绍了Java中的7类锁, 现在还有一个重头戏, 那就是分布式锁, 我们接着上篇的标题,继续探索~ 8. 分布式锁 8.1 为什么需要分布式锁 首先我们先了解一下分布式锁的使用场景, 然后再来理解为什么需要分布式锁, 那么我们举两个例子进行阐述: 银行转账问题: A在上海,B在北京同时在建行转账给杭州C,A转账时,会修改C处服务器的表,B不能在此刻转账,同理,B转账时,A不能做处理,A,B的转账操作时同步,必须保证数据的一致性,这就需要分布式锁来进行处理. 取任务问题: 某服务提供

啊策策大数据社区 2766

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

分布式锁的原理,并基于redis,zookeeper和mysql方式实现

分布式锁的原理,并基于redis,redisson,zookeeper和mysql方式实现 一. 背景 在分布式环境下 为了解决 资源抢占问题 和 幂等性 等问题 ,单机锁已经无法解决这个问题了,所以会使用到分布式锁, 这一篇主要介绍: 利用redis实现分布式锁 (核心思想) 浅谈redisson组件实现分布式锁 基于zookeeper实现分布式锁 基于mysql的排他锁机制实现分布式锁 所以接下来的内容会比较多,而且涉及到redis, lua脚本, redisson, zk的使用,所以希望大家可以耐

言淮的博客 747

详解分布式锁三种实现方式数据库、redis、zookeeper

详解分布式锁三种实现方式数据库、redis、zookeeper

FireAny2010的专栏 2690

分布式锁的三种实现方式-数据库,redis,Zookeeper

分布式锁的三种实现方式: 1.基于数据库实现分布式锁 2.基于缓存(redis等)实现分布式锁 3.基于Zookeeper实现分布式锁 一:基于数据库实现分布式锁 1.悲观锁 利用select ...where ...forupdate 排他锁 需要注意的是,其他附加功能与实现基本一致,这里需要注意的是"wherename =lock"name字段必须走索引,否则会锁...

CoreyXuu的博客 536

分布式锁Redis、ZooKeeper 和数据库实现分布式锁的优缺点、实现方式以及适用场景

分布式锁是实现微服务协调的关键组件,需要满足互斥性、安全性、容错性等核心特性。主流方案包括基于Redis(高性能)、ZooKeeper(强一致)和数据库(简单易用)三种实现方式。Redis适合高并发场景,ZooKeeper适用于强一致性要求,数据库方案适合简单业务。选型需权衡性能与一致性,建议核心业务采用ZooKeeper,常规业务使用Redis,并配合监控和熔断机制。最佳实践包括合理控制锁粒度、设置超时时间,以及建立故障恢复机制。

weixin_49538406的博客 1685

分布式锁的三种实现方式Redis、Mysql、zookeeper/etcd(尚硅谷分布式锁配套资料)

在应用开发中,特别是web工程开发,通常都是并发编程,不是多进程就是多线程。这种场景下极易出现线程并发性安全问题,此时不得不使用锁来解决问题。在多线程高并发场景下,为了保证资源的线程安全问题,jdk为我们提供了synchronized关键字和ReentrantLock可重入锁,但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下,如何保证不同进程、不同服务、不同机器的线程安全问题,jdk并没有给我们提供既有的解决方案。此时,我们就必须借助于相关技术手动实现了。目前主流的实现有以下方式

追寻心的步伐 2569

分布式锁的三种实现方式_Redis、zookeeper实现分布式锁的三种方案

一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!后来业务发展,需要做集群,一个应用需要部署到几台机器上然...

weixin_39925031的博客 126

数据库,Redis,zookeeper三种方式实现分布式锁

原文链接:https://blog.youkuaiyun.com/xlgen157387/article/details/79036337 很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的东西也是一样的和Java多线程相关的!做好准备,马上开车! 学过Ja...

Dream_xun的专栏 337

Redis_14_三种方式实现分布式锁(MySQL、Zookeeper、Redis)

文章目录一、前言二、分布式锁2.1 为何需要分布式锁2.2 分布式锁五个特点三、Mysql分布式锁3.1 MySQL加锁与解锁3.2 锁超时问题3.3 Mysql分布式锁小结3.4 基于MySQL版本号实现的乐观锁四、ZooKeeper分布式锁4.1 ZK加锁与解锁4.2 特殊的读写锁4.3 锁超时问题4.4 ZK分布式锁小结五、Redis分布式锁5.1 Redis分布式锁简单实现5.1.1 Redis分布式锁本质5.1.2 Redis四个基础命令5.1.3 Redis实现分布式锁的两个命令5.2 Jedi

毛毛的专栏 1432

分布式锁的三种实现方式:Redis vs ZooKeeper vs ETCD

维度RedisZooKeeperETCD一致性最终一致强一致强一致性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐可靠性主从切换风险无单点故障Raft 容错复杂度低中中生态支持广泛成熟云原生领域选型建议追求极致性能选 Redis(需容忍小概率不一致)需要强一致性和公平锁选 ZooKeeper云原生体系或需要租约机制选 ETCD。

qqqqisuxkshd的博客 427

分布式锁的三种实现方式:Redis、基于数据库和Zookeeper

分布式锁的三种实现方式:Redis、基于数据库和Zookeeper。在电商系统中,如果多个用户同时购买同一商品,可能会出现超卖现象。通过使用分布式锁,可以确保在同一时间只有一个用户能够进行购买操作,从而避免库存超卖的问题。‌

凌康的博客 1105
上一篇: Kafka实践:到底该不该把不同类型的消息放在同一个主题中?
下一篇: 比拼生态和未来,Spark和Flink哪家强?
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值