本质是如何存储/释放锁.

  • 基于数据库实现分布式锁,这里的数据库指的是关系型数据库;
    • 唯一性约束
    • 加锁: 添加记录
    • 释放: 删除记录
  • 基于缓存实现分布式锁;
    • Redis: setnx , 队列用于维护顺序
  • 基于 ZooKeeper 实现分布式锁。基于数据库实现分布式锁 (首选)
    • 解决基于分布式的问题

对比

image.png

总结

image.png

注意

1 .redis 不用通过超时来释放锁,DEL操作可以直接释放不用等到超时
2. redis 官方已经明确说明不推荐 setnx 来实现分布式锁了(https://redis.io/commands/setnx) 官方给出了 the Redlock algorithm 各语言的实现版本是来实现分布式锁的机制,比如JAVA的实现版本(https://github.com/redisson/redisson) 所以从可靠性来讲并不比zk的方案差

分布式互斥是在分布式系统中存在多个节点共享某个资源或临界区,任何时刻只允许一个进程访问资源或执行临界区,而分布式锁正好是解决分布式互斥的一种方法。