Skip to content

面试速答(先看这里)

**一句话结论:**一个分布式锁,最基本的要求,就是要具备互斥性,同一时间只能有一个线程获取到锁。

60秒标准回答:

想要实现一个分布式锁,一般需要考虑哪些问题?一般来说应该从以下几个方面来考虑

一个分布式锁,最基本的要求,就是要具备互斥性,同一时间只能有一个线程获取到锁。否则就会出现并发问题

在分布式场景中,想要实现一个分布式锁,必须要依赖一个第三方的分布式组件,比如数据库、Redis或者Zookeeper。借助自带的锁机制、单线程、互斥性等特点来实现互斥性

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**想要实现一个分布式锁,一般需要考虑哪些问题?
  • **要点2:**在分布式场景中,想要实现一个分布式锁,必须要依赖一个第三方的分布式组件,比如数据库、Redis或者Zookeeper。
  • **要点3:**锁的死锁问题使我们不得不考虑的。
  • **要点4:**根据加锁失败后是否阻塞持续自旋加锁,分布式锁可以分为阻塞锁和非阻塞锁。
  • **要点5:**而且在有些业务场景中,对是否可以重入也会有一些要求。

**记忆锚点:**Redis → 一个分布式锁 → 的分布式锁 → 个第三方的分布式组件 → 会设置一定的超时机制 → Zookeeper

关键取舍:

  • 因为在用分布式锁的场景一般并发较高,而如果分布式锁自身的性能差的话,对业务来说也是不可接受的。
  • 加锁性能是很重要的,尤其是分布式锁。
  • 所以好的性能更重要。

易错提醒:

  • 根据加锁失败后是否阻塞持续自旋加锁,分布式锁可以分为阻塞锁和非阻塞锁。

加分表达:

  • 在分布式场景中,想要实现一个分布式锁,必须要依赖一个第三方的分布式组件,比如数据库、Redis或者Zookeeper。
  • 而且在有些业务场景中,对是否可以重入也会有一些要求。

追问准备:

  • 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「一个分布式锁」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「的分布式锁」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

想要实现一个分布式锁,一般需要考虑哪些问题?一般来说应该从以下几个方面来考虑:

互斥性 ​

一个分布式锁,最基本的要求,就是要具备互斥性,同一时间只能有一个线程获取到锁。否则就会出现并发问题。

在分布式场景中,想要实现一个分布式锁,必须要依赖一个第三方的分布式组件,比如数据库、Redis或者Zookeeper。借助自带的锁机制、单线程、互斥性等特点来实现互斥性。

避免死锁 ​

锁的死锁问题使我们不得不考虑的。尤其在在分布式环境中,由于网络延迟、节点故障等原因,会出现死锁的概率就会更高。所以我们在设计分布式锁的时候,一般都会设置一定的超时机制和死锁检测策略。

阻塞&非阻塞 ​

根据加锁失败后是否阻塞持续自旋加锁,分布式锁可以分为阻塞锁和非阻塞锁。一般来说非阻塞锁用的比较多。像我们常用的Redis的分布式锁就是非阻塞锁。而使用数据库悲观锁 for update实现的可能就是个阻塞锁,

这个要根据业务的具体情况来做选择和设计

可重入 ​

一个线程,拿到锁之后,是否可以在未释放时重新获得锁。这就是可重入的特性了。可重入的锁不仅可以提升加锁效率,也能降低死锁的概率。

而且在有些业务场景中,对是否可以重入也会有一些要求。所以这个也是需要重点考量的。

锁的性能 ​

加锁性能是很重要的,尤其是分布式锁。因为在用分布式锁的场景一般并发较高,而如果分布式锁自身的性能差的话,对业务来说也是不可接受的。所以好的性能更重要。

可靠性 ​

一个分布式锁是否可靠,很重要,一旦他不可靠了,就可能会出现重复加锁导致并发问题。这也是为什么Redis的分布式锁从SetNX到Redisson再到RedLock的重要原因。

其他 ​

实现一个分布式锁,除了上面这些,还有一些其他的东西需要考虑,比如实现的复杂度、易用性等,都很重要的。