分布式锁场景

  1. 分布式系统
  2. 操作共享资源,库里唯一的用户数据
  3. 同步访问,多个进程同时操作共享资源

分布式锁方案

  1. setnx key value expire key 10s
    watchdog 防止key过期
    • 加锁没释放 delete key
    • 加锁没来得及执行释放锁,程序挂了。使用key的过期机制
    • 删除的锁一定要是自己加的
  2. 基于zookeeper 临时节点,顺序节点

zookeeper分布式锁实现原理

  • 顺序节点特性:
    zk集群按照发起顺序创建节点,最后一位依次递增,节点名由zk完成
  • 临时节点特性:
    临时节点由客户端创建,当客户端与zk集群断开连接时,节点被自动删除

根据zk中节点是否存在,可以作为分布式锁的锁状态:

  1. C1用create()创建临时顺序节点
  2. C1 getchildren()获取所有已经创建节点
  3. 判断自己序号是否排第一,若是则获得锁 不是监听前一节点,监听节点变更时等待重复2 3

zk和redis做分布式锁区别

redis:

  • 最终一致性 有延迟,强一致性要求中使用zk
  • 响应时间最低

zk:

  • 由网络问题,客户端掉线 节点消失,锁被错误释放
  • 较好的稳定性