[Java复习] 分布式锁 Zookeeper Redis
一般实现分布式锁都有哪些方式?
使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?
这两种分布式锁的实现方式哪种效率比较高?
1. Zookeeper 都有哪些使用场景?
四大场景:
- 分布式协调
- 分布式锁
- 元数据/配置信息管理
- HA高可用性
分布式协调:
场景:A系统发请求到MQ,B系统消费之后,A系统怎么知道B系统的处理结果?
解决方案:用Zookeeper实现分布式系统之间协调工作。
A系统发请求之后,在Zookeeper上对某个节点的值注册监听器,一旦B系统处理完值后就修改Zookeeper的节点值,A系统就立马收到通知。
ZK分布式锁:
场景:对某一个数据需要2个修改操作,两台机器同时收到请求,但需要一台执行后另一台才能执行。
解决方案:使用ZK分布式锁。机器A收到请求后,在ZK创建一个znode,接着执行操作;
另外一个机器B也尝试创建znode,发现创建不了,注册这个锁的监听器,只能等待机器A执行完成之后再执行。
ZK 发现机器A释放锁后,ZK会通知机器B, 这样B可以获取锁。
ZK的实现:
zookeeper.create(path…)尝试创建临时节点,创建成功就获取锁;
如果被别的客户端获取了,就注册一个监听器监听这个锁,可以尝试用CountDownLatch await或者别的方式等待,或者不断循环查询,
如果监听这个节点被释放,就把latch countDown或者把等待release,重新尝试获取锁。
也可以基于zookeeper的临时顺序节点来实现,不用while true的循环。多人竞争一把锁时,会排队,后面每个排队的都去监听排在自己前面那个人创建的znode。
元数据/配置信息管理:
ZK可以作为很多系统的配置信息管理,比如Kafka, Storm,Dubbo。
HA高可用:
大数据系统基于ZK开发HA高可用机制,比如Hadoop,HDFS,Yarm。一个进程/服务做主备两个,主挂了立马通过Zookeeper感知切换到备用进程或服务。
Redis分布式锁:
官方叫RedLock,Redis官方支持的分布式锁算法。
分布式锁3个重要考察点:
- 互斥
- 不能死锁
- 容错
1. 普通的加锁方式(setnx):
SET Key(orderId:1lock) Value(随机值) NX PX 30000
NX:表示只有 key 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 nil)
PX 30000:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。
释放锁就是删除 key ,但是一般可以用 lua 脚本删除,判断 value 一样才删除:
删除锁的时候,找到 key 对应的 value,跟自己传过去的 value 做比较,如果是一样的才删除。
if redis.call("get",KEYS[]) == ARGV[] then
return redis.call("del",KEYS[])
else
return 0
end
为什么要用这种方式来删除?
比如A获取锁后,阻塞时间超过30s,锁自动释放了。
B已经获取锁了,要是这个时候直接删除Key(已经是别人加的锁)的话就会出现问题,所有加随机值加上lua脚本(原子操作)来释放锁。
这个方案有单点故障风险。如果redis普通主从,如果主从异步复制,主节点挂了, key失效,key还没有同步到从节点,这时候从节点切换为主节点,
其他人就可以set key,从而拿到锁,分布式锁机制失效。
2. RedLock算法
场景:有redis cluster,5个实例。对集群上锁,在大多数节点上锁成功,就算成功。
上锁步骤:
获取时间戳,轮流在每个主节点上锁,过期时间较短,比如5个节点,要求3个节点(n/2 + 1); 创建锁的时间小于超时时间,表示创建成功;
要是锁创建失败,就依次删除之前建立的锁。
PS:实现比较复杂,在国外还有争议,算法的健壮性可疑。
Redis 分布式锁和ZK 分布式锁的对比
- redis 分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。RedLock算法还不完善。
- zk 分布式锁,获取不到锁,注册监听器即可,不需要不断主动尝试获取锁,性能开销较小。
总结,zk 的分布式锁比 redis 的分布式锁牢靠、而且模型简单易用。
参考资料:
《互联网Java进阶面试训练营》的笔记 -- 中华石杉
[Java复习] 分布式锁 Zookeeper Redis的更多相关文章
- 分布式锁用Redis还是ZooKeeper?(转载)
文章系网络转载,侵删. 来源:https://zhuanlan.zhihu.com/p/73807097 为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场景. 图片来自 Pexels 为什么 ...
- 分布式锁用Redis与Zookeeper的使用
为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会 ...
- 分布式锁tair redis zookeeper,安全性
tair分布式锁实现:https://yq.aliyun.com/articles/58928 redis分布式锁:https://www.cnblogs.com/jianwei-dai/p/6137 ...
- Java分布式:分布式锁之Redis实现
Java分布式:分布式锁之Redis实现 分布式锁系列教程重点分享锁实现原理 Redis锁原理 核心命令 Redis分布式锁的原理是基于其SETNX命令,我们来看SETNX的解释. 实现过程 使用SE ...
- 分布式锁(Redis实现)
1.分布式锁解决方案 1.采用数据库 不建议 性能不好 jdbc 2.基于Redis实现分布式锁(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已经存在了,返回 ...
- 分布式锁(redis/mysql)
单台机器所能承载的量是有限的,用户的量级上万,基本上服务都会做分布式集群部署.很多时候,会遇到对同一资源的方法.这时候就需要锁,如果是单机版的,可以利用java等语言自带的并发同步处理.如果是多台机器 ...
- SpringBoot集成Redis分布式锁以及Redis缓存
https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...
- 解析分布式锁之Redis实现(二)
摘要:在前文中提及了实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,本文主要阐述基于Redis的分布式锁,分布式架构设计如今在企业中被大量的应用,而在不同的分布 ...
- 从分布式锁来看redis和zookpeer!
从分布式锁来看redis和zookpeer! 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说, ...
随机推荐
- Ubuntu16.04, CUDA8 CUDNN6 下安装 Tensorflow-gpu, Keras, Pytorch, fastai
如何访问tensorflow官方网站 tensorflow官方网站变为:https://tensorflow.google.cn/ 安装深度学习框架 0. ubuntu查看CUDA和cuDNN版本 C ...
- 软件测试_Loadrunner_性能测试_脚本优化_关联_手动关联
在写文章之前写一下自己的心路历程,录制脚本主要是上传图片并返回查询结果的过程.录制完脚本后发现函数中URl地址中有图片ID后台随机生成的32位随机数,并且每次上传图片id都会变化.我就上网搜索了一些解 ...
- pandas 4
参考资料:https://mp.weixin.qq.com/s/QnxaOrvlWJn6Dr42Ic1CcQ 1 #只选取housing,loan,contac和poutcometest_data[ ...
- Win10开启FTP与配置——(亲测完整无错版)
#1.控制面板>程序>启用或关闭Windows功能>…(控制面板可在 桌面右键>个性化>主题>桌面图标设置>勾选控制面板>确定) #2.小娜搜索IIS打 ...
- VMWARE许可文件
VMware 14 Pro 永久许可证激活密钥FF31K-AHZD1-H8ETZ-8WWEZ-WUUVACV7T2-6WY5Q-48EWP-ZXY7X-QGUWD
- vscode 输出面板字符编码问题
默认的输出中文会显示成乱码,需要在vscode内部的终端中输入 chcp 65001 缺点是需要每次打开vscode进行激活,另一种方式是在vscode的首选项中进行配置: "termina ...
- php MySQL 删除数据表
MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...
- mongodb 高级聚合查询
mongodb高级聚合查询 在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysq ...
- php利用webuploader实现超大文件分片上传、断点续传
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...
- 在其他博客里看到的比较好的map用法,进行储存啦啦~ x
1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...