面试题答案
一键面试方案一:使用SET命令替代SETNX与EXPIRE组合
- 优点:
- 原子性操作,避免了SETNX成功但EXPIRE失败的情况,因为SET命令可以在设置键值对的同时设置过期时间,如
SET key value EX seconds NX
,一条命令完成所有操作,不会出现死锁问题。 - 简化代码逻辑,不需要分两步操作,代码实现更简洁。
- 原子性操作,避免了SETNX成功但EXPIRE失败的情况,因为SET命令可以在设置键值对的同时设置过期时间,如
- 缺点:
- 部分旧版本Redis可能不支持这种复合SET命令的写法,兼容性有一定局限。
方案二:使用Lua脚本
- 优点:
- 保证原子性,Lua脚本在Redis中执行是原子性的,可以将SETNX和EXPIRE操作放在一个Lua脚本中执行,确保要么都成功,要么都失败,有效避免死锁。
- 灵活性高,Lua脚本可以包含复杂的逻辑,例如可以在脚本中添加更多的业务逻辑判断。
- 缺点:
- 增加了代码复杂度,编写和调试Lua脚本相对普通Redis命令更复杂,对开发人员要求较高。
- 维护成本略有上升,需要额外关注Lua脚本的语法、逻辑以及与其他业务代码的集成。