Redis 的事务能力是如何体现的?请描述它的实现方式与关键机制。
考察说明
考察候选人对 Redis 事务模型及其实现细节的理解程度。
回答思路
- 【回答框架 1】Redis 支持事务,通过 MULTI、EXEC、DISCARD 和 WATCH 四个命令实现。MULTI 开启事务,后续命令进入队列,EXEC 一次性按顺序执行队列中的全部命令。
- 【回答框架 2】事务执行具有原子性,即 EXEC 时所有命令要么全部执行,要么因某条命令执行出错而中断,但不支持回滚。若命令入队时语法错误,EXEC 会拒绝执行;若运行期出错,仅出错命令失败,其余命令继续。
- 【回答框架 3】WATCH 命令用于实现乐观锁,在 EXEC 前监控一个或多个键,若被监控键在事务执行前被其他客户端修改,则 EXEC 返回空并放弃执行事务,从而提供一定程度的隔离性。
- 【回答框架 4】Redis 事务不保证隔离级别,事务中的命令在 EXEC 前不会真正执行,因此其他客户端无法在事务过程中看到中间状态。事务适合批量执行一组命令,但不应依赖其实现复杂业务强一致性。
- 【回答框架 5】使用 Lua 脚本可以提供更灵活且更原子的多命令执行,且脚本本身作为整体执行,中间不会插入其他命令,可作为事务的替代或补充方案。
- 【关键点 1】Redis 事务由 MULTI、EXEC、DISCARD、WATCH 命令组成。
- 【关键点 2】事务保证执行原子性,但不支持回滚,且不保证持久化。
- 【关键点 3】WATCH 提供乐观锁机制,防止并发修改冲突。
- 【关键点 4】事务中的命令在 EXEC 前入队,不执行。
- 【关键点 5】对于需要更强逻辑控制的操作,可使用 Lua 脚本。
- 【易错点 1】误认为 Redis 事务支持回滚,实际运行期错误不会回滚已执行命令。
- 【易错点 2】事务隔离性较弱,不能依赖其实现严格的并发控制。
- 【易错点 3】WATCH 需要在 EXEC 之前设置,且不支持嵌套事务。