管道与事务

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

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

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

执行管道

要在管道中执行命令,首先创建一个管道对象,然后使用类似于标准命令方法(例如 set()get())的方法向其添加命令。命令在管道中进行缓冲,仅在调用管道对象的 sync() 方法时执行。

与管道命令的主要区别在于它们返回 Response<Type> 对象,其中 Type 是标准命令方法的返回类型。Response 对象仅在管道执行完成后包含有效结果。您可以使用 Response 对象的 get() 方法访问结果。

执行事务

事务的工作方式类似于管道。使用 multi() 命令创建一个事务对象,在该对象上调用命令方法,然后调用事务对象的 exec() 方法来执行它。您可以使用 Response 对象访问事务中命令的结果,就像使用管道一样。然而,exec() 方法也返回一个 List<Object> 值,其中包含按命令执行顺序排列的所有结果值(请参阅下面的监视键的更改以获取使用结果列表的示例)。

监视键的更改

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

下面的代码读取一个表示命令 shell 的 PATH 变量的字符串,然后在尝试写回之前将新的命令路径追加到该字符串。如果在写入之前被其他客户端修改了监视的键,则事务会中止。请注意,您应该在常规客户端对象(在我们的示例中称为 jedis)上同步调用监视键的只读命令,但仍然在事务对象上调用事务命令。

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

评价此页面
返回顶部 ↑