Skip to content

分布式锁 ​

zk实现方式 ​

在zk.md 中有解释

redis实现方式 ​

  1. 两个项目,竞争锁,利用中间件redis。谁用谁创建,创建完释放
  2. setnx 存在则不set,不存在则set
    1. 出现问题没执行完出现异常,不del,锁永远占据
  3. setex (expire) 设置超时时间,超时没完成自动释放锁
    1. 出现setnx和expire中间出现其他程序setnx了无法expire
  4. Redis 2.8 版本中作者加入了 set 指令的扩展参数
    1. set XXXXXXX ex 5 nx
    2. 保证原子性
    3. 我用的版本是7.2.3
  5. 出现超时问题
    1. 1线程设置了超时时间但是没有完成结果释放了,线程2开始执行了,结果现在线程1,2都在执行了
  6. 将设置锁的时候设置一个随机数,删除的时候根据随机数删除
    1. 利用redission中的看门狗的功能,远离就是启动监控,如果没用被主动释放则延长加锁时间,直到主动释放或者异常断开链接,由看门狗等待设置的时间后进行释放
    2. 检查参数和删除不是原子的,使用lua脚本施行原子操作
  7. 在sental集群模式下,A申请了锁在master上,master没有将锁同步给slave,slave成为新的master,这时候B申请锁就可以申请到
    1. 出现异常A,B都有锁都可以执行
    2. 使用redlock算法
      1. 该算法与很多分布式算法一样,多数法人的模式,枷锁时候会同步到其他节点,超过半数成功则枷锁成功,性能会下降

基于 VitePress 构建