👌分布式锁的特点?
实现,zookeeper 的实现。数据库的实现方案基本不常见,这种方式性能很低,还容易影响业务。redis 比较常见使用,主要是用 setnx 的特性来做。成功 set 进去,意味着上锁成功。失败意味着没有获取到锁,业务执行完成后,在通过 del 来释放锁。一般会配合看门狗机制,来做异常的续约处理。以上。
题目详细答案
分布式锁主要有三个特点,是我们要时刻进行注意的。
- 互斥性:在某一时刻,只有一个客户端可以持有锁。
- 容错性:即使某个持有锁的客户端崩溃或失去连接,锁也能够被其他客户端重新获取。
- 高可用性:锁服务需要高可用,通常需要在分布式环境中实现。
分布式锁的实现方式
基于数据库
使用数据库的SELECT … FOR UPDATE 语句或类似的行级锁机制来实现分布式锁。优点是实现简单,缺点是性能较低,依赖于数据库的高可用性。高并发情况下也会对数据库造成非常大的压力。
1 | -- 获取锁 |
基于 Redis
Redis 提供了原子操作和高性能的特性,非常适合用来实现分布式锁。通常使用SETNX命令来实现。
1 | // 获取锁 |
基于 Zookeeper
Zookeeper 提供了分布式协调服务,可以用来实现分布式锁。通过创建临时顺序节点来实现锁机制。
1 | // 创建一个临时顺序节点 |
分布式锁的使用场景
- 分布式事务:在分布式系统中,需要确保多个节点上的操作在同一事务中执行。
- 资源共享:如分布式系统中的限流、分布式任务调度等场景。
- 数据一致性:在多个节点并发访问同一资源时,确保数据一致性。
分布式锁的常见常见问题
- 死锁:如果某个节点在持有锁期间崩溃或失去连接,可能会导致其他节点无法获取锁。
- 性能:分布式锁的实现需要考虑性能问题,尤其是在高并发场景下。
- 可靠性:锁服务需要高可用,通常需要在分布式环境中实现。
分布式锁的改进
- 锁过期时间:设置锁的过期时间,避免死锁问题。
- 租约机制:使用租约机制,定期续约锁,确保锁在持有期间不会被其他节点获取。
- 锁竞争优化:使用合适的锁竞争算法,减少锁竞争的开销。