如何实现分布式锁?
分布式锁:锁独立于每一个服务之外的锁
数据库:利用主键沖冲突控制一次只有一个线程能获取锁,非阻塞、不可重入、
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有相应的实现