Redis 的事务

我请教下,Redis 的事务
最新回答
夙词欢

2026-02-03 16:14:25

Redis 的事务

Redis 的事务允许把一组 redis 命令放在一起,把命令进行序列化,然后一起执行。但与 MySQL 的事务相比,Redis 的事务具有一些独特的特点。

一、Redis 事务的基本步骤

  1. 使用 multi 开启事务:

    当执行 multi 命令后,Redis 会将后续的命令逐个放入队列中,而不会立即执行。

    示例图片(multi 命令的执行):

  2. 将要执行的一系列命令放入队列中:

    在 multi 和 exec 之间放入的所有命令都会被序列化,并按顺序执行。

  3. 使用 exec 执行事务:

    当执行 exec 命令时,Redis 会原子化地执行事务队列中的所有命令。

    示例图片(exec 命令的执行):

二、Redis 事务的特性

  • 部分原子性:

    Redis 的事务只能保证命令在队列中的序列化执行,但不能保证整个事务的原子性。

    如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行。

    如果在压队列的过程中正常,但在执行队列中某一个命令时报错,则只会影响本条命令的执行结果,其他命令仍然会正常运行。

  • 不支持回滚:

    与 MySQL 不同,Redis 的事务不支持回滚。即使某个命令执行失败,已经执行的命令也不会被撤销。

    这是因为 Redis 在设计时为了追求更快的运行速度,简化了事务的功能,去除了回滚的能力。

三、Redis 事务的常用命令

  1. multi:

    语法:multi

    功能:用于标记事务块的开始。

    返回值:如果开启成功,则返回 OK。

  2. exec:

    语法:exec

    功能:用来执行事务队列中所有的命令,并恢复正常的连接状态。

    返回值:返回一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。如果使用了 watch 命令且事务执行中止,则返回 Null。

  3. discard:

    语法:discard

    功能:清除所有已经压入队列中的命令,并结束整个事务。

    返回值:清除成功,返回 OK。

    示例图片(discard 命令):

  4. watch:

    语法:watch key [key …]

    功能:监控某一个或多个键,当事务在执行过程中,这些键的值发生变化,则本事务放弃执行。

    返回值:监控成功,返回 OK。

    示例操作(使用 watch 命令):

    开启两个 redis-cli 客户端,一个客户端执行 watch 命令监控某个键。

    另一个客户端修改该键的值。

    回到第一个客户端执行事务,会发现事务因为键的值被修改而中止执行。

    示例图片(watch 命令的使用):

  5. unwatch:

    语法:unwatch

    功能:放弃监控所有的键。

    返回值:清除成功,返回 OK。

    示例图片(unwatch 命令):

四、Redis 事务小结

  1. 单独的隔离操作:

    事务中的所有命令都会序列化、顺序地执行,不会被其他客户端发来的命令请求所打断(除非使用 watch 命令监控某些键)。

  2. 不保证事务的原子性:

    Redis 的事务没有回滚机制,即使某个命令执行失败,已经执行的命令也不会被撤销。这是为了简化功能,确保更快的运行速度。

综上所述,Redis 的事务提供了一种将多个命令序列化执行的方式,但与传统数据库的事务相比,它在原子性和回滚方面有所简化。这种设计使得 Redis 在处理大量数据时能够保持高效性。