分布式锁
zk实现方式
在zk.md 中有解释
redis实现方式
- 两个项目,竞争锁,利用中间件redis。谁用谁创建,创建完释放
- setnx 存在则不set,不存在则set
- 出现问题没执行完出现异常,不del,锁永远占据
- setex (expire) 设置超时时间,超时没完成自动释放锁
- 出现setnx和expire中间出现其他程序setnx了无法expire
- Redis 2.8 版本中作者加入了 set 指令的扩展参数
- set XXXXXXX ex 5 nx
- 保证原子性

- 我用的版本是7.2.3
- 出现超时问题
- 1线程设置了超时时间但是没有完成结果释放了,线程2开始执行了,结果现在线程1,2都在执行了
- 将设置锁的时候设置一个随机数,删除的时候根据随机数删除
- 利用redission中的看门狗的功能,远离就是启动监控,如果没用被主动释放则延长加锁时间,直到主动释放或者异常断开链接,由看门狗等待设置的时间后进行释放
- 检查参数和删除不是原子的,使用lua脚本施行原子操作
- 在sental集群模式下,A申请了锁在master上,master没有将锁同步给slave,slave成为新的master,这时候B申请锁就可以申请到
- 出现异常A,B都有锁都可以执行
- 使用redlock算法
- 该算法与很多分布式算法一样,多数法人的模式,枷锁时候会同步到其他节点,超过半数成功则枷锁成功,性能会下降
