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 构建