星海

Redis · 单选题 · 第 45 题

Java 后端开发面试 · 第 45 题

用 Redis 实现分布式锁时,常写 SET lock_key <唯一值> NX PX 30000,下列理解正确的是?

  1. A先执行 SETNX,再单独执行一条 EXPIRE 设置过期时间,效果和这一条命令完全一样,也是原子的
  2. B值写成什么都可以,释放锁时直接 DEL 就行,不会误删其他客户端加的锁
  3. C只有 key 不存在时才设置成功,并原子地带上过期时间,防止持锁者宕机后锁永不释放
  4. D加上 PX 参数以后,锁会在业务执行完毕时自动释放,不需要再手动释放锁

答案

C C. 只有 key 不存在时才设置成功,并原子地带上过期时间,防止持锁者宕机后锁永不释放

解析

SETNX 和 EXPIRE 分两步执行时,中间宕机就会留下一把永不过期的锁,所以要用一条 SET 命令原子完成。值要用唯一 ID,释放时用 Lua 脚本先比较值再删除,避免锁过期后误删别人的锁。业务执行时间可能超过过期时间,可以用看门狗续期,比如 Redisson 的实现。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。