Redis 事务是一种将多个命令打包然后一次性、顺序地执行的机制,这一系列操作要么都执行,要么都不执行,保证了一组操作的原子性(Atomicity)。但不同于关系型数据库中的事务,Redis 事务不支持回滚(rollback),如果事务队列中的某个命令执行失败,Redis 会继续执行队列中的其他命令。
Redis 事务的实现主要依赖以下三个关键命令:
-
MULTI
:这个命令用于标记一个事务的开始。发送后续的命令不会立即执行,而是会加入到一个队列中。这些命令会被序列化,并且按照发送的顺序执行。 -
EXEC
:执行所有在MULTI
之后发送到服务器的命令。当客户端发送EXEC
命令后,所有队列中的命令会原子性地执行。如果客户端连接在发送EXEC
之前断开,事务中的所有命令都不会执行。 -
DISCARD
:这个命令用于取消一个事务。如果在执行EXEC
命令前调用DISCARD
,那么所有已经入队的命令都会被丢弃,事务也会结束。
事务的执行过程如下:
-
客户端发送
MULTI
命令开始一个事务。 -
客户端发送任意多个命令,这些命令不会被立即执行,而是被放入一个队列中。
-
客户端发送
EXEC
命令,服务器执行所有队列中的命令。 -
命令按照它们被添加到队列中的顺序执行。
-
若执行过程中遇到错误,命令可能会返回错误。对于语法错误,Redis 会在
EXEC
前就检测到并回复错误,事务被打断不会执行。对于运行时错误(比如运行命令时的数据类型不匹配),Redis 仍然会继续执行后续的命令。
需要注意的是,Redis 事务不保证隔离性(Isolation),在事务执行期间,其他客户端发送的命令可能会在事务命令之间执行。此外,事务也不提供持久性(Durability)保证,因为 Redis 持久化策略依赖于配置的 RDB 或 AOF 机制。
事务的常见用途包括:
- 一次性执行多个命令;
- 保证一组命令的原子性执行,防止其他客户端在事务执行期间插入命令。