← 返回首页

如何用 Redis 实现分布式锁?要注意什么?

基本命令:SET key value NX EX seconds (NX=不存在才设,EX=过期时间)。必须保证这两个动作是原子的。

关键问题与解决:

死锁问题:如果持有锁的进程挂了,锁无法释放。

解法:设置过期时间(TTL)。

误删锁问题:A 线程持锁,但执行超时自动释放了;B 线程拿到锁。A 执行完后误删了 B 的锁。

解法:Value 设置为唯一标识(如 UUID+线程ID),删除时用 Lua 脚本判断“Value 是否匹配”再删除。

锁续期问题:业务执行时间超过 TTL 怎么办?

解法:使用 Redisson 框架,它实现了 WatchDog (看门狗) 机制,自动给锁续期,直到业务完成。

主从切换导致锁丢失:主节点拿到锁还没同步到从节点就挂了,从升主,锁丢失。

解法:使用 RedLock 算法(向多数派节点申请锁),但在高可用要求极高场景下,建议使用 Zookeeper 实现分布式锁(CP 模型,更强一致性)