• 原理:通过 SETNXDEL 命令实现

    SETNX lock 1
    # 业务逻辑
    ...
    DEL lock
    
  • 处理业务逻辑时,可能出现异常导致删除锁失败,因此为锁添加过期时间

    SET lock 1 EX 10 NX // 设置10秒过期时间
    # 业务逻辑
    ...
    DEL lock
    
  • 线程1业务逻辑超时,导致锁被释放,线程2进场,但线程1业务逻辑处理完成时,删除了线程2的锁

为每个线程添加唯一标识

  var uuid = pid
  SET lock uuid EX 10 NX 
  # 业务逻辑
  ...
  if REDIS.GET(lock) == uuid {
  	DEL lock
  }
  • 业务逻辑处理时间超过锁时间怎么办?锁时间如何预判?

没有好的预判方法,通过守护进程,定时(通过过期时间的1/3)检测失效时间,如果即将到期则续期,Java中也可以使用已封闭好的Redissiont处理

  • Redis集群时,宕机失去锁时怎么办

使用redlock