Redis · 单选题 · 第 45 题
Java 后端开发面试 · 第 45 题
用 Redis 实现分布式锁时,常写 SET lock_key <唯一值> NX PX 30000,下列理解正确的是?
- A先执行 SETNX,再单独执行一条 EXPIRE 设置过期时间,效果和这一条命令完全一样,也是原子的
- B值写成什么都可以,释放锁时直接 DEL 就行,不会误删其他客户端加的锁
- C只有 key 不存在时才设置成功,并原子地带上过期时间,防止持锁者宕机后锁永不释放
- D加上 PX 参数以后,锁会在业务执行完毕时自动释放,不需要再手动释放锁
答案
C C. 只有 key 不存在时才设置成功,并原子地带上过期时间,防止持锁者宕机后锁永不释放
解析
SETNX 和 EXPIRE 分两步执行时,中间宕机就会留下一把永不过期的锁,所以要用一条 SET 命令原子完成。值要用唯一 ID,释放时用 Lua 脚本先比较值再删除,避免锁过期后误删别人的锁。业务执行时间可能超过过期时间,可以用看门狗续期,比如 Redisson 的实现。