Redis 事务深度解析
候选人小李在美团二面中,面试官问:
"Redis 怎么实现事务?"
小李说:"用 MULTI 和 EXEC。"
面试官追问:"Redis 事务能回滚吗?"
小李说:"...不能吧?"
面试官继续追问:"那 Redis 事务和 MySQL 事务有什么区别?"
小张答不上来了。
【面试官心理】 这道题我用来测试候选人对 Redis 事务机制的理解深度。能说出 MULTI/EXEC 的占 50%,能讲清不能回滚的原因的占 20%,能说清 WATCH 的占 10%。
一、Redis 事务是什么 🔴
1.1 事务命令
1.2 事务执行流程
1.3 ❌ 错误理解
候选人原话:"Redis 事务和 MySQL 事务一样,可以回滚。"
问题诊断:
- Redis 事务不支持回滚
- 如果 EXEC 执行失败,不会回滚已执行的命令
- Redis 选择不支持回滚是为了保持高性能
二、Redis 为什么不支持回滚 🔴
2.1 设计哲学
2.2 事务中的错误
三、WATCH 机制 🔴
3.1 WATCH 的作用
WATCH 实现了乐观锁,在事务执行前检查键是否被修改。
3.2 WATCH 的原理
3.3 WATCH 的特性
四、Pipeline 和事务 🟡
4.1 Pipeline
4.2 Pipeline vs 事务
4.3 Lua 脚本
五、Redis vs MySQL 事务 🟡
5.1 对比表
5.2 Redis 事务的适用场景
六、生产避坑 🟡
6.1 WATCH 导致的死循环
6.2 Pipeline 和事务混用
💡
Redis 事务适合批量操作但不需要回滚的场景。如果需要回滚,使用 Lua 脚本。
【面试官心理】 能说出"Redis 不支持回滚的原因"的候选人,基本都理解 Redis 的设计哲学。这是 P6 的水准。