分布式锁是由共享存储系统维护的变量,多个客户端可以向共享存储系统发送命令进行加
锁或释放锁操作。Redis 作为一个共享存储系统,可以用来实现分布式锁。
在基于单个 Redis 实例实现分布式锁时,对于加锁操作,我们需要满足三个条件。
条件一:客户端从超过半数(大于等于 N/2+1)的 Redis 实例上成功获取到了锁;
条件二:客户端获取锁的总耗时没有超过锁的有效时间。
加锁包括了读取锁变量、检查锁变量值和设置锁变量值三个操作,但需要以原子操作的
方式完成,所以,我们使用 SET 命令带上 NX 选项来实现加锁;
1.
锁变量需要设置过期时间,以免客户端拿到锁后发生异常,导致锁一直无法释放,所
以,我们在 SET 命令执行时加上 EX/PX 选项,设置其过期时间;
2.
锁变量的值需要能区分来自不同客户端的加锁操作,以免在释放锁时,出现误释放操
作,所以,我们使用 SET 命令设置锁变量值时,每个客户端设置的值是一个唯一值,用
于标识客户端。
3.2020/10/28
30 | 如何使用Redis实现分布式锁?
https://time.geekbang.org/column/article/301092?utm_source=time_web&utm_medium=menu&utm_term=timewebmenu
11/14
提建议
和加锁类似,释放锁也包含了读取锁变量值、判断锁变量值和删除锁变量三个操作,不
过,我们无法使用单个命令来实现,所以,我们可以采用 Lua 脚本执行释放锁操作,通过
Redis 原子性地执行 Lua 脚本,来保证释放锁操作的原子性。
不过,基于单个 Redis 实例实现分布式锁时,会面临实例异常或崩溃的情况,这会导致实
例无法提供锁操作,正因为此,Redis 也提供了 Redlock 算法,用来实现基于多个实例的
分布式锁。这样一来,锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存
在的,客户端还是可以完成锁操作。Redlock 算法是实现高可靠分布式锁的一种有效解决
方案,你可以在实际应用中把它用起来。