分布式锁是为了解决什么问题?

首先,“分布式锁”的概念,是相对“本地锁”而言。
本地锁比如java中的synchronized 关键字这类 JDK 自带的 本地锁 ,来控制一个 JVM 进程内的多个线程对本地共享资源的访问。
同一时刻只有一个线程可以获取到本地锁访问共享资源。
分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,分布式锁 就诞生了。

分布式锁需要满足什么条件?

  • 互斥:任意一个时刻,锁只能被一个线程持有;
  • 高可用:(啥意思?)锁服务是高可用的。并且,即使客户端的释放锁的代码逻辑出现问题,锁最终一定还是会被释放,不会影响其他线程对共享资源的访问。
  • 可重入:一个节点获取了锁之后,还可以再次获取锁。(有什么用?)

如何基于 Redis 实现一个最简易的分布式锁?(没看懂)

用SETNX(SET if Not eXists)命令实现”互斥“。

SETNX lockKey uniqueValue(integer) 1SETNX lockKey uniqueValue(integer) 0

分布式锁会有不被释放的问题吗?怎么解决?

会,设置过期时间。

127.0.0.1:6379> SET lockKey uniqueValue EX 3 NXOK

lockKey:加锁的锁名;
uniqueValue:能够唯一标示锁的随机字符串;
NX:只有当 lockKey 对应的 key 值不存在的时候才能 SET 成功;
EX:过期时间设置(秒为单位)EX 3 标示这个锁有一个 3 秒的自动过期时间。与 EX 对应的是 PX(毫秒为单位),这两个都是过期时间设置。

如何实现锁的优雅续期?

对于 Java 开发的小伙伴来说,已经有了现成的解决方案:Redisson

什么是可重入锁?

可重入锁指的是在一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法即可重入 ,而无需重新获得锁。像 Java 中的 synchronized 和 ReentrantLock 都属于可重入锁。
不可重入的分布式锁基本可以满足绝大部分业务场景了,一些特殊的场景可能会需要使用可重入的分布式锁。

实际项目中,我们不需要自己手动实现,推荐使用我们上面提到的 Redisson ,其内置了多种类型的锁比如可重入锁(Reentrant Lock)