乐趣区

关于分布式事务:分布式锁分析使用Redis实现分布式事务中的锁机制

分布式协调服务

  • Zookeeper 是分布式协调服务框架
  • 分布式协调技术: 次要用来解决分布式环境当中多个过程之间的同步控制, 让过程有序的去拜访某种临界资源, 避免造成 ” 脏数据 ” 的结果
  • 分布式协调技术的 外围 就是实现 分布式锁

    分布式锁

  • 分布式锁: 为了避免分布式系统中的多个过程之间互相烦扰, 须要分布式协调技术对过程进行调度, 这个分布式协调技术的外围就是实现分布式锁

    分布式锁条件

  • 在分布式系统环境下, 一个办法在同一时间只能被一个机器的一个线程执行
  • 高可用的获取锁与开释锁
  • 高性能的获取锁与开释锁
  • 具备可重入个性
  • 具备锁生效机制, 避免死锁
  • 具备非阻塞锁个性

    分布式锁的实现

  • Zookeeper
  • Redis
  • Memcached
  • Chubby

    Redis 分布式锁的实现

  • 分布式锁实现的三个外围因素: 加锁, 解锁, 锁超时
  • Redis 是单线程的

    加锁

  • 应用 setnx 命令
  • key 是锁的惟一标识, 按业务来决定命名
  • value 能够设置成任意值
  • 当一个线程执行 setnx 返回 1, 阐明 key 本来不存在, 该线程胜利失去锁. 当一个线程执行 setnx 返回 0, 阐明 key 曾经存在, 该线程抢锁失败

    解锁

  • 当失去锁的线程执行完工作, 须要开释锁, 以便其它线程能够进入, 应用 del 指令开释锁之后, 其它线程就能够继续执行 setnx 命令取得锁

    锁超时

  • 一个失去所得线程在执行工作的过程中呈现问题, 不能显式开释锁, 这些资源将永远被锁住, 造成死锁的状态
  • setnx 的 key 要设置一个超时工夫, 保障锁没有被显式开释时, 会在肯定工夫后主动开释.setnx 不反对超时参数, 须要额定的指令 expire

  • Redis 分布式锁问题:

    • 非原子性操作:

      • 解决方案: 通过应用 set 命令set(key,value,expire) 设置为原子操作
    • 误删锁:

      • 在设置锁超时的状况下, 操作没有实现, 当操作实现时,del 命令删除的是其它过程的锁
      • 解决方案: 判断是否为本过程的锁. 带着 key 和 value=threadID 线程 ID 判断是否为本过程的锁
    • 在设置锁超时的状况下, 操作没有实现

      • 解决方案: 开释锁时判断操作是否实现, 减少守护线程: 为锁超时加时, 提早开释
退出移动版