如何实现分布式锁?
分布式锁:锁独立于每一个服务之外的锁
数据库:利用主键沖冲突控制一次只有一个线程能获取锁,非阻塞、不可重入、
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有相应的实现
分布式锁实现与优化:Redis、Zookeeper与Redlock解析
本文探讨了分布式锁的实现方式,包括利用数据库主键冲突、Zookeeper的临时节点以及Redis的setnx方法。提到了Redis分布式锁存在的问题,如不可重入性和锁自动释放可能导致的并发问题,并介绍了Redlock和Radisson作为解决方案。Redlock通过在多个Redis节点上获取锁来提高锁的可用性,确保在主从切换时的数据一致性。
322

被折叠的 条评论
为什么被折叠?



