MST

星途 面试题库

面试题:如何在Redis中优化SETNX与EXPIRE组合的分布式锁以避免常见缺陷

已知SETNX与EXPIRE组合实现分布式锁存在缺陷,例如在SETNX成功后EXPIRE设置失败可能导致死锁等情况。请说明至少两种优化方案,并分析每种方案的优缺点。
42.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

方案一:使用SET命令替代SETNX与EXPIRE组合

  • 优点
    • 原子性操作,避免了SETNX成功但EXPIRE失败的情况,因为SET命令可以在设置键值对的同时设置过期时间,如 SET key value EX seconds NX,一条命令完成所有操作,不会出现死锁问题。
    • 简化代码逻辑,不需要分两步操作,代码实现更简洁。
  • 缺点
    • 部分旧版本Redis可能不支持这种复合SET命令的写法,兼容性有一定局限。

方案二:使用Lua脚本

  • 优点
    • 保证原子性,Lua脚本在Redis中执行是原子性的,可以将SETNX和EXPIRE操作放在一个Lua脚本中执行,确保要么都成功,要么都失败,有效避免死锁。
    • 灵活性高,Lua脚本可以包含复杂的逻辑,例如可以在脚本中添加更多的业务逻辑判断。
  • 缺点
    • 增加了代码复杂度,编写和调试Lua脚本相对普通Redis命令更复杂,对开发人员要求较高。
    • 维护成本略有上升,需要额外关注Lua脚本的语法、逻辑以及与其他业务代码的集成。