如何在 Redis 中运行事务

介绍

Redis是一个开源的,内存中的关键值数据存储器。Redis允许您计划一个命令序列并运行它们一个接一个,一个被称为 transaction 的程序。

本教程讨论如何执行和取消交易,并提供有关通常与交易相关的陷阱的信息。

如何使用此指南

这个指南是写成一个骗局的表,包含自含的示例,我们鼓励你跳到任何与你试图完成的任务相关的部分。

在本指南中显示的命令在运行 Redis 版本 6.0.1 版本的 Ubuntu 22.04 服务器上进行了测试。 要设置类似的环境,您可以遵循我们指南中的 Step 1How To Install and Secure Redis on Ubuntu 22.04 上进行测试。 我们将通过使用 Redis 命令行接口的 redis-cli 来演示这些命令的行为。 如果您使用不同的 Redis 接口 - 例如 - 某些命令的准确输出可能会有所不同。

或者,您可以提供一个受管理的 Redis 数据库实例来测试这些命令,但取决于数据库提供商允许的控制水平,本指南中的一些命令可能无法按描述的方式工作。 要提供 DigitalOcean 受管理数据库,请遵循我们的 管理数据库产品文档

运行交易

multi命令告诉Redis开始一个交易块,任何后续命令都将排队,直到你运行一个exec命令,这将执行它们。

下列命令组成一个单一的交易块:第一个命令启动了交易,第二个命令设置了一个持有值为1的字符串的密钥,第三个命令增加了值为1,第四个命令增加了价值为40,第五个命令返回了字符串的当前值,最后一个命令执行了交易块:

1multi
2set key_MeaningOfLife 1
3incr key_MeaningOfLife
4incrby key_MeaningOfLife 40
5get key_MeaningOfLife
6exec

執行「multi」後,redis-cli 會以「QUEUED」回應下列每個命令,執行「exec」命令後,它會顯示每個命令的輸出個別:

1[secondary_label Output]
21) OK
32) (integer) 2
43) (integer) 42
54) "42"

在交易区块中包含的命令以排序顺序运行。Redis交易是_atomic_,这意味着交易区块中的每个命令都被处理(被接受为有效且排序执行)或没有任何命令。

取消交易

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

1multi
2set key_A 146
3incrby key_A 10
4discard
1[secondary_label Output]
2OK

discard命令将连接返回正常状态,告诉 Redis 像往常一样运行单个命令.您需要再次运行multi来告诉服务器您正在启动另一个交易。

了解交易错误

有些命令无法排队,例如具有语法错误的命令. 如果您尝试排队一个语法错误的命令,Redis将返回错误。

下面的交易会创建一个名为key_A的密钥,然后试图将其增加到10

1multi
2set key_A 146
3incrbuy key_A 10
1[secondary_label Output]
2(error) ERR unknown command 'incrbuy'

如果您尝试运行exec命令,然后尝试排队命令,如本示例中的语法错误,您将收到另一个错误消息,告诉您交易被抛弃:

1exec
1[secondary_label Output]
2(error) EXECABORT Transaction discarded because of previous errors.

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

有些不可能的命令是可以排队的,例如在只包含一个字符串的密钥上运行incr。由于这样的命令是语法正确的,如果您尝试将其列入交易中,Redis不会返回错误,并且不会阻止您运行exec

1multi
2set key_A 146
3incrby key_A "ten"
4exec
1[secondary_label Output]
21) OK
32) (error) ERR value is not an integer or out of range

有关Redis如何处理交易内部错误的更多信息,请参阅有关此事的官方文档(https://redis.io/docs/manual/transactions/)。

结论

本指南详细介绍了一些用于在 Redis 中创建、运行和取消交易的命令. 如果在本指南中您想要了解的其他相关命令、论点或程序,请在评论中询问或提出建议。

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

Published At
Categories with 技术
comments powered by Disqus