Redis · 主观题 · 第 49 题
Java 后端开发面试 · 第 49 题
用 Redis 实现分布式锁要注意哪些问题?
参考答案
1. 加锁要原子:使用 SET key uniqueValue NX PX ttl,不要把 SETNX 和 EXPIRE 分开执行。
2. 必须设置过期时间,防止持锁的进程宕机后锁永不释放。
3. 释放要校验:值用 UUID 加线程 ID 等唯一标识,释放时用 Lua 脚本先比较值、相等才删除,防止锁过期后误删别人的锁。
4. 续期:业务执行时间可能超过 TTL,可以用看门狗定期延长(Redisson 默认 30 秒,每 10 秒续一次)。
5. 可重入:用 Hash 结构记录持有者和重入次数。
6. 主从切换丢锁:主节点加锁后还没同步到从节点就宕机,新主节点上没有这把锁。可以用 Redlock(多数派加锁,但有争议),强一致场景改用 ZooKeeper 或 etcd。
7. 防止过期后旧持有者继续写:使用 fencing token(单调递增的令牌),由存储端校验。
解析
原子加锁、校验释放、续期、主从问题四点是必答。