在一个分布式系统中,当一个线程去读取数据并修改的时候,
因为读取和更新保存不是一个原子操作,在并发时就很容易遇到并发问题,进而导致数据的不正确
一般锁实现方式
- 使用 MySQL:
这种方式是通过在数据库中创建一个唯一索引的表,然后通过插入一条数据来获取锁,
如果插入成功则获取锁成功,否则获取锁失败。释放锁的操作就是删除这条数据。
这种方式的优点是实现简单,缺点是性能较低,因为涉及到数据库的操作。
- 使用 ZooKeeper:
ZooKeeper 提供了一个原生的分布式锁实现。其基本思想是创建一个临时有序节点,
然后判断自己是否是所有子节点中序号最小的,如果是则获取锁成功,
否则监听比自己序号小的节点,当该节点删除时再次尝试获取锁。
这种方式的优点是能够保证公平性,缺点是实现较为复杂。
- 使用 Redis:
这种方式是通过 Redis 的 SETNX 命令来实现的,这个命令可以在键不存在时设置值,
如果键已存在则不做任何操作。通过这个原子操作,我们可以实现在多个节点之间的互斥访问。
这种方式的优点是性能高,实现简单,缺点是需要处理锁的超时和续期问题。
存在的问题
- 锁超时
- 锁续期
- 误删除
- 脑裂问题与Redlock
版本比对

