管道和事务

了解如何使用 Redis 管道和事务

Redis 允许您将一系列命令批量发送到服务器。您可以使用两种类型的批量操作:

  • 管道 通过在一次通信中将多个命令一起发送到服务器,避免了网络和处理开销。然后服务器会发送回包含所有响应的单次通信。有关更多信息,请参阅管道页面。
  • 事务 保证所有包含的命令将完整执行,不会被其他客户端的命令中断。有关更多信息,请参阅事务页面。

执行管道

要在管道中执行命令,首先创建管道对象,然后使用类似于标准命令方法(例如,Set()Get())的方法将命令添加到其中。命令在管道中缓冲,只有在您调用管道对象的 Exec() 方法时才会执行。

管道命令的主要区别在于,它们的返回值只有在管道执行完成后才包含有效结果。您可以使用 Val() 方法而不是 Result() 来访问结果(注意,错误由 Exec() 方法报告,而不是由单个命令报告)。

您还可以使用 Pipelined() 方法创建管道。它会在您提供的回调函数中执行管道命令,并在返回后自动调用 Exec()

执行事务

事务的工作方式类似于管道。使用 TxPipeline() 方法创建一个事务对象,在该对象上调用命令方法,然后调用事务对象的 Exec() 方法来执行它。事务完成后,您可以使用 Val() 方法访问事务中命令的结果。

还有一个 TxPipelined() 方法,其工作方式类似于上面描述的 Pipelined()

监视键的更改

Redis 支持乐观锁定,以避免对不同键进行不一致的更新。基本思想是,在处理更新时,监视事务中使用的任何键的更改。如果被监视的键确实发生更改,则必须使用键中的最新数据重新开始更新。有关乐观锁定的更多信息,请参阅事务

下面的代码读取一个表示命令 shell 的 PATH 变量的字符串,然后将新的命令路径附加到该字符串,再尝试将其写回。如果在写入之前被监视的键被另一个客户端修改,则事务将中止。Watch() 方法接收一个回调函数,您可以在其中执行要监视的命令。在此回调的主体中,您可以使用通常的客户端对象(在我们的示例中称为 rdb)在事务之前执行只读命令并立即获得结果。通过在传递给回调的 Tx 对象上调用 TxPipeline()TxPipelined() 来启动事务本身。Watch() 还在回调之后接收一个或多个表示要监视的键的 string 参数。

在生产环境中,您通常会在循环中调用类似下面的代码,以重试直到成功,或者报告或记录失败。

评价此页面
回到顶部 ↑