免费网站建设官网,项目建设表态发言,wordpress安卓版5,口碑营销的主要手段有哪些1. 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候#xff0c;大家往往采用Synchronized#xff08;同步#xff09;或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中#xff0c;就需要一种更加高级的锁机制来处理跨机器的进…1. 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候大家往往采用Synchronized同步或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题这种跨机器的锁就是分布式锁。
2. 分布式锁的主流方案
基于数据库的分布式锁这种方案使用数据库的事务和锁机制来实现分布式锁。虽然在某些场景下可以实现简单的分布式锁但由于数据库操作的性能相对较低并且可能面临锁表的风险所以一般不是首选方案。基于Redis的分布式锁Redis分布式锁是一种常见且成熟的方案适用于高并发、性能要求高且可靠性问题可以通过其他方案弥补的场景。Redis提供了高效的内存存储和原子操作可以快速获取和释放锁。它在大规模的分布式系统中得到广泛应用。基于ZooKeeper的分布式锁这种方案适用于对高可靠性和一致性要求较高而并发量不是太高的场景。由于ZooKeeper的选举机制和强一致性保证它可以处理更复杂的分布式锁场景但相对于Redis而言性能可能较低。
2.1 基于数据库实现分布式锁设计思路 我们可以利用数据库的唯一索引来实现唯一索引天然具有排他性。设计思路如下图所示 这种基于数据库的分布式锁会有什么问题呢 很明显容易出现死锁的问题。基于数据库设计分布式锁在当下不是首选方案不在过多赘述大家明白其中设计思想即可。
2.2 基于redis实现分布式锁设计思路 基于redis设计的分布式锁设计是利用了其SETNX的特性其是set If not exist的简写。意思就是当 key 不存在时设置 key 的值存在时什么都不做。以下是一个基于redis设计分布式锁的一个基础方案。 上述方案从技术的角度看setnx 占锁成功但业务代码出现异常或者服务器宕机没有执行删除锁的逻辑就会造成死锁。 上述是基本方案之所以称之为基本方案因为里面还是会有很多问题比如没有来得及释放锁导致死锁等待抢锁的线程太多当当前锁释放后等待的线程全都去抢占改锁出现的羊群效应总之值得优化的地方还很多本文中不在过多赘述大家体会其中的设计思想后续会出redis设计分布式锁的详细文章。
2.3 基于zookeeper实现分布式锁
2.3.1 青铜方案
使用临时 znode 来表示获取锁的请求创建 znode成功的用户拿到锁。 想一想上述设计存在什么问题 如果所有的锁请求者都 监听 锁持有者当代表锁持有者的 znode 被删除以后所有的锁请求者都会通知到都会竞争同一个资源但是只有一个锁请求者能拿到锁。这就是羊群效应。
2.3.2 白银方案 我们想一下青铜方案的问题就是羊群效应那么在并发编程中是如何处理这种羊群效应的呢并发编程中当资源被占用时其他线程都进入阻塞队列资源被释放后阻塞队列中的一个线程出队进行获取资源。同理我们想一想如果等待监听的线程在一个队列里面遵循先进先出的规则我们就可以实现一把公平分布式锁的实现 zookeeper的临时有序znode就是一个天然的队列我们可以利用这个特性使用临时有序znode来表示获取锁的请求线程创建最小后缀数字 znode 的用户成功拿到锁。设计思路如下 2.3.1 zookeeper之Curator 可重入分布式锁 上述我们讨论了一些利用zookeeper节点特性设计分布式锁的一些方案但在实际的开发中如果需要使用到分布式锁不建议去自己“重复造轮子”建议直接使用Curator客户端中的各种官方实现的分布式锁例如其中的InterProcessMutex可重入锁。 接下来我们一起来看一下Curator是如何实现分布式锁的。
3. 总结
内容完善中~