Redis 事务的本质
Redis 事务本质上是一组命令的集合。在 Redis 中,一个事务里的所有命令都会被序列化,并按照发起的顺序依次执行。这意味着事务具有一次性、顺序性和排他性。不过要注意,Redis 事务并没有数据库那种隔离级别的概念。
虽然 Redis 单条命令的执行是原子的,但整个事务并不保证原子性。如果事务执行过程中某条命令报错,后续命令依然会执行,只是不会回滚之前的成功操作。
核心命令流程
开发中最常用的流程通常是三步走:
- 开启事务:使用
MULTI命令。 - 命令入队:将需要执行的命令加入队列。
- 执行事务:使用
EXEC提交。
MULTI
SET k1 v1
SET k2 v2
GET k2
EXEC
上面的示例中,MULTI 之后所有的命令都会进入等待状态,直到 EXEC 触发才真正执行。返回结果会按顺序列出每条命令的输出。
放弃事务
有时候我们可能中途改变主意,不想执行刚才入队的命令了,这时候可以用 DISCARD。
MULTI
SET k1 v1
SET k2 v2
DISCARD
执行 DISCARD 后,队列清空,之前的命令都不会生效。
乐观锁与 WATCH
Redis 事务本身不支持悲观锁,但可以通过 WATCH 命令配合事务来实现乐观锁机制。它的逻辑是:在执行更新前检查数据是否被其他人修改过。
典型的使用场景是扣款操作。我们需要先监视金额字段,确认没人动过它再开始事务。
WATCH money
MULTI
DECRBY money 20
INCRBY out 20
EXEC
如果在 MULTI 之前有人修改了 money,那么 EXEC 时会返回 nil,表示事务失败,你需要重新尝试。这种机制非常适合处理高并发下的资源竞争问题。

