锁是多线程编程中的一个重要概念,它是保证多线程并发时顺利执行的关键。我们通常所说的“锁”是指程序中的锁,也就是单机锁,例如 Java 中的 Lock 和 ReadWriteLock 等,而所谓的分布式锁是指可以使用在多机集群环境中的锁。
我们本文的面试题是,使用 Redis 如何实现分布式锁?
## 典型回答
首先来说 Redis 作为一个独立的三方系统(通常被作为缓存中间件使用),其天生的优势就是可以作为一个分布式系统来使用,因此使用 Redis 实现的锁都是分布式锁,理解了这个概念才能看懂本文所说的内容。
分布式锁的示意图,如下所示:
使用 Redis 实现分布式锁可以通过以下两种手段来实现:
- 使用 incr 方式实现;
- 使用 setnx 方式实现。
有人可能会奇怪 incr 不是用来实现数值 +1 操作的吗?用它怎么来实现分布式锁呢?
我们下来看 incr 的使用示例:
127.0.0.1:6379> set key 1 # 新增一个键值
OK
127.0.0.1:6379> incr key # 执行加 1 操作
(integer) 2
127.0.0.1:6379> get key # 查询键值
"2"
从以上代码可以看出使用 incr 可以实现数值 +1,那怎么用它来实现分布式锁呢?
其实原理也很简单,我们每次的加锁(上锁)都使用 incr 命令,如果执行的结果为 1 的