网站设计哪家便宜,网站优化电话,天津seo公司,企业只有建立自己的网站平台1. 什么是分布式锁#xff1f;
在分布式系统中#xff0c;也会涉及到多个节点访问同一个公共资源的情况#xff0c;和 Java 中多线程的锁不一样#xff0c;由于分布式系统中涉及到多个进程多个主机#xff0c;所以说 Java 中 synchronized 就不合适了。
2. 分布式锁的简…1. 什么是分布式锁
在分布式系统中也会涉及到多个节点访问同一个公共资源的情况和 Java 中多线程的锁不一样由于分布式系统中涉及到多个进程多个主机所以说 Java 中 synchronized 就不合适了。
2. 分布式锁的简单实现
思路使用一个公共的服务器来记录加锁的状态
可以用过 Redis 来记录一个键值来表示锁的状态当加锁的时候就设置该键值对释放锁时就删除不过此时就有了一个问题如果说服务器 1 加锁之后宕机了那么释放锁的操作就无法执行其他服务器就不能获取锁所以说可以通过set ex nx的方式再设置一个过期时间键值对的设置也是有讲究的如果设置为一个简单的 “111”那么其他服务器也能释放锁此时可以引入一个校验 id比如设置为服务器编号通过判断是否是加锁的那台服务器来释放锁。
此时还有一个问题校验 id 时需要通过 get 操作获取值然后通过 del 操作删除锁这样的操作并不是原子的那么就会导致一台服务器加锁之后其中的两个线程进行解锁操作当线程 A 解锁完成后线程 B 的 del 操作前的这段时间服务器 2 加锁之后就被释放了 可以把释放锁的逻辑写在 Lua 脚本中执行Lua 脚本在 Redis 中的执行是原子的
3. 引入“看门狗”
上述的方案中还存在一个问题由于把 key 的过期时间设置为了一个定值如果设置的过小那么任务还没执行完锁自动释放了这就需要引入看门狗机制watch dog 本质上是加锁的服务器上的一个单独的线程不是 Redis 服务器的通过这个线程来对锁过期时间进行续约这样就不用担心提前失效的问题了即使服务器宕机了watch dog 线程也就没了无法续约到了一定时间自然就释放锁了
4. 引入 Redlock
在实际中Redis 一般是集群部署的就可能出现下面这种情况
服务器 1 向 master 节点进行加锁操作设置 key 的过程刚刚完成master 节点就宕机了slave 节点升级为了新的 master 节点但是原来主节点设置的锁并没有来得及同步过来此时就相当于服务器 1 的锁白加了。 可以引入多组 Redis 节点每组 Redis 节点都包含一个主节点和若干从节点并且组和组之间的数据都是一致的加锁的时候按照一定的顺序写多个 master 节点并且设定操作的超时时间如果超过这个时间还没有加锁成功就认为该节点加锁失败了根据少数服从多数的原则如果超过一半的主节点都加锁失败才认为本次加锁失败解锁也是这样的操作。