徐州网站建设 网站制作,创新驱动发展战略方针,学院网站建设的作用,建什么网站赚钱Redis实现分布式锁之----超时和失效#xff08;非原子性#xff09;问题----解决方案
超时和失效#xff08;非原子性#xff09;问题
原子性问题#xff1a;上锁时存入线程名称#xff0c;删除时要先判断锁内的名称是不是自己的#xff0c;是再删除#xff0c;但是后…Redis实现分布式锁之----超时和失效非原子性问题----解决方案
超时和失效非原子性问题
原子性问题上锁时存入线程名称删除时要先判断锁内的名称是不是自己的是再删除但是后面的判断和删除非原子性会有并发安全问题。 不可重入问题一个线程只能获取一次锁之后就无法再获取了就是不可重入 失败重试问题synchronized获取锁失败会阻塞当前使用redissetnx失败就返回了 一致性问题Redis主从集群主节点set锁之后从节点还没同步时主节点宕机从节点变为主节点这样其他线程也可以获取锁
解决方案
LUA脚本使用LUA脚本可以把多条命令作为一条命令执行使其具有原子性 Watch Dog看门狗机制会一直查看锁的过期时间任务只要没执行完就会再重置锁的时间 HASH重入次数synchronized可重入是内部记录了锁名称和进入锁的次数Redis使用hash结构可以实现 pub sub解决失败重试获取锁失败将锁放入失败队列获取锁成功通知失败队列让其再去获取锁 RedLockRedis提供的解决分布式数据一致性问题的算法.