Redis分布式锁需闭环管理生命周期:加锁用SET key value NX EX seconds保证原子性,value为唯一标识;解锁用Lua脚本校验再删;设合理过期时间并启用Watch Dog续期;高可用依赖哨兵/集群,强一致场景用RedLock。
Redis 分布式锁不是“加个 SETNX 就完事”,真正落地时,死锁、误删锁、锁提前释放等问题频发。核心不在命令本身,而在锁的生命周期管理是否闭环——从加锁原子性、持有身份校验、超时控制,到故障恢复和集群一致性,缺一不可。
只用 SETNX 或分开执行 SET + EXPIRE 是危险的:前者不支持设置过期时间,后者非原子,可能键设成功但过期没设上,导致永久锁死。
SET key value NX EX seconds,一步完成“存在则失败 + 值写入 + 过期设定”先 GET 再 DEL 是典型并发漏洞:GET 到自己的 value,刚要 DEL 时锁已过期,别人抢锁成功,你 DEL 的其实是别人的锁。
if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end
锁过期时间短于业务实际耗时,会导致锁自动释放后别人加锁成功,原线程继续执行并释放新锁——数据错乱由此产生。
过期时间 / 3 检查一次锁归属,若仍属自身则用 EXPIRE 重置过期时间单点 Redis 宕机,所有锁服务瘫痪;主从异步复制下主节点崩溃未同步锁,从节点升主后锁丢失——两种情况都会引发并发失控。