Redis事务
Redis 事务通过 MULTI/EXEC 将一组命令排队后一次执行。它提供命令队列的顺序执行和隔离执行,但与关系数据库事务的回滚、隔离级别和持久性语义完全不同。
# 1. 学习定位
| 维度 | 内容 |
|---|---|
| 难度层级 | 原子语义 |
| 核心目标 | 先会用,再理解机制,最后能做工程取舍和故障分析 |
| 学习方法 | 带着业务场景看命令、SQL、数据结构、日志和运行时指标 |
# 2. 核心地图
Redis事务
├─ MULTI
├─ EXEC
├─ DISCARD
├─ WATCH
├─ 乐观锁
├─ 命令排队
├─ 原子执行
└─ 无自动回滚
# 3. 小章节深度讲解
下面把核心地图中的每个点拆开讲。每个小节都同时面向开发和运维:开发侧关注怎么设计、怎么写代码、怎么避免错误;运维侧关注怎么监控、怎么定位、怎么恢复。
# 3.1. MULTI
# 是什么
MULTI 属于 Redis 命令执行与可编程能力。Redis 命令通常在主执行路径中串行完成,单个慢命令会影响后续所有请求。
# 开发人员怎么用
开发人员要控制命令复杂度、返回大小和批量规模。Lua 与 Functions 只适合短小原子逻辑,不适合承载复杂业务流程。
# 运维人员怎么看
运维人员要看 SLOWLOG、commandstats、latency monitor 和客户端缓冲区。危险命令要通过 ACL、代理或规范禁止进入主链路。
# 常见风险
常见风险是为了减少网络往返,把过多操作塞进一次 Pipeline 或脚本,结果主线程长时间不可服务。
# 3.2. EXEC
# 是什么
EXEC 属于 Redis 命令执行与可编程能力。Redis 命令通常在主执行路径中串行完成,单个慢命令会影响后续所有请求。
# 开发人员怎么用
开发人员要控制命令复杂度、返回大小和批量规模。Lua 与 Functions 只适合短小原子逻辑,不适合承载复杂业务流程。
# 运维人员怎么看
运维人员要看 SLOWLOG、commandstats、latency monitor 和客户端缓冲区。危险命令要通过 ACL、代理或规范禁止进入主链路。
# 常见风险
常见风险是为了减少网络往返,把过多操作塞进一次 Pipeline 或脚本,结果主线程长时间不可服务。
# 3.3. DISCARD
# 是什么
DISCARD 属于 Redis 事务语义。Redis 事务强调命令排队和顺序执行,但不提供 MySQL 那种自动回滚和隔离级别。
# 开发人员怎么用
开发人员要把事务用于短小、确定的命令组合。需要条件判断时可使用 WATCH 或 Lua,但必须处理失败重试和幂等。
# 运维人员怎么看
运维人员要观察事务中是否包含慢命令、大 key 或跨槽 key。事务本身不会让慢操作变快,反而会让主线程连续执行一组命令。
# 常见风险
常见风险是以为 Redis 事务会在中途命令失败时整体回滚,实际已经执行的命令不会自动撤销。
# 3.4. WATCH
# 是什么
WATCH 属于 Redis 命令执行与可编程能力。Redis 命令通常在主执行路径中串行完成,单个慢命令会影响后续所有请求。
# 开发人员怎么用
开发人员要控制命令复杂度、返回大小和批量规模。Lua 与 Functions 只适合短小原子逻辑,不适合承载复杂业务流程。
# 运维人员怎么看
运维人员要看 SLOWLOG、commandstats、latency monitor 和客户端缓冲区。危险命令要通过 ACL、代理或规范禁止进入主链路。
# 常见风险
常见风险是为了减少网络往返,把过多操作塞进一次 Pipeline 或脚本,结果主线程长时间不可服务。
# 3.5. 乐观锁
# 是什么
乐观锁 属于 Redis 事务语义。Redis 事务强调命令排队和顺序执行,但不提供 MySQL 那种自动回滚和隔离级别。
# 开发人员怎么用
开发人员要把事务用于短小、确定的命令组合。需要条件判断时可使用 WATCH 或 Lua,但必须处理失败重试和幂等。
# 运维人员怎么看
运维人员要观察事务中是否包含慢命令、大 key 或跨槽 key。事务本身不会让慢操作变快,反而会让主线程连续执行一组命令。
# 常见风险
常见风险是以为 Redis 事务会在中途命令失败时整体回滚,实际已经执行的命令不会自动撤销。
# 3.6. 命令排队
# 是什么
命令排队 属于 Redis 命令执行与可编程能力。Redis 命令通常在主执行路径中串行完成,单个慢命令会影响后续所有请求。
# 开发人员怎么用
开发人员要控制命令复杂度、返回大小和批量规模。Lua 与 Functions 只适合短小原子逻辑,不适合承载复杂业务流程。
# 运维人员怎么看
运维人员要看 SLOWLOG、commandstats、latency monitor 和客户端缓冲区。危险命令要通过 ACL、代理或规范禁止进入主链路。
# 常见风险
常见风险是为了减少网络往返,把过多操作塞进一次 Pipeline 或脚本,结果主线程长时间不可服务。
# 3.7. 原子执行
# 是什么
原子执行 属于 Redis 事务语义。Redis 事务强调命令排队和顺序执行,但不提供 MySQL 那种自动回滚和隔离级别。
# 开发人员怎么用
开发人员要把事务用于短小、确定的命令组合。需要条件判断时可使用 WATCH 或 Lua,但必须处理失败重试和幂等。
# 运维人员怎么看
运维人员要观察事务中是否包含慢命令、大 key 或跨槽 key。事务本身不会让慢操作变快,反而会让主线程连续执行一组命令。
# 常见风险
常见风险是以为 Redis 事务会在中途命令失败时整体回滚,实际已经执行的命令不会自动撤销。
# 3.8. 无自动回滚
# 是什么
无自动回滚 属于 Redis 事务语义。Redis 事务强调命令排队和顺序执行,但不提供 MySQL 那种自动回滚和隔离级别。
# 开发人员怎么用
开发人员要把事务用于短小、确定的命令组合。需要条件判断时可使用 WATCH 或 Lua,但必须处理失败重试和幂等。
# 运维人员怎么看
运维人员要观察事务中是否包含慢命令、大 key 或跨槽 key。事务本身不会让慢操作变快,反而会让主线程连续执行一组命令。
# 常见风险
常见风险是以为 Redis 事务会在中途命令失败时整体回滚,实际已经执行的命令不会自动撤销。
# 3.9. 本篇学习实验
建议准备一个独立 Redis 实例,构造小 key、大 key、热点 key、过期 key 和慢命令,观察 INFO、SLOWLOG、LATENCY、内存变化和客户端超时。每个实验都要记录命令复杂度和返回数据量。
开发侧实验重点是理解数据结构和命令边界,运维侧实验重点是理解延迟、内存和复制如何变化。真正掌握本篇内容,应该能从延迟尖刺反推大 key、慢命令、持久化或网络问题。
# 4. 核心机制
MULTI后命令进入队列,EXEC时按顺序执行,执行期间不会穿插其他客户端命令。- Redis 事务中某条命令运行时报错,不会自动回滚前面已执行命令。
WATCH提供乐观锁语义,被监视 key 在 EXEC 前被修改则事务失败。- 复杂条件原子逻辑通常更适合 Lua 脚本。
# 5. 工程实践
- 简单多命令批量执行可使用事务。
- 需要检查再更新的乐观并发场景可用 WATCH,但高竞争下重试成本高。
- 库存扣减、锁释放等逻辑更常用 Lua 保证原子判断和修改。
- 不要把 Redis 事务当 MySQL 事务使用。
# 6. 常见坑
- 以为 EXEC 中某条失败会回滚全部命令。
- WATCH key 过多,高并发下事务频繁失败。
- 事务里放入慢命令,阻塞其他客户端。
- 跨 Redis Cluster 槽执行多 key 事务失败。
# 7. 专家视角
- Redis 事务提供的是命令串行执行语义,不是 ACID 数据库事务。
- 专家会根据竞争强度选择 WATCH、Lua 或业务幂等重试。
- 事务和脚本都不能忽略命令复杂度,原子不等于免费。
# 8. Tips 快问快答
Q:Redis 事务会回滚吗?
A:不会像 MySQL 那样自动回滚已执行命令。
Q:WATCH 是什么?
A:一种乐观锁机制,监视 key 被改动后 EXEC 会失败。
Q:事务和 Lua 怎么选?
A:简单排队用事务,复杂条件原子修改通常用 Lua。
# 9. 阶段小结
Redis事务 的学习重点不是记住零散概念,而是把它放回真实系统:数据如何进入、如何存储、如何被查询、如何在并发下保持正确、如何在故障后恢复。掌握这些连接关系,才能从“会用”走向“能设计、能优化、能排障”。