如何使用 Redis 实现分布式锁
锁是我们在设计和实现大多数系统时绕不过的话题。一旦有竞争条件出现,在没有保护的操作的前提下,可能会出现不可预知的问题。 而现代系统大多为分布式系统,这就引入了分布式锁,要求具有在分布各处的服务上保护资源的能力。 而实现分布式锁,目前大多有以下三种方式: 使用数据库实现。 使用 Redis 等缓存系统实现。 使用 Zookeeper 等分布式协调系统实现。 其中 Redis 简便灵活,高可用分布式,且支持持久化。本文即介绍基于 Redis 实现分布式锁。 SETNX 语义 使用 Redis 实现分布式锁,根本原理是 SETNX 指令。其语义如下: SETNX key value 命令执行时,如果 key 不存在,则设置 key 值为 value(同set);如果 key 已经存在,则不执行赋值操作。并使用不同的返回值标识。命令描述文档 还可以通过 SET 命令的 NX 选项使用: SET key value [expiration EX seconds|PX milliseconds] [NX|XX] NX - 仅在 key 不存在时执行赋值操作。命令描述文档 而如下文所述,通过SET的NX选项使用,可同时使用其它选项,如EX/PX设置超时时间,是更好的方式。 SETNX 实现分布式锁 下面我们对比下几种具体实现方式。 方案1:SETNX + delete 伪代码如下: setnx