JAVA面试题整理《微服务篇》三

分布式锁实现与优化:Redis、Zookeeper与Redlock解析
本文探讨了分布式锁的实现方式,包括利用数据库主键冲突、Zookeeper的临时节点以及Redis的setnx方法。提到了Redis分布式锁存在的问题,如不可重入性和锁自动释放可能导致的并发问题,并介绍了Redlock和Radisson作为解决方案。Redlock通过在多个Redis节点上获取锁来提高锁的可用性,确保在主从切换时的数据一致性。

如何实现分布式锁?
分布式锁:锁独立于每一个服务之外的锁

数据库:利用主键沖冲突控制一次只有一个线程能获取锁,非阻塞、不可重入、
Zookeeper分布式锁:zk通过临时节点,解决了死锁的问题,一旦客户端获取到锁之后突然挂掉( session连接断开),那么这个临时节点就会自动删除掉,其他客户端自动获取锁。临时顺序节点解决惊群效应
Redis分布式锁:setnx,单线程处理网络请求,不需要考虑并发安全性
实现方式:setnx、radisson、redlock

setnx:指定的 key 不存在时,才能操作成功,为 key 设置指定的值
设置锁:给所有服务节点设置相同的key,返回为0、则锁获取失败(防止锁被别人所释放可以设置一个线程的唯一标识)
删除锁:判断线程唯一标志,再删除

问题:
实现的Redis分布式锁,其实不具有可重入性
存在任务超时问题,锁自动释放(key过期),导致并发问题
Redis没有实现可重入性及锁续期,可以通过 radisson解决(类似AQS的实现,看门狗监听机制)

redis多节点数据同步问题:
redlock:意思的机制都只操作单节点、即使Redis通过 sentinel保证高可用,如果这个 master节点由于某些原因发生了主从切换,那么就会出现锁丢失的情况( redis同步设置可能数据丢失)。 redlock从多个节点申请锁,当一半以上节点获取成功、锁才算获取成功,redission有相应的实现
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值