(书)如何管理redis数据库-10.如何在Redis中运行事务

介绍

Redis是一个开源的内存中键值数据存储。Redis允许您计划一系列命令,然后一个接一个地运行它们,这一过程称为_transaction_。每个事务都被视为不间断且隔离的操作,以确保数据完整性。在执行事务块时,客户端无法运行命令

本教程介绍了如何执行和取消交易,还包括一些与交易通常相关的陷阱的信息。

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行Redis版本的Ubuntu 18.04服务器上进行了测试 4.0.9。要设置类似的环境,您可以按照我们的指南如何在Ubuntu 18.04上安装和保护Redis的步骤1进行操作。我们将通过使用Redis命令行界面运行它们来演示这些命令的行为。请注意,如果您使用其他Redis界面(例如Redli),则某些命令的确切输出可能会有所不同。redis-cli

另外,您可以提供一个托管的Redis数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置DigitalOcean托管数据库,请遵循我们的托管数据库产品文档。然后,您必须 安装Redli  设置TLS隧道才能通过TLS连接到托管数据库。

进行交易

multi命令告诉Redis开始事务块。在运行exec命令之前,所有后续命令都将排队等待执行。

以下命令形成一个事务块。第一个命令启动事务,第二个命令设置一个包含值的字符串的键1,第三个命令将值增加1,第四个命令将其值增加40,第五个命令返回字符串的当前值,最后一个返回执行事务块:

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

运行后multiredis-cli将使用响应以下每个命令QUEUED。运行exec命令后,它将分别显示每个命令的输出:

Output

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

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

取消交易

要取消交易,请运行discard命令。这样可以防止任何先前排队的命令运行:

  * multi 
  * set key_A 146 
  * incrby key_A 10 
  * discard 


Output

OK 

discard命令将连接返回到正常状态,该状态告诉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中创建,运行和取消事务的命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。