2026-02-03 16:14:25
Redis 的事务
Redis 的事务允许把一组 redis 命令放在一起,把命令进行序列化,然后一起执行。但与 MySQL 的事务相比,Redis 的事务具有一些独特的特点。
一、Redis 事务的基本步骤
使用 multi 开启事务:
当执行 multi 命令后,Redis 会将后续的命令逐个放入队列中,而不会立即执行。
示例图片(multi 命令的执行):

将要执行的一系列命令放入队列中:
在 multi 和 exec 之间放入的所有命令都会被序列化,并按顺序执行。
使用 exec 执行事务:
当执行 exec 命令时,Redis 会原子化地执行事务队列中的所有命令。
示例图片(exec 命令的执行):

二、Redis 事务的特性
部分原子性:
Redis 的事务只能保证命令在队列中的序列化执行,但不能保证整个事务的原子性。
如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行。
如果在压队列的过程中正常,但在执行队列中某一个命令时报错,则只会影响本条命令的执行结果,其他命令仍然会正常运行。
不支持回滚:
与 MySQL 不同,Redis 的事务不支持回滚。即使某个命令执行失败,已经执行的命令也不会被撤销。
这是因为 Redis 在设计时为了追求更快的运行速度,简化了事务的功能,去除了回滚的能力。
三、Redis 事务的常用命令
multi:
语法:multi
功能:用于标记事务块的开始。
返回值:如果开启成功,则返回 OK。
exec:
语法:exec
功能:用来执行事务队列中所有的命令,并恢复正常的连接状态。
返回值:返回一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。如果使用了 watch 命令且事务执行中止,则返回 Null。
discard:
语法:discard
功能:清除所有已经压入队列中的命令,并结束整个事务。
返回值:清除成功,返回 OK。
示例图片(discard 命令):

watch:
语法:watch key [key …]
功能:监控某一个或多个键,当事务在执行过程中,这些键的值发生变化,则本事务放弃执行。
返回值:监控成功,返回 OK。
示例操作(使用 watch 命令):
开启两个 redis-cli 客户端,一个客户端执行 watch 命令监控某个键。
另一个客户端修改该键的值。
回到第一个客户端执行事务,会发现事务因为键的值被修改而中止执行。
示例图片(watch 命令的使用):


unwatch:
语法:unwatch
功能:放弃监控所有的键。
返回值:清除成功,返回 OK。
示例图片(unwatch 命令):

四、Redis 事务小结
单独的隔离操作:
事务中的所有命令都会序列化、顺序地执行,不会被其他客户端发来的命令请求所打断(除非使用 watch 命令监控某些键)。
不保证事务的原子性:
Redis 的事务没有回滚机制,即使某个命令执行失败,已经执行的命令也不会被撤销。这是为了简化功能,确保更快的运行速度。
综上所述,Redis 的事务提供了一种将多个命令序列化执行的方式,但与传统数据库的事务相比,它在原子性和回滚方面有所简化。这种设计使得 Redis 在处理大量数据时能够保持高效性。