Redis

Redis 加锁用 SET NX PX,别用 SETNX + EXPIRE

shell
SET lock:order:42 token-A NX PX 30000   # OK:拿到锁
SET lock:order:42 token-B NX PX 30000   # (nil):已被占,不报错

NX 是不存在才写,PX / EX 是过期时间(毫秒 / 秒),一条命令原子完成。

老写法的问题:

shell
SETNX lock:order:42 token-A   # 返回 1 / 0,不能带过期时间
EXPIRE lock:order:42 30       # 要再补一条

两条命令之间进程崩了,这把锁就永远不会过期。

value 别写死成 1,要写一个能标明「是谁加的」的随机 token,释放时要用到它。

esc