资料下载网站建设,郑州专业网站设计,网页开发工具怎么打开,莱芜论坛招工参考链接 文章目录分布式锁的作用分布式锁应该具有的条件实现1 基于数据库实现2 基于 Redis实现3 基于 ZooKeeper分布式锁的作用 分布式锁是一种 跨机器的互斥机制 来控制 共享资源的访问 具体地#xff0c;为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执…参考链接
文章目录分布式锁的作用分布式锁应该具有的条件实现1 基于数据库实现2 基于 Redis实现3 基于 ZooKeeper分布式锁的作用 分布式锁是一种 跨机器的互斥机制 来控制 共享资源的访问 具体地为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行在单机部署的情况下可以使用并发处理相关的功能进行互斥控制。随着业务发展单机部署的系统演化成分布式集群系统后由于分布式系统多线程、多进程并且 分布在不同机器上使原单机部署情况下的并发控制锁策略失效需要分布式锁解决此问题
分布式锁应该具有的条件
在分布式系统环境下一个方法资源在同一时间只能被一个机器的一个线程执行访问高可用的获取锁与释放锁高性能的获取锁与释放锁具备可重入特性具备锁失效机制防止死锁
实现1 基于数据库 核心思想 在数据库中创建一个表表中包含方法名等字段并在该字段上创建唯一索引想要执行某个方法就使用这个方法名向表中插入数据成功插入则获取锁执行完成后删除对应的行数据释放锁 存在弊端 数据库的可用性和性能将直接影响分布式锁的可用性及性能不具备可重入的特性因为同一个线程在释放锁之前行数据一直存在无法再次成功插入数据。改进方案是在表中新增一列用于记录当前获取到锁的机器和线程信息在再次获取锁的时候先查询表中机器和线程信息是否和当前机器和线程相同若相同则直接获取锁没有锁失效机制有可能出现成功插入数据后服务器宕机对应的数据没有被删除当服务恢复后一直获取不到锁。改进方案是在表中新增一列用于记录失效时间并且需要有定时任务清除这些失效的数据
实现2 基于 Redis
使用命令
命令作用setnx key valkey 不存在时插入(key, val)返回1否则不插入返回0expire key timeout设置 key 的过期时间单位为秒delete key删除 key
实现 获取锁的时候使用 setnx 加锁并使用 expire 命令为锁添加一个超时时间超过该时间则自动释放锁锁的 value 值为一个随机生成的UUID用于锁的释放给获取锁的线程设置一个 获取的超时时间若超过这个时间则放弃获取锁防止线程持续尝试获取锁释放锁的时候通过UUID判断是不是该锁若是该锁则执行delete进行锁释放
实现3 基于 ZooKeeper ZooKeeper 是一个为分布式应用提供一致性服务的开源组件内部是一个分层的文件系统目录树结构规定同一个目录下只能有一个唯一文件名 实现 创建一个目录 mylock线程A想要获取锁在 mylock 目录下创建临时顺序节点获取 mylock 目录下所有的子节点然后获取比自己小的兄弟节点如果不存在则说明当前线程顺序号最小获得锁线程B获取所有节点判断自己不是最小节点设置监听比自己次小的节点线程A处理完删除自己的节点线程B监听到变更事件判断自己是不是最小的节点如果是则获得锁