分布式锁实现方案

76 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

目前分布式锁的实现方案主要包括三种:

  • 基于数据库
  • 基于缓存
  • 基于Zookeeper

数据库实现分布式锁

  • 主要是利用数据库的唯一索引来实现,这刚好符合我们对锁的要求:同一时刻只能允许一个竞争者获取锁。加锁时我们在数据库中插入一条锁记录,利用业务id进行防重。唯一索引天然具有排他性防重业务id需要我们自己来定义。

  • 基于Zookeeper:Zookeeper一般用作配置中心,其实现分布式锁的原理和Redis类似,我们在Zookeeper中创建瞬时节点,利用节点不能重复创建的特性来保证排他性。同时zk的版本机制极大的提高了我们对线程的唤醒效率

  • 基于缓存实现分布式锁:理论上来说使用缓存来实现分布式锁的效率最高,加锁速度最快,因为Redis几乎都是纯内存操作,而基于数据库的方案和基于Zookeeper的方案都会涉及到磁盘文件IO,效率相对低下。一般使用Redis来实现分布式锁都是利用Redis的SETNX key value这个命令,只有当key不存在时才会执行成功,如果key已经存在则命令执行失败。

个人理解

  • 分布式锁实际上和我们单机锁逻辑是一样的。只不过分布式的锁依据依赖于第三方。这样就能保证我们多机下的有序性了。但是分布式下带来了的挑战就是我们如果能过准确的做到消息互通的及时性与准确性呢?
  • 同时因为需要第三方,如果我们第三方网络发生延迟或者说数据出现不一致的时候我们该如何了呢?这就是我们分布式网络中的CAP原则。总之分分合合的世界里合则生,分则死