GO 基于Redis的分布式锁

41 阅读1分钟

分布式锁应具备性质:

  •  独占性:对于同一把锁,在同一时刻只能被一个取锁方占有,这是作为“锁”工具最基础的一项性质
  • 健壮性:即不能产生死锁(dead lock). 假如某个占有锁的使用方因为宕机而无法主动执行解锁动作,锁也应该能够被正常传承下去,被其他使用方所延续使用
  • 对称性:加锁和解锁的使用方必须为同一身份. 不允许非法释放他人持有的分布式锁
  • 高可用:当提供分布式锁服务的基础组件中存在少量节点发生故障时,不应该影响到分布式锁服务的稳定性

分布式锁根据其实现模型,可以被划分为两大类:

  •  主动轮询型(redis,mysql):该模型类似于单机锁中的主动轮询 + cas 乐观锁模型,取锁方会持续对分布式锁发出尝试获取动作,如果锁已被占用则会不断发起重试,直到取锁成功为止
  •  watch 回调型(etcd,zookeeper):在取锁方发现锁已被他人占用时,会创建 watcher 监视器订阅锁的释放事件,随后不再发起主动取锁的尝试;当锁被释放后,取锁方能通过之前创建的 watcher 感知到这一变化,然后再重新发起取锁的尝试动作