管道与事务

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

Redis 允许您将一系列命令一起批量发送到服务器。您可以使用两种类型的批量处理方式

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

执行管道

要在管道中执行命令,首先需要创建一个管道对象,然后使用类似于标准命令方法(例如,set()get())的方法向其添加命令。命令在管道中进行缓冲,并且仅在您调用管道对象的 execute() 方法时执行。此方法返回一个列表,其中按顺序包含所有命令的结果。

请注意,管道的命令方法总是返回原始管道对象,因此您可以“链式”调用多个命令,如下面的示例所示

执行事务

默认情况下,管道实际上会作为一个事务执行(也就是说,所有命令都在一个不间断的序列中执行)。但是,如果您需要关闭此行为,可以在创建管道时将 transaction 参数设置为 False

pipe = r.pipeline(transaction=False)

监视键以检测更改

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

下面的示例展示了如何重复尝试对监视的键执行事务,直到成功为止。代码读取表示命令 shell 的 PATH 变量的字符串,然后在尝试写回之前向字符串附加新的命令路径。如果在写入之前监视的键被另一个客户端修改,事务将中止并抛出 WatchError 异常,然后循环再次执行以进行另一次尝试。否则,循环将成功终止。

由于这是一个常见的模式,该库包含一个名为 transaction() 的便捷方法,用于处理监视键、执行事务以及在必要时重试的代码。将实现您的主要事务代码的函数以及要监视的键传递给 transaction() 方法。下面的示例实现了与前一个示例相同的基础事务,但这回使用了 transaction()。请注意,transaction() 无法自动添加 multi() 调用,因此您仍然必须将其正确地放置在您的事务函数中。

评价此页面
返回顶部 ↑