引言

Redis 是一个开源的、内存中的键值数据存储。 Redis 允许您计划一系列命令并一个接一个地运行它们,这个过程称为事务。 每个事务都被视为一个不间断的、独立的操作,从而确保了数据的完整性。 在执行事务块时,客户端不能运行命令

本教程将介绍如何执行和取消事务,还包括一些关于通常与事务相关的缺陷的信息。

如何使用本指南

本指南是作为包含自包含示例的备忘单编写的。 我们鼓励您跳转到任何与您正在尝试完成的任务相关的部分。

本指南中显示的命令是在运行 Redis 4.0.9版本的 Ubuntu 18.04服务器上测试的。 要建立一个类似的环境,你可以按照我们关于如何在 Ubuntu 18.04上安装和保护 Redis 的指南的第一步。 我们将通过使用 Redis-cli (Redis 命令行界面)运行这些命令来演示它们的行为。 请注意,如果您使用的是不同的 Redis 接口ーー例如 Redli ーー某些命令的确切输出可能会有所不同。

或者,您可以提供一个托管 Redis 数据库实例来测试这些命令,但是请注意,根据您的数据库提供程序所允许的控制级别,本指南中的某些命令可能不能像描述的那样工作。 要提供一个数字数据库管理数据库,请遵循我们的管理数据库产品文档。 然后,必须安装 Redli 或设置 TLS 通道,以便通过 TLS 连接到托管数据库。

运行事务

Multi 命令告诉 Redis 开始一个事务块。 在运行 exec 命令之前,任何后续命令都将排队,exec 命令将执行这些命令。

下列命令组成单个事务块。 第一个命令启动事务,第二个设置一个保存值为1的字符串的键,第三个增加值为1,第四个增加值为40,第五个返回字符串的当前值,最后一个执行事务块:

  • multi
  • set key_MeaningOfLife 1
  • incr key_MeaningOfLife
  • incrby key_MeaningOfLife 40
  • get key_MeaningOfLife
  • exec

运行 multi 之后,redis-cli 将使用 QUEUED 响应以下每个命令。 运行 exec 命令后,它将单独显示每个命令的输出:

Output
1) OK 2) (integer) 2 3) (integer) 42 4) "42"

事务块中包含的命令按照它们排队的顺序顺序运行。 Redis 事务是原子的,这意味着要么处理事务块中的每个命令(意味着它被接受为有效并排队等待执行) ,要么不处理。 但是,即使命令成功排队,在执行时仍可能产生错误。 在这种情况下,事务中的其他命令仍然可以运行,但 Redis 将跳过导致错误的命令。 有关更多详细信息,请参阅了解事务错误一节。

取消交易

若要取消事务,请运行“丢弃”命令。这可以防止任何以前排队的命令运行:

  • multi
  • set key_A 146
  • incrby key_A 10
  • discard
Output
OK

“丢弃”命令将连接返回到正常状态,这告诉 Redis 像往常一样运行单个命令。 您需要再次运行 multi 来告诉服务器您正在启动另一个事务。

理解交易错误

有些命令可能无法排队,例如语法错误的命令。 如果尝试将语法不正确的命令排入队列,Redis 将返回错误。

下面的事务创建一个名为 key a 的密钥,然后尝试将其增加10。 但是,incrby 命令中的拼写错误将导致并关闭事务:

  • multi
  • set key_A 146
  • incrbuy key_A 10
Output
(error) ERR unknown command 'incrbuy'

如果您在尝试将带有语法错误的命令排队后尝试运行 exec 命令,您将收到另一条错误消息,告诉您事务已被丢弃:

  • exec
Output
(error) EXECABORT Transaction discarded because of previous errors.

在这种情况下,您需要重新启动事务块,并确保正确地输入每个命令。

一些不可能的命令可以用于队列,例如对只包含字符串的密钥运行 incr。 因为这样的命令在语法上是正确的,所以如果您试图将它包含在事务中,Redis 不会返回错误,也不会阻止您运行 exec。 在这种情况下,队列中的所有其他命令都会被执行,但是不可能的命令会返回一个错误:

  • multi
  • set key_A 146
  • incrby key_A "ten"
  • exec
Output
1) OK 2) (error) ERR value is not an integer or out of range

有关 Redis 如何处理事务内部错误的更多信息,请参见关于这个主题的官方文档。

总结

本指南详细介绍了在 Redis 用于创建、运行和取消事务的许多命令。 如果还有其他相关的命令、参数或者程序你想在本指南中看到,请在下面的评论中询问或者提出建议。

有关 Redis 命令的更多信息,请参见我们关于如何管理 Redis 数据库的系列教程。