Redis 加锁用 SET NX PX,别用 SETNX + EXPIRE
SET lock:order:42 token-A NX PX 30000 # OK:拿到锁
SET lock:order:42 token-B NX PX 30000 # (nil):已被占,不报错NX 是不存在才写,PX / EX 是过期时间(毫秒 / 秒),一条命令原子完成。
老写法的问题:
SETNX lock:order:42 token-A # 返回 1 / 0,不能带过期时间
EXPIRE lock:order:42 30 # 要再补一条两条命令之间进程崩了,这把锁就永远不会过期。
value 别写死成 1,要写一个能标明「是谁加的」的随机 token,释放时要用到它。